2013-10-09 102 views
1

我正在使用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) 

此致

回答

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) 
+0

太好了。那是我需要的。非常感謝。 –

+0

參見「命運(174)'。 –

+0

@GregSnow那是什麼? – mrip

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 

使用臨時環境中,您不必擔心意外改寫在全球環境中的物體或<<-在一個意想不到的地方分配。