2017-09-01 3 views
1

J'ai une fonction générale, j'ai fourni un exemple ci-dessous si simple régression linéaire:pendant optim()

x = 1:30 
y = 0.7 * x + 32 
Data = rnorm(30, mean = y, sd = 2.5); 

lin = function(pars = c(grad,cons)) { 
    expec = pars[1] * x + pars[2]; 
    SSE = sum((Data - expec)^2) 
    return(SSE) 
} 

start_vals = c(0.2,10) 
lin(start_vals) 
estimates = optim(par = start_vals, fn = lin); 

## plot the data 
Fit = estimates$par[1] * x + estimates$par[2] 
plot(x,Data) 
lines(x, Fit, col = "red") 

C'est donc simple. Ce que je veux, c'est stocker l'attente pour le dernier ensemble de paramètres, de sorte qu'une fois que j'ai fini d'optimiser je peux les voir. Je l'ai essayé d'utiliser un conteneur global et d'essayer de le peuplant si la fonction est exécutée, mais il ne fonctionne pas, par exemple

Expectation = c(); 
lin = function(pars = c(grad,cons)) { 
    expec = pars[1] * x + pars[2]; 
    Expectation = expec; 
    SSE = sum((Data - expec)^2) 
    return(SSE) 
} 

start_vals = c(0.2,10) 
estimates = optim(par = start_vals, fn = lin); 
Expectation ## print the expectation that would relate to estimates$par 

Je sais que cela est trivial à faire en dehors de la fonction, mais mon problème réel (qui est analogue à ceci) est beaucoup plus complexe. Fondamentalement, j'ai besoin de renvoyer des informations internes qui ne peuvent pas être calculées rétrospectivement. Toute aide est très appréciée.

Répondre

1

vous devez utiliser <<- au lieu de = dans votre fonction lin, Expectation <<- expec, les opérateurs <<- et ->> sont normalement utilisés dans les fonctions et faire une recherche à effectuer dans des environnements de parents pour une définition existante de la variable assignée.