3 年前未出现的 lme4 中用于生存分析的警告消息
warning messages in lme4 for survival analysis that did not arise 3 years ago
我正在尝试使用 lme4
包将广义线性混合效应模型拟合到我的数据中。
数据可以描述如下(见下例): 鱼28天以上的存活数据。示例数据集中的解释变量为:
Region
这是幼虫起源的地理区域。
treatment
提高每个地区鱼类子样本的温度。
replicate
整个实验的三个重复之一
tub
随机变量。总共 15 个浴缸(用于维持水族箱中的实验温度)(5 个温度 treatment
s 中的每个温度为 3 replicate
s)。每个浴缸每个 Region
包含 1 个水族箱(总共 4 个水族箱)并且随机放置在实验室中。
Day
不言自明,从实验开始算起的天数。
stage
未在分析中使用。可以忽略。
响应变量
csns
累积生存期。即 remaining fish/initial fish at day 0
。
start
权重用于告诉模型在实验开始时存活的概率与这条鱼的数量有关。
aquarium
第二个随机变量。这是每个单独的水族箱的唯一 ID,包含它所属的每个因素的值。例如N-14-1 表示 Region N
、Treatment 14
、replicate 1
。
我的问题比较特殊,之前装过以下型号:
dat.asr3<-glmer(csns~treatment+Day+Region+
treatment*Region+Day*Region+Day*treatment*Region+
(1|tub)+(1|aquarium),weights=start,
family=binomial, data=data2)
但是,现在我正在尝试重新 运行 模型以生成要发布的分析,但在相同的模型结构和包中出现以下错误。输出如下:
> Warning messages:
1: In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 1.59882 (tol = 0.001, component >1)
3: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model is nearly unidentifiable: very large eigenvalue
- Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
- Rescale variables?
我的理解如下:
Warning message 1.
non-integer #success in a binomial glm
指的是csns
变量的比例格式。我咨询了几个来源,这里包括 github、r-help 等,并且都建议这样做。 3 年前协助我进行此分析的研究员无法联系到。它与过去 3 年 lme4
软件包的变化有关吗?
Warning message 2.
我知道这是一个问题,因为没有足够的数据点来拟合模型,特别是在
L-30-1
、L-30-2
和 L-30-3
、
其中仅进行了两项观察:
Day 0 csns=1.00
和 Day 1 csns=0.00
对于所有三个水族馆。因此,没有可变性或足够的数据来拟合模型。
尽管如此,lme4
中的这个模型以前工作过,但现在 运行 没有这些警告就不能工作了。
Warning message 3
这个我完全陌生。没见过。
示例数据:
Region treatment replicate tub Day stage csns start aquarium
N 14 1 13 0 1 1.00 107 N-14-1
N 14 1 13 1 1 1.00 107 N-14-1
N 14 1 13 2 1 0.99 107 N-14-1
N 14 1 13 3 1 0.99 107 N-14-1
N 14 1 13 4 1 0.99 107 N-14-1
N 14 1 13 5 1 0.99 107 N-14-1
有问题的数据 1005cs.csv
可通过我们传输在此处获得:http://we.tl/ObRKH0owZb
如果能帮助解决这个问题,我们将不胜感激。此外,对于分析这些数据的合适的包或方法的任何替代建议也很好。
tl;dr "non-integer successes" 警告是准确的;由您决定为这些数据拟合二项式模型是否真的有意义。其他警告表明拟合有点不稳定,但缩放和居中一些输入变量可以使警告消失。同样,由您决定这些不同公式的结果是否差异足以让您担心...
data2 <- read.csv("1005cs.csv")
library(lme4)
拟合模型(稍微更紧凑的模型公式)
dat.asr3<-glmer(
csns~Day*Region*treatment+
(1|tub)+(1|aquarium),
weights=start, family=binomial, data=data2)
我确实收到了您报告的警告。
我们来看一下数据:
library(ggplot2); theme_set(theme_bw())
ggplot(data2,aes(Day,csns,colour=factor(treatment)))+
geom_point(aes(size=start),alpha=0.5)+facet_wrap(~Region)
这里没有明显的问题,尽管它确实清楚地表明某些治疗组合的数据非常接近 1,并且治疗值远非零。让我们尝试缩放和居中一些输入变量:
data2sc <- transform(data2,
Day=scale(Day),
treatment=scale(treatment))
dat.asr3sc <- update(dat.asr3,data=data2sc)
现在 "very large eigenvalue" 警告消失了,但我们仍然有 "non-integer # successes" 警告和 max|grad|=0.082。让我们试试另一个优化器:
dat.asr3scbobyqa <- update(dat.asr3sc,
control=glmerControl(optimizer="bobyqa"))
现在只剩下 "non-integer #successes" 警告。
d1 <- deviance(dat.asr3)
d2 <- deviance(dat.asr3sc)
d3 <- deviance(dat.asr3scbobyqa)
c(d1,d2,d3)
## [1] 12597.12 12597.31 12597.56
这些偏差差异不大(偏差量表上的 0.44 大于舍入误差所能解释的范围,但拟合优度差异不大);实际上,第一个模型给出了最好(最低)的偏差,表明警告是误报...
resp <- with(data2,csns*start)
plot(table(resp-floor(resp)))
这清楚地表明确实存在非整数响应,因此警告是正确的。
我正在尝试使用 lme4
包将广义线性混合效应模型拟合到我的数据中。
数据可以描述如下(见下例): 鱼28天以上的存活数据。示例数据集中的解释变量为:
Region
这是幼虫起源的地理区域。treatment
提高每个地区鱼类子样本的温度。replicate
整个实验的三个重复之一tub
随机变量。总共 15 个浴缸(用于维持水族箱中的实验温度)(5 个温度treatment
s 中的每个温度为 3replicate
s)。每个浴缸每个Region
包含 1 个水族箱(总共 4 个水族箱)并且随机放置在实验室中。Day
不言自明,从实验开始算起的天数。stage
未在分析中使用。可以忽略。
响应变量
csns
累积生存期。即remaining fish/initial fish at day 0
。start
权重用于告诉模型在实验开始时存活的概率与这条鱼的数量有关。aquarium
第二个随机变量。这是每个单独的水族箱的唯一 ID,包含它所属的每个因素的值。例如N-14-1 表示Region N
、Treatment 14
、replicate 1
。
我的问题比较特殊,之前装过以下型号:
dat.asr3<-glmer(csns~treatment+Day+Region+
treatment*Region+Day*Region+Day*treatment*Region+
(1|tub)+(1|aquarium),weights=start,
family=binomial, data=data2)
但是,现在我正在尝试重新 运行 模型以生成要发布的分析,但在相同的模型结构和包中出现以下错误。输出如下:
> Warning messages:
1: In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 1.59882 (tol = 0.001, component >1)
3: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model is nearly unidentifiable: very large eigenvalue
- Rescale variables?;Model is nearly unidentifiable: large eigenvalue ratio
- Rescale variables?
我的理解如下:
Warning message 1.
non-integer #success in a binomial glm
指的是csns
变量的比例格式。我咨询了几个来源,这里包括 github、r-help 等,并且都建议这样做。 3 年前协助我进行此分析的研究员无法联系到。它与过去 3 年 lme4
软件包的变化有关吗?
Warning message 2.
我知道这是一个问题,因为没有足够的数据点来拟合模型,特别是在
L-30-1
、L-30-2
和 L-30-3
、
其中仅进行了两项观察:
Day 0 csns=1.00
和 Day 1 csns=0.00
对于所有三个水族馆。因此,没有可变性或足够的数据来拟合模型。
尽管如此,lme4
中的这个模型以前工作过,但现在 运行 没有这些警告就不能工作了。
Warning message 3
这个我完全陌生。没见过。
示例数据:
Region treatment replicate tub Day stage csns start aquarium
N 14 1 13 0 1 1.00 107 N-14-1
N 14 1 13 1 1 1.00 107 N-14-1
N 14 1 13 2 1 0.99 107 N-14-1
N 14 1 13 3 1 0.99 107 N-14-1
N 14 1 13 4 1 0.99 107 N-14-1
N 14 1 13 5 1 0.99 107 N-14-1
有问题的数据 1005cs.csv
可通过我们传输在此处获得:http://we.tl/ObRKH0owZb
如果能帮助解决这个问题,我们将不胜感激。此外,对于分析这些数据的合适的包或方法的任何替代建议也很好。
tl;dr "non-integer successes" 警告是准确的;由您决定为这些数据拟合二项式模型是否真的有意义。其他警告表明拟合有点不稳定,但缩放和居中一些输入变量可以使警告消失。同样,由您决定这些不同公式的结果是否差异足以让您担心...
data2 <- read.csv("1005cs.csv")
library(lme4)
拟合模型(稍微更紧凑的模型公式)
dat.asr3<-glmer(
csns~Day*Region*treatment+
(1|tub)+(1|aquarium),
weights=start, family=binomial, data=data2)
我确实收到了您报告的警告。
我们来看一下数据:
library(ggplot2); theme_set(theme_bw())
ggplot(data2,aes(Day,csns,colour=factor(treatment)))+
geom_point(aes(size=start),alpha=0.5)+facet_wrap(~Region)
这里没有明显的问题,尽管它确实清楚地表明某些治疗组合的数据非常接近 1,并且治疗值远非零。让我们尝试缩放和居中一些输入变量:
data2sc <- transform(data2,
Day=scale(Day),
treatment=scale(treatment))
dat.asr3sc <- update(dat.asr3,data=data2sc)
现在 "very large eigenvalue" 警告消失了,但我们仍然有 "non-integer # successes" 警告和 max|grad|=0.082。让我们试试另一个优化器:
dat.asr3scbobyqa <- update(dat.asr3sc,
control=glmerControl(optimizer="bobyqa"))
现在只剩下 "non-integer #successes" 警告。
d1 <- deviance(dat.asr3)
d2 <- deviance(dat.asr3sc)
d3 <- deviance(dat.asr3scbobyqa)
c(d1,d2,d3)
## [1] 12597.12 12597.31 12597.56
这些偏差差异不大(偏差量表上的 0.44 大于舍入误差所能解释的范围,但拟合优度差异不大);实际上,第一个模型给出了最好(最低)的偏差,表明警告是误报...
resp <- with(data2,csns*start)
plot(table(resp-floor(resp)))
这清楚地表明确实存在非整数响应,因此警告是正确的。