使用 R 包“sem”运行 SEM 时如何调整步长?

问题描述

在 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 (将#修改为@)