运行 lmer() 混合模型时出现未知错误

问题描述

我目前正在尝试使用 lme4 函数运行重复测量方差分析。我的数据如下(显示前 6 个值,n=40):

核心 基材 处理 O2
1 M&S C -0.40
1 S C -0.60
2 M&S C -0.41
2 S C -0.61
3 M&S D -0.25
3 S D -0.45

我想看看处理对 O2 是否有影响,以及这是否因底物而异。我每个核心有 2 次测量,它们发生在不同的时间点,所以我想控制重复测量。为此,我使用了以下代码

mixed.lmer1 <- lmer(O2 ~ Treatment*Substrate+(1|Core),data = data)
summary(mixed.lmer1)

然后我用下面的代码来测试是否有sig。 Core对模型的影响:

mixed.lmer2 <- lm(O2 ~ Treatment*Substrate,data = data)
summary(mixed.lmer2)
anova(mixed.lmer2,mixed.lmer1)

但是,当我运行第一个模型时,我收到以下警告:

Warning message:
In optwrap(optimizer,devfun,getStart(start,rho$pp),lower = rho$lower,:
  convergence code -4 from nloptwrap

我只是想知道以前是否有人遇到过这种情况?我似乎无法在网上找到任何东西。我认为这是因为我过度拟合了数据,因为每个核心只有 2 个测量值。有没有办法解决这个问题?

谢谢!

解决方法

tl;dr 这是一条“因舍入而停止”的消息,可能是因为您的响应变量只有两位数的精度吗? >

NLopt reference 表示 -4 表示

由于舍入错误限制了进度而暂停。 (在这种情况下,优化通常仍会返回有用的结果。)

然而,期望你挖掘那么远是不合理的(lme4nloptr(R 包/包装器)→ NLopt(C 库))。您可能可以通过打印 fitted_model@optinfo$message 找到等效信息。

nlopt(C/C++ 优化库)到 nloptr(R 包装器)到 lme4(进一步包装 nloptr::nlopt() 以使其成为更兼容其他 R 优化函数),消息丢失了。

在 GitHub 上的 nlopt 源代码中挖掘还发现 this list of status codes:负值表示潜在的收敛问题。

typedef enum {
    NLOPT_FAILURE = -1,/* generic failure code */
    NLOPT_INVALID_ARGS = -2,NLOPT_OUT_OF_MEMORY = -3,NLOPT_ROUNDOFF_LIMITED = -4,NLOPT_FORCED_STOP = -5,NLOPT_SUCCESS = 1,/* generic success code */
    NLOPT_STOPVAL_REACHED = 2,NLOPT_FTOL_REACHED = 3,NLOPT_XTOL_REACHED = 4,NLOPT_MAXEVAL_REACHED = 5,NLOPT_MAXTIME_REACHED = 6,NLOPT_NUM_RESULTS           /* not a result,just the number of them */
} nlopt_result;