【问题标题】:R: lme4's nlmer error variable not foundR:lme4 的 nlmer 错误变量未找到
【发布时间】:2018-02-13 22:02:00
【问题描述】:

以下示例中的数据来自here

library(tidyverse)
library(lme4)
dat <- read.table("aids.dat2",head=T) %>%
  filter(day <= 90) %>%
  mutate(log10copy = log10(lgcopy)) %>%
  na.omit()

> head(dat)
  patid day    cd4   lgcopy    cd8 log10copy
2 11542   2 159.84 4.361728 619.38 0.6396586
3 11542   7 210.60 3.531479 666.90 0.5479566
4 11542  16 204.12 2.977724 635.04 0.4738844
5 11542  29 172.48 2.643453 407.68 0.4221716
6 11542  57 270.94 2.113943 755.78 0.3250933
8 11960   2 324.72 3.380211 856.08 0.5289438

运行以下代码给了我错误:Error in eval(expr, envir, enclos) : object 'log10copy' not found,但log10copy 显然是我数据集中的列之一?

lme4.fit <- lme4::nlmer(log10copy ~ exp(p1-b1*day) + exp(p2-b2*day + 1) + 
                          (1|p1) + (1|b1) + (1|p2) + (1|b2), data = dat)

我想拟合一个模型,该模型对 p1b1p2b2 具有 4 个固定效应,对同一组参数有 4 个随机效应。

【问题讨论】:

  • nlmer 的公式应该是resp ~ Nonlin ~ fixed + random 形式的三部分公式。还有什么是 p1、p2、b1、b2?它们不在您的示例数据中。
  • @neilfws p1、p2、b1 和 b2 是我的参数
  • @neilfws 我用一些新代码更新了我的帖子(根据您建议的语法),但现在我遇到了另一个错误..

标签: r lme4


【解决方案1】:

这里有几个问题...

1) 起始值必须是命名向量
2) nlmer 中的data 参数应接收dat 作为值,而不是像您的示例中那样接收aids.dat

start <- c(p1 = 10, b1 = 0.5, p2 = 6, b2 = 0.005)
lme4.fit <- lme4::nlmer(log10copy ~ exp(p1-b1*day) + exp(p2-b2*day + 1) ~ 
                            (p1|patid) + (b1|patid) + (p2|patid) + (b2|patid), data = dat,
                        start = start)

这将触发以下错误:

Erreur : is.matrix(gr <- attr(val, "gradient")) is not TRUE

如文档中所述:

目前,Nonlin(..) 公式部分不能只返回一个数字 向量,还必须有一个“梯度”属性,一个矩阵。这 功能 SSbiexp、SSlogis 等,请参阅 selfStart,提供此功能(和 更多的)。或者,您可以使用 deriv() 自动生成 这样的函数或表达式。

然后您可以修改文档提供的示例:

## a. Define formula
nform <- ~ exp(p1-b1*input) + exp(p2-b2*input + 1)
## b. Use deriv() to construct function:
nfun <- deriv(nform, namevec=c("p1", "b1", "p2", "b2"),
              function.arg=c("input","p1", "b1", "p2", "b2"))
lme4.fit <- lme4::nlmer(log10copy ~ nfun(day, p1, b1, p2, b2) ~ 
                            (p1|patid) + (b1|patid) + (p2|patid) + (b2|patid), data = dat,
                        start = start)

然后您将遇到以下错误

Error in fn(nM$xeval()) : prss failed to converge in 300 iterations

这可能意味着您的模型对于您的数据而言过于复杂... 或者我在规范中犯了一个错误,因为我不太了解 nlmer(我只是尝试应用文档......)也不知道你的模型/问题。

当您更改优化器时,收敛问题似乎消失了...
有关lme4 的“故障排除”(包括收敛问题)的建议,请参阅here

lme4.fit <- lme4::nlmer(log10copy ~ nfun(day, p1, b1, p2, b2) ~ 
                            (p1|patid) + (b1|patid) + 
                            (p2|patid) + (b2|patid), 
                        data = dat,
                        start = start, 
                        nlmerControl(optimizer = "bobyqa"))

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多