Sas 在PROC-NLMIXED中处理;过程因错误而停止

Sas 在PROC-NLMIXED中处理;过程因错误而停止,sas,simulation,Sas,Simulation,我模拟了500次复制,并计划使用逐处理对每一次进行分析。我的代码如下: 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 =

我模拟了500次复制,并计划使用逐处理对每一次进行分析。我的代码如下:

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输出语句上的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可以确认该复制的错误,但可以继续进行其余的复制。感谢您的想法

最好的,
Ryan

以下是我认为正在发生的事情。方差必须为非负的要求以及方差估计的分布是长尾分布的这一事实使得方差估计变得困难。方差分量估计更新可能导致一个或多个估计值为负值。NLMIXED程序试图计算模型方差分量的特征值。在这一点上,NLM崩溃了

但请注意

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;
或者,您可以使用bounds语句来防止LMRIvar和/或SMRIvar的更新变为负数。您可以保留原始代码,插入语句

bounds LMRIvar SMRIvar > 0;

这比根据允许为负值的参数编写模型要简单。然而,根据我的经验,使用具有域(-infinity,infinity)的参数实际上是更好的方法。

据我所见,语法看起来很可靠。这听起来很像数据问题。由于误差状态,结果特征值为负,这是不允许的。在这种情况下,我建议从部分数据、更简单的模型或生成的测试集开始。