BY 在 PROC NLMIXED 中处理;程序因错误而停止
BY processing in PROC NLMIXED; procedure stops due to error
我模拟了 500 次重复,并计划使用 BY 处理在 NLMIXED 中分析每一次。我的 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 可以确认该复制的错误,但继续进行剩余的复制。感谢您的想法!
最好的,
瑞安
这是我认为正在发生的事情。方差必须是非负的要求以及方差估计的分布是长尾的这一事实使得方差估计起来很麻烦。方差分量估计更新可能导致一个或多个估计的负值。 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 and/or SMRIvar 的更新变为负数。您可以保留原始代码,插入语句
bounds LMRIvar SMRIvar > 0;
这比根据允许为负的参数编写模型更简单。但是,我的经验是,使用具有定义域 (-infinity, infinity) 的参数实际上是更好的方法。
我模拟了 500 次重复,并计划使用 BY 处理在 NLMIXED 中分析每一次。我的 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 可以确认该复制的错误,但继续进行剩余的复制。感谢您的想法!
最好的, 瑞安
这是我认为正在发生的事情。方差必须是非负的要求以及方差估计的分布是长尾的这一事实使得方差估计起来很麻烦。方差分量估计更新可能导致一个或多个估计的负值。 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 and/or SMRIvar 的更新变为负数。您可以保留原始代码,插入语句
bounds LMRIvar SMRIvar > 0;
这比根据允许为负的参数编写模型更简单。但是,我的经验是,使用具有定义域 (-infinity, infinity) 的参数实际上是更好的方法。