我目前正在尝试使用 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 个测量值。有没有办法解决这个问题?
谢谢!
答案 0 :(得分:1)
tl;dr 这是一条“因舍入而停止”的消息,可能是因为您的响应变量只有两位数的精度吗? >
NLopt reference 表示 -4 表示
<块引用>由于舍入错误限制了进度而暂停。 (在这种情况下,优化通常仍会返回有用的结果。)
然而,期望你挖掘那么远是不合理的(lme4
→ nloptr
(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;