保存函数的输出。

时间:2013-10-09 15:43:18

标签: r

我正在使用optim函数最小化此函数,该函数非常有效。我唯一的问题是我无法保存W矩阵,我在最小化时计算内部函数。有没有办法以某种方式保存W矩阵?

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)

祝你好运

2 个答案:

答案 0 :(得分: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

通过使用临时环境,您不必担心在全局环境中意外地写入对象或<<-在意外的位置进行分配。

答案 1 :(得分: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) 

如果你想要它们,那么首先设置Wlist<-list(),然后设置你的功能集

Wlist[[length(Wlist)+1]]<<-solve((1/(nrow(A)/5))*t(gmm_i)%*%gmm_i)