проблемы с размером данных в glmer в lme4 в R: размер набора данных, вызывающий проблемы сходимости - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь смоделировать влияние нескольких переменных на вероятность возникновения самоконтроля с использованием glmer в пакете lme4. Это очень большой набор данных с> 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 голосов
/ 26 апреля 2019

Я начну с того, что я недостаточно понимаю теорию, лежащую в основе этих моделей, чтобы дать вам исчерпывающий ответ, но, экспериментируя с некоторыми данными, я обнаружил разницу, которая может оказаться полезной. Иногда игра с гипотетическими примерами может помочь вам понять вашу проблему.

Здесь я составил некоторые данные. Существует три набора случайных биномиальных данных с различными вероятностями того, что они равны 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 больше дисперсии, но кто-то еще должен будет теоретически подтвердить, что здесь происходит.

Простое решение может заключаться в удалении одной из ваших переменных, либо видов, либо дневной ночи, из общей модели, либо, возможно, вы можете включить другие переменные среды или информацию дня / времени, которая поможет ей сходиться.

Я знаю, что это не совсем тщательно, но, надеюсь, это поможет вам начать играть с некоторыми из этих гипотетических наборов данных, чтобы понять, почему они не сходятся для вас.

...