问题描述
在 R 中使用 sem 包运行 SEM 时,我收到以下警告消息:
警告信息:在 eval(substitute(expr),data,enclos = parent.frame()) 中:优化可能没有收敛; nlm 返回码 = 3。请参阅 ?nlm。
我咨询了 R 帮助(“?nlm()”),它说:
代码 3:最后一个全局步骤未能找到低于估计值的点。要么估计是函数的近似局部最小值,要么 steptol 太小。
我不知道如何处理这条警告消息,有两个问题:
问题 1:如何更改 SEM 模型中的步长 (steptol)?
Q2:根据我的经验,R 警告通常可以被忽略。那么这条警告消息是我真正需要担心的还是可以忽略的?
下面我提供了一些关于我想要测试的假设以及我运行的 SEM 模型的代码的背景信息,以及我解决上述警告消息的尝试。
背景
我想测试双亲鱼的性格、父母照顾和繁殖成功之间的关系。因此,我测量了父母个性(V1)并评估了父母关怀的两个方面(V2 和 V3)。另外,我有两个生殖成功的衡量标准(V4 和 V5)。我想检验三个假设:
(I) 预先评估的性格差异可预测父母的照顾行为。
(II) 预先评估的人格预测繁殖成功。
(III) 父母照顾可预测生育成功。
I have attached a visualisation of the proposed model。我还分别测试了护理措施和生殖成功之间的相关性(图中用黑色箭头表示)。但这并不是我特别感兴趣的(所以没有包含在三个假设中)。]
模型
首先,我运行了一个预备的 MCMC-glmm 并提取了后验相关矩阵(代码未附上)。然后我指定了 SEM 模型并在整个后验相关估计分布上运行它,如下面的代码所示:
mySEM <-specifyModel()
V1 <-> V1,e1,NA
V2 <-> V2,e2,NA
V3 <-> V3,e3,NA
V4 <-> V4,e4,NA
V5 <-> V5,e5,NA
V1 -> V2,p1,NA
V1 -> V3,p2,NA
V1 -> V4,p3,NA
V1 -> V5,p4,NA
V2 -> V4,p5,NA
V2 -> V5,p6,NA
V3 -> V4,p7,NA
V3 -> V5,p8,NA
V2 <-> V3,p9,NA
V4 <-> V5,p10,NA
Sem.out<-matrix(0,8000,1)
for (i in 1:8000){
X<-round(matrix(myMCMCglmm $VCV[i,1:25],5),3)
output_mySEM <-try(sem(mySEM,S=X,N= 120,obs.variables=v.names))
Sem.out[i,1]<-deviance(mySEM)
}
summary(mySEM)
代码产生合理的输出;但我也收到了上述警告信息。
尝试解决问题
老实说,我什至很惊讶我一开始收到上述警告消息,因为我没有更改 optimizerSem 的默认优化器函数(我认为这应该是我的默认值) nlm。所以我尝试了两个选项:
(a) 我考虑了 steptol 可以用作 optimizerSem 中的参数并在 optimizerSem 中指定 steptol 的可能性-function(因为我对 optimizerSem-help 的理解,来自其他优化器的附加参数,比如 nlm,可以包含在这个函数中;这也可以解释为什么我收到这样一个 nlm-警告,尽管 nlm 不是默认优化器):
Sem.out<-matrix(0,1)
for (i in 1:8000){
X<-round(matrix(myMCMCglmm $VCV[i,obs.variables=v.names,optimizer = optimizerSem(steptol = 1e-4)))
Sem.out[i,1]<-deviance(mySEM)
}
*** Error in with(model.description,{ :
*** argument "model.description" is missing,with no default
*** Error: $ operator is invalid for atomic vectors**
(b) 我将优化器更改为 nlm 并在 nlm 函数中指定了 steptol:
Sem.out<-matrix(0,optimizer = nlm(steptol = 1e-4)))
Sem.out[i,1]<-deviance(mySEM)
}
*** Error in nlm(steptol = 1e-04) : argument "p" is missing,with no default
*** Error: $ operator is invalid for atomic vectors
对于 (a) 和 (b),我不能简单地指定 steptol 而不在函数中指定更多参数,即代码不会运行并且我收到一条错误消息说缺少参数(上述代码中提供了更多信息;错误消息使用:“***”指示)。不幸的是,我不知道如何指定这些其他参数 (model.description/p)。到目前为止,我什至不确定我调整步长的尝试是否正确。
我被这个问题困住了,非常感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)