Генерация доверительных интервалов предельного прогноза из объекта glmer с помощью predInterval () из merTools

Я пытаюсь создать доверительные интервалы для предельных прогнозов с помощью функции predictInterval, которая является далее описано здесь.

Здесь я использую goats данные из пакета ResourceSelection, который содержит используемые и доступные местоположения (с кодами 1 и 0 соответственно) и значения интересующих ковариат (например, высота, уклон и т. Д.) Для построения воспроизводимой модели.

Пакеты

library(lme4)
library(ResourceSelection)
library(merTools)

Df содержит использованные и доступные локации для 10 животных.

table(goats$ID, goats$STATUS)
       0    1
  1  1404  702
  2  1112  556
  3  1026  513
  4   634  317
  5  1272  636
  6  1456  728
  7  1394  697
  8  1468  734
  9  1608  804
  10 1302  651

Ниже приведен пример модели со случайным перехватом, указанным для индивидуума (ID). ковариаты центрируются и масштабируются в рамках подгонки модели с помощью scale().

 mod <- glmer(STATUS ~ scale(ELEVATION) + scale(SLOPE) + scale(ET) + scale(HLI) + (1|ID),
             family=binomial, data = goats, verbos = 1) 
summary(mod)

Теперь я хочу спрогнозировать диапазон ПОДЪЕМА со всеми другими ковариатами на их среднем уровне. Поскольку я работаю с масштабированными и центрированными ковариатами, среднее значение равно 0. Минимальное и максимальное значения масштаба (ELEVATION) равны -1,97056 и 2,52926, которые я использую для создания новых данных прогнозирования, представленных ниже.

PredDat <- data.frame(ELEVATION = seq(-1.97056, 2.52926, length.out = 1000),
                      SLOPE = 0,
                      ET = 0,
                      HLI = 0)

Хотя я могу генерировать прогнозы вручную, я не уверен, как оценить 95-процентный доверительный интервал, когда для больших наборов данных используются методы начальной загрузки (рекомендуется здесь) недопустимо. Можно ли с помощью функции predictInterval генерировать предельные прогнозы и CI без учета отдельного случайного эффекта? Приведенный ниже код приводит к ошибке Error in eval(expr, envir, enclos) : object 'ID' not found, поскольку в кадре данных PredDat нет идентификатора. Если я добавлю идентификатор во фрейм данных PredDat, код будет работать нормально.

Preds <- predictInterval(mod, newdata = PredDat, type = "probability")

Мы будем очень благодарны за любые предложения о том, как генерировать предельные прогнозы на основе объекта glmer.

Основная информация о сеансе вставлена ​​под FYI.

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

other attached packages:
[1] merTools_0.2.0          plyr_1.8.3             
[3] arm_1.8-6               MASS_7.3-45            
[5] ResourceSelection_0.2-5 lme4_1.1-10            
[7] Matrix_1.2-3            sp_1.2-1    

person B. Davis    schedule 03.05.2016    source источник


Ответы (1)


Сопровождающий пакета для merTools здесь. То, как мы реализовали эту функцию, непросто, но это возможно.

Вам нужно добавить шаг, чтобы добавить средний случайный эффект к вашему data.frame. В большинстве случаев средний случайный эффект должен быть равен 0 или достаточно близок, чтобы приблизительно соответствовать тому, что вы ищете. Для этого вам нужно просто немного изменить код и использовать функцию REquantile из merTools:

medEff = REquantile(mod, quantile = 0.5, 
                    groupFctr = "ID", 
                    term = "(Intercept)")

PredDat <- data.frame(ELEVATION = seq(-1.97056, 2.52926, length.out = 1000),
                      SLOPE = 0, ET = 0, HLI = 0, ID = medEff)

Preds <- predictInterval(mod, newdata = PredDat, type = "probability")

Это дает прогноз, но включает неопределенность в отношении случайного эффекта, включая средний случайный эффект, равный 0. В приведенном выше примере это приводит к размыванию эффекта переменной ELEVATION по наблюдениям, поскольку средний случайный эффект оценивается не очень точно. Итак, это может быть не то, что вам нужно.

Кроме того, если у вас есть более сложная спецификация случайных эффектов с наклонами и пересечениями, тогда этот подход становится сложнее, потому что средний эффект для точки пересечения может быть равен 0, но не для наклона.

Если вы действительно хотите просто зафиксировать дисперсию в прогнозе, основанную только на фиксированных эффектах и ​​их неопределенности - что-то с тех пор, как я узнал о создании пакета, довольно распространено - есть способы сделать это за пределами merTools. Это не самый элегантный вариант, но именно это происходит под капотом predictInterval, чтобы получить изменчивость прогнозов фиксированного эффекта:

PredDat <- data.frame(Intercept = 1, 
           ELEVATION = seq(-1.97056, 2.52926,length.out = 1000), 
           SLOPE = 0, ET = 0, HLI = 0)

 fe.tmp <- fixef(mod)
 vcov.tmp <- as.matrix(vcov(mod))
 n.sims <- 1000
 sigmahat <- rep(1, n.sims)

 # Make n.sims draws for each element of the fixed effects

 betaSim <- abind::abind(lapply(1:n.sims,
  function(x) mvtnorm::rmvnorm(n = 1, mean = fe.tmp, 
       sigma = sigmahat[x]*vcov.tmp, method = "chol")), along=1)
# Calculate n.sims predictions for each row in PredDat
fixed <- as.matrix(PredDat) %*% t(betaSim)
# For each row (observation) in PredDat calculate the median, upr and lwr 
Preds <- data.frame(fit = apply(fixed, 1, median), 
                upr = apply(fixed, 1, quantile, 0.9), 
                lwr = apply(fixed, 1, quantile, 0.1))
# Calculate the probability from the linear predictor
Preds <- apply(Preds, 2, invlogit)

У вас должно получиться что-то вроде этого:

head(Preds)

     fit       upr       lwr
1 0.1860053 0.2482220 0.1427370
2 0.1860058 0.2482226 0.1427373
3 0.1860062 0.2482231 0.1427377
4 0.1860066 0.2482237 0.1427380
5 0.1860071 0.2482242 0.1427384
6 0.1860075 0.2482248 0.1427388

Это не включает какую-либо неопределенность на уровне наблюдения, связанную с вариациями факторов группирования или самой модели.

person jknowles    schedule 04.05.2016
comment
спасибо за информативный и подробный ответ. Очень полезно. В самом деле, 2-й кусок вашего кода - это то, что я искал. - person B. Davis; 05.05.2016
comment
Я собираюсь добавить это как расширение для включения в merTools в будущем. Нам кажется, что включить в predictInterval - person jknowles; 06.05.2016