R: 找不到 lme4 的 nlmer 错误变量
R: lme4's nlmer error variable not found
下例数据来自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)
我想拟合一个模型,该模型对 p1
、b1
、p2
、b2
具有 4 个固定效应,对同一组参数具有 4 个随机效应。
你这里有几个问题...
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
如文档中所述:
Currently, the Nonlin(..) formula part must not only return a numeric
vector, but also must have a "gradient" attribute, a matrix. The
functions SSbiexp, SSlogis, etc, see selfStart, provide this (and
more). Alternatively, you can use deriv() to automatically produce
such functions or expressions.
然后您可以修改文档提供的示例:
## 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(我只是尝试应用文档...)我也不了解你的 model/question.
当您更改优化器时,收敛问题似乎消失了...
有关 "troubleshooting" 与 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"))
下例数据来自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)
我想拟合一个模型,该模型对 p1
、b1
、p2
、b2
具有 4 个固定效应,对同一组参数具有 4 个随机效应。
你这里有几个问题...
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
如文档中所述:
Currently, the Nonlin(..) formula part must not only return a numeric vector, but also must have a "gradient" attribute, a matrix. The functions SSbiexp, SSlogis, etc, see selfStart, provide this (and more). Alternatively, you can use deriv() to automatically produce such functions or expressions.
然后您可以修改文档提供的示例:
## 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(我只是尝试应用文档...)我也不了解你的 model/question.
当您更改优化器时,收敛问题似乎消失了...
有关 "troubleshooting" 与 lme4
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"))