2017-09-19 57 views
0

我模擬了500次重複,並計劃使用BY處理分析NLMIXED中的每個重複項。我NLMIXED代碼如下:BY PROC NLMIXED中的處理;程序由於錯誤而停止

PROC NLMIXED DATA=MELS GCONV=1E-12 QPOINTS=11; 
    BY Rep; 
    PARMS LMFI=&LMFI. 
      SMFI=&SMFI. 
      LMRIvar=&LMRIvar. 
      SMRIvar=0 TO 0.15 BY 0.005; 
    mu = LMFI + b0i; 
    evar = EXP(SMFI + t0i); 
    MODEL Y ~ NORMAL(mu,evar); 
    RANDOM b0i t0i ~ NORMAL([0,0],[LMRIvar,0,SMRIvar]) SUBJECT=PersonID; 
    ODS OUTPUT FitStatistics=Fit2 ConvergenceStatus=Conv2 ParameterEstimates=Parm2; 
RUN; 

對於一些重複的,方差分量取樣要小,因此,預計一些非零數字會聚錯誤的(請注意:ODS OUTPUT語句ConvergenceStatus要求) 。但是,當我收到以下警告時,NLMIXED將退出處理過程,無論剩餘的要分析的複製數量是多少。

WARNING: The final Hessian matrix is full rank but has at least one negative eigenvalue. Second-order optimality condition violated. 
ERROR: QUANEW Optimization cannot be completed. 

我錯過了什麼嗎?我認爲NLMIXED可以承認該複製的錯誤,但繼續進行剩餘的複製。感謝讚賞!

最佳, 瑞安

+0

據我所知,語法看起來很穩固。這聽起來很像數據問題。由於錯誤狀態,所產生的特徵值是負的,這是不允許的。在這種情況下,我建議從部分數據,更簡單的模型或生成的測試集開始。 – pinegulf

回答

1

這裏是什麼,我相信正在發生。要求方差必須是非負的,並且方差估計的分佈是長尾的事實使得估計出現差異很麻煩。方差分量估計更新可能會導致一個或多個估計的負值。 NLMIXED過程試圖計算模型方差分量的特徵值。此時,NLMIXED崩潰。

但是請注意,

V[Y] = (sd[Y])^2 
V[Y] = exp(ln(V[Y])) 
V[Y] = exp(2*ln(sd[Y])) 
V[Y] = exp(2*ln_sd_Y) 

現在,假設我們做ln_sd_Y參數。對V [Y]的引用需要寫成上面最後一個語句中所示的函數。由於參數ln_sd_Y的域是(-infinity,infinity),因此ln_sd_Y上沒有下界。函數exp(2 * ln_sd_Y)將始終產生一個非負方差估計值。實際上,考慮到數字計算機的侷限性,即負無窮無法表示,只有負值無窮大的值),函數exp(2 * ln_sd_Y)將始終產生一個正參數估計值。估計值可能非常非常接近0.但估計值始終爲0以上。這應該排除SAS試圖計算負數的特徵值。

代碼的輕微改變將LMRIvar和SMRIvar寫入ln_sd_LMRIvar和ln_sd_SMRIvar的函數中。

PROC NLMIXED DATA=MELS GCONV=1E-12 QPOINTS=11; 
    BY Rep; 
    PARMS LMFI=&LMFI. 
      SMFI=&SMFI. 
      ln_sd_LMRIvar=%sysfunc(log(%sysfunc(sqrt(&LMRIvar.)))) 
      ln_sd_SMRIvar=-5 to -1 by 0.1; 
    mu = LMFI + b0i; 
    evar = EXP(SMFI + t0i); 
    MODEL Y ~ NORMAL(mu,evar); 
    RANDOM b0i t0i ~ NORMAL([0,0], 
          [exp(2*ln_sd_LMRIvar), 0, 
           exp(2*ln_sd_SMRIvar)]) SUBJECT=PersonID; 
    ODS OUTPUT FitStatistics=Fit2 ConvergenceStatus=Conv2 ParameterEstimates=Parm2; 
RUN; 

或者,你可以使用一個邊界聲明試圖阻止變爲負值LMRIvar和/或SMRIvar的更新。你可以讓你的原碼,插入語句

bounds LMRIvar SMRIvar > 0; 

這比在被允許進入負參數條款以書面模型簡單。但是,我的經驗是使用具有域( - 無窮大,無窮大)的參數實際上是更好的方法。

相關問題