我正在尝试使用lme4软件包中的glmer建模几个变量对发生自循环的可能性的影响。这是一个非常大的数据集,具有> 900,000个数据点。
当我尝试运行模型时,出现此错误。
SLMod <- glmer(SL ~ species*season + (1|code), data=SL, family=binomial)
Warning message:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 0.0013493 (tol = 0.001,
component 1)
这是输出
summary(SLMod)
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: SL ~ species * season + (1 | code)
Data: SL
AIC BIC logLik deviance df.resid
708076.5 708135.1 -354033.2 708066.5 906441
Scaled residuals:
Min 1Q Median 3Q Max
-1.6224 -0.4324 -0.3136 -0.1983 5.0722
Random effects:
Groups Name Variance Std.Dev.
code (Intercept) 0.8571 0.9258
Number of obs: 906446, groups: code, 180
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.29729 0.05944 -21.824 < 2e-16 ***
speciesSilvertip Shark 0.05593 0.06390 0.875 0.381
seasonwet season 0.09617 0.01008 9.537 < 2e-16 ***
speciesSilvertip Shark:seasonwet season -0.10809 0.01354 -7.983 1.43e-15 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) spcsSS ssnwts
spcsSlvrtpS -0.585
seasonwtssn 0.009 -0.004
spcsSShrk:s -0.007 0.001 -0.744
convergence code: 0
Model failed to converge with max|grad| = 0.0013493 (tol = 0.001, component 1)
这是动物运动的数据集,在同一点进行连续检测并计算出时间差。如果时间差> 10分钟,则将其确定为自循环,并赋予1,如果在十分钟内则为0。数据示例如下。
structure(list(code = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label =
"2388", class = "factor"),
species = c("Silvertip Shark", "Silvertip Shark", "Silvertip Shark",
"Silvertip Shark", "Silvertip Shark", "Silvertip Shark"),
sex = c("F", "F", "F", "F", "F", "F"), TL = c(112, 112, 112,
112, 112, 112), datetime = structure(c(1466247120, 1466247420,
1467026100, 1469621400, 1469879640, 1470397200), class = c("POSIXct",
"POSIXt"), tzone = ""), year = c("2016", "2016", "2016",
"2016", "2016", "2016"), month = c(6, 6, 6, 7, 7, 8), hour = c(11,
11, 12, 13, 12, 12), season = c("dry season", "dry season",
"dry season", "dry season", "dry season", "dry season"),
daynight = c("day", "day", "day", "day", "day", "day"), SL = c(0,
0, 1, 1, 1, 1)), row.names = c(NA, 6L), class = "data.frame")
我使用此代码从我的数据集中随机抽取了仅50%的数据
SL50 <- SL %>% sample_frac(0.5)
,然后在该数据集上运行相同的代码,并且运行正常,没有错误。我想知道我正在运行的数据集的大小是否存在问题。但是,在使用50%采样数据的其他模型上,我也会遇到类似的错误,当我在10%的数据上运行该代码时,该错误就会消失。
SLMod <- glmer(SL ~ species*daynight + (1|code), data=SL50,
family=binomial)
Warning message:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 0.0010195 (tol = 0.001,
component1)
每个模型要处理的数据大小是否可能存在问题?还有什么方法可以解决这个问题?
答案 0 :(得分:0)
我首先要说的是,我对这些模型背后的理论了解不够,无法为您提供详尽的答案,但是在尝试一些数据时,我发现了可能有所帮助的区别。有时,玩弄假想的例子可以帮助您理解问题。
这里我已经整理了一些数据。三组随机二项式数据的概率不同,为1。鲨鱼的概率为0.1,海龟的概率为0.7,鳄鱼的概率为0.9。但是请注意,我在整个数据集中重复了一遍又一遍“夜晚”和“白天”。因此,两者之间应该没有真正的区别。
data<-data.frame("X"=c(rbinom(100,1, 0.1),rbinom(100,1, 0.7),rbinom(100,1, 0.9)),
"species"=c(rep("Shark",100),rep("Turtle",100),rep("Gator",100)),
"daynight"=c("night","day"),"ID"=as.factor(c(1:300)))
> head(data)
X species daynight ID
1 0 Shark night 1
2 0 Shark day 2
3 1 Shark night 3
4 0 Shark day 4
5 0 Shark night 5
6 0 Shark day 6
library(lme4)
mod1<-glmer(X~species*daynight+(1|ID), data=data, family="binomial"(link="logit"))
Warning messages:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
unable to evaluate scaled gradient
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge: degenerate Hessian with 1 negative eigenvalues
mod2<-glmer(X~species+(1|ID), data=data, family="binomial"(link="logit"))
包括昼夜在内时,我会收到警告消息,这可能是因为没有足够的方差使模型收敛,并且mod2没有错误。
现在,我已对其进行了更改,以便有昼/夜的“方向”。请注意,在这种假设的情况下,日子总是更高。
data<-data.frame("X"=c(rbinom(50,1, 0.1),rbinom(50,1, 0.3),
rbinom(50,1, 0.7),rbinom(50,1, 0.9),
rbinom(50,1, 0.5),rbinom(50,1, 0.6)),
"species"=c(rep("Shark",100),rep("Turtle",100),rep("Gator",100)),
"daynight"=c(rep("night",50),rep("day",50)),"ID"=as.factor(c(1:300)))
> head(data)
X species daynight ID
1 0 Shark night 1
2 0 Shark night 2
3 0 Shark night 3
4 0 Shark night 4
5 0 Shark night 5
6 0 Shark night 6
mod1<-glmer(X~species*daynight+(1|ID), data=data, family="binomial"(link="logit"))
在我运行相同的mod1
时,我没有得到这样的错误,这可能是因为daynight
项中存在更多的差异,但是理论上其他人将需要确认这里发生的情况。
一个简单的解决方案可能是从整体模型中删除物种或昼夜变量之一,或者您可以包括其他环境变量或日期/时间信息以帮助其收敛。
我知道这并不彻底,但是希望它可以帮助您开始使用这些假设的数据集,以了解为什么它不能为您收敛。