1

I am minimizing this function below using the optim function, which works really well. My only problem is that I can't save the W matrix, I am computing inside the function when minimizing. Is there a way to save the W matrix somehow?

W<-c()
GMM_1_stage <- function(beta) {for (i in 1:(nrow(gmm_i))){
  gmm_i[i,]=g_beta(i,beta)}
  gmm_N=t(colSums(gmm_i))%*%colSums(gmm_i) 
  W<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i) 
  return(gmm_N)
}
GMM_1<-optim(beta_MLE,GMM_1_stage)

Best regards

4

2 回答 2

2

这是@mrip 答案的更安全版本,它使用临时环境而不是<<-

tempenv <- new.env()
tempenv$xx <- c()
fun<-function(x){
  tempenv$xx[ length(tempenv$xx) + 1 ] <-  x
  x^2    
}    
optimize(fun,c(-1,1))
tempenv$xx

通过使用临时环境,您无需担心意外覆盖全局环境中的对象或<<-在意外位置进行分配。

于 2013-10-09T16:10:24.487 回答
0

您可以使用<<-. 因此,例如,如果我想在简单优化期间跟踪 的每个值, x我可以这样做。

xx<-c()
fun<-function(x){
  xx[length(xx)+1]<<-x
  x^2    
}    
optimize(fun,c(-1,1))
xx
## [1] -2.360680e-01  2.360680e-01  5.278640e-01 -2.775558e-17  4.069010e-05
## [6] -4.069010e-05 -2.775558e-17

在您的情况下,如果您只想要最后一个值,W则可以将代码中的该行替换为:

W<<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i) 

如果你想要它们,那么首先 set Wlist<-list(),然后在你的函数集中

Wlist[[length(Wlist)+1]]<<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i)
于 2013-10-09T15:52:52.553 回答