Rme中lme4中glmer中的数据大小问题:导致收敛的数据集大小

时间:2019-04-25 14:32:42

标签: r modeling lme4

我正在尝试使用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) 

每个模型要处理的数据大小是否可能存在问题?还有什么方法可以解决这个问题?

1 个答案:

答案 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项中存在更多的差异,但是理论上其他人将需要确认这里发生的情况。

一个简单的解决方案可能是从整体模型中删除物种或昼夜变量之一,或者您可以包括其他环境变量或日期/时间信息以帮助其收敛。

我知道这并不彻底,但是希望它可以帮助您开始使用这些假设的数据集,以了解为什么它不能为您收敛。