Как установить доверительные интервалы с помощью функции прогнозирования для glmmTMB

#r #predict #confidence-interval #glmmtmb

#r #прогнозировать #доверительный интервал #glmmtmb

Вопрос:

Я запускаю смешанную модель с использованием пакета glmmTMB и использую функцию прогнозирования для вычисления прогнозируемых средних значений, используя следующий код:

запустить модель

 model_1 <- glmmTMB(Step.rate ~ Treatment*Week   
    (1|Treatment.Group/Lamb.ID)    (1|Plot),
     data = data.df, family = nbinom1) 
  

создайте новый фрейм данных

 new.dat <- data.frame(Treatment = data.df$Treatment,
                      Week = data.df$Week, Plot = data.df$Plot, 
                      Treatment.Group = data.df$Treatment.Group,
                      Lamb.ID = data.df$Lamb.ID) 
  

прогнозировать средние значения

 new.dat$prediction <- predict(model_1, new.data = new.dat, 
       type = "response", re.form = NA) 
  

Этот код работает нормально, но когда я добавляю в intervals = «confidence» для вычисления доверительных интервалов, кажется, что это не работает. R игнорирует последнюю часть кода, и вычисляются только предсказанные средние значения.

 new.dat$prediction <- predict(model_1, new.data = new.dat, 
     type = "response", re.form = NA, intervals = "confidence")
  

Почему intervals = «confidence» не работает? Может ли это быть проблемой, связанной с пакетом glmmTMB?

Комментарии:

1. Несколько вещей, которые могут помочь: чтобы просмотреть страницу справки для конкретной версии glmmTMB predict() , перейдите на ?predict.glmmTMB . Вы увидите, что там нет intervals аргумента. Вы можете сделать приблизительный CI «вручную». В часто задаваемых вопросах Болкера по GLMM здесь приведен пример. Я также использовал ggpredict() из пакета ggeffects , чтобы получить приблизительный CI вместе с прогнозами, хотя я признаю, что, как известно, я немного разочаровывался, пытаясь определить точный набор данных, для которого я хочу получить прогнозы.

2. @aosmith, на это, возможно, стоит ответить (особенно, если вы разъясните различие между универсальным методом ( ?predict ), наиболее широко используемым методом ( ?predict.lm ) и методом, используемым операционной системой ( ?predict.glmmTMB ) .) …

3. для ?predict.glmmTMB у вас есть опция se.fit=TRUE , которая значительно упрощает вашу работу по построению доверительных интервалов.

Ответ №1:

Вы можете использовать аргумент se.fit = TRUE , чтобы получить стандартные ошибки прогнозируемых значений, а затем использовать их для вычисления доверительных интервалов.

https://www.rdocumentation.org/packages/glmmTMB/versions/1.0.2.1/topics/predict.glmmTMB

Комментарии:

1. R чувствителен к регистру, это TRUE , не True .

2. Спасибо, это было действительно полезно!

Ответ №2:

Есть некоторые пакеты, которые выполняют эту работу за вас, такие как emmeans или ggeffects, или пакет effects (и, вероятно, еще несколько пакетов):

 library(ggeffects)
library(glmmTMB)
library(emmeans)
data("Salamanders")
m <- glmmTMB(count ~ spp * mined   sample   (1 | site), family = nbinom1, data = Salamanders)

emmeans(m, c("spp", "mined"), type = "response")
#>  spp   mined response     SE  df lower.CL upper.CL
#>  GP    yes     0.0368 0.0373 627  0.00504    0.269
#>  PR    yes     0.1099 0.0661 627  0.03368    0.358
#>  DM    yes     0.3842 0.1397 627  0.18808    0.785
#>  EC-A  yes     0.1099 0.0660 627  0.03377    0.357
#>  EC-L  yes     0.3238 0.1222 627  0.15437    0.679
#>  DES-L yes     0.4910 0.1641 627  0.25468    0.947
#>  DF    yes     0.5561 0.1764 627  0.29822    1.037
#>  GP    no      2.2686 0.4577 627  1.52646    3.372
#>  PR    no      0.4582 0.1515 627  0.23940    0.877
#>  DM    no      2.4201 0.4835 627  1.63472    3.583
#>  EC-A  no      0.8931 0.2373 627  0.53005    1.505
#>  EC-L  no      3.2017 0.6084 627  2.20451    4.650
#>  DES-L no      3.4921 0.6517 627  2.42061    5.038
#>  DF    no      1.8495 0.3948 627  1.21623    2.813
#> 
#> Confidence level used: 0.95 
#> Intervals are back-transformed from the log scale
ggpredict(m, c("spp", "mined"))
#> 
#> # Predicted counts of count
#> # x = spp
#> 
#> # mined = yes
#> 
#> x    | Predicted |   SE |       95% CI
#> --------------------------------------
#> GP   |      0.04 | 1.01 | [0.01, 0.27]
#> PR   |      0.11 | 0.60 | [0.03, 0.36]
#> DM   |      0.38 | 0.36 | [0.19, 0.78]
#> EC-A |      0.11 | 0.60 | [0.03, 0.36]
#> EC-L |      0.32 | 0.38 | [0.15, 0.68]
#> DF   |      0.56 | 0.32 | [0.30, 1.04]
#> 
#> # mined = no
#> 
#> x    | Predicted |   SE |       95% CI
#> --------------------------------------
#> GP   |      2.27 | 0.20 | [1.53, 3.37]
#> PR   |      0.46 | 0.33 | [0.24, 0.88]
#> DM   |      2.42 | 0.20 | [1.64, 3.58]
#> EC-A |      0.89 | 0.27 | [0.53, 1.50]
#> EC-L |      3.20 | 0.19 | [2.21, 4.65]
#> DF   |      1.85 | 0.21 | [1.22, 2.81]
#> 
#> Adjusted for:
#> * sample = 2.50
#> *   site = NA (population-level)
#> Standard errors are on the link-scale (untransformed).
  

Создано 2020-09-14 пакетом reprex (версия 0.3.0)

Ответ №3:

Я думаю, что другой ответ дает вам обходной путь для получения CI для объектов glmmTMB с использованием se.fit аргумента. Но проблема наличия определенных версий функций для разных типов объектов (определяемых классом объекта) — это то, что вызывало у меня некоторое огорчение в прошлом, поэтому, возможно, стоит подробнее остановиться на этом здесь.

Не вдаваясь в подробности, функции в R, которые являются общими для многих типов объектов, имеют общие версии. Например, если вы ознакомились с документацией для ?predict , вы увидите страницу справки для общей версии функции. Там вы увидите несколько общих утверждений о том, как обычно работает функция, но практически никаких объяснений конкретных аргументов, поскольку доступные аргументы зависят от типа объекта, с которым вы работаете. Описание со страницы справки для generic predict() :

predict — это универсальная функция для предсказаний по результатам различных функций подгонки модели. Функция вызывает определенные методы, которые зависят от класса первого аргумента.

Конкретные функции подгонки модели могут иметь определенные версии predict() , которые работают с результирующим объектом модели. Например, существует специальное predict() для моделей соответствие с lm() . Объекты, возвращаемые из lm() , относятся к классу lm. Вы можете ознакомиться с документацией по версии функции для объектов lm на ?predict.lm . Именно эта функция содержит intervals аргумент для вычисления доверительных интервалов и интервалов прогнозирования. Хотя многие из нас начинают с объектов lm и так учатся intervals , оказывается, что многие (большинство?) Другие predict() функции не имеют этой опции.

Ключом к переходу на страницу справки по конкретной predict() используемой вами функции является знание класса объекта, возвращаемого используемой вами функцией подбора модели. Например, модели, подходящие для glmmTMB() , относятся к классу glmmTMB, поэтому вы можете перейти к ?predict.glmmTMB . Подходящие модели lme4::lmer() относятся к классу merMod, поэтому вы можете перейти к ?predict.merMod. , если вы не знаете, какой класс возвращает функция подгонки модели, похоже, вы часто можете найти информацию в документации в разделе «Значение«. Это верно, по крайней мере, для lm() и lmer() .

Наконец, если вам нужно знать, имеет ли определенный класс объектов определенную версию универсальной функции, связанной с ним, вы можете посмотреть на методы, доступные для этого класса с помощью methods() функции. Пример для lm:

 methods(class = "lm")
 [1] add1           alias          anova          case.names     coerce        
 [6] confint        cooks.distance deviance       dfbeta         dfbetas       
[11] drop1          dummy.coef     effects        extractAIC     family        
[16] formula        hatvalues      influence      initialize     kappa         
[21] labels         logLik         model.frame    model.matrix   nobs          
[26] plot           predict        print          proj           qqnorm        
[31] qr             residuals      rstandard      rstudent       show          
[36] simulate       slotsFromS3    summary        variable.names vcov