Исправлены эффекты с ggeffect () - PullRequest
1 голос
/ 31 января 2020

Мне интересно, есть ли у кого-нибудь опыт использования ggeffect() с множеством фиксированных эффектов. Хотя моя независимая переменная тесно связана с моей зависимой переменной, я получаю эти огромные доверительные интервалы, когда добавляю в состояние фиксированные эффекты.

Игрушечный пример:

set.seed(200)

indvar <- runif(500, min = 0, max = .5)
state <- as.factor(rep(c(1:50), 10))
statev <- as.integer(state) * runif(500, 0, 0.02)
depvar <- round(indvar + statev)

data <- data.frame(indvar, state, depvar)

m1 <- glm(depvar ~ indvar, data = data, family = "binomial")

margin <- ggeffect(m1, "indvar")

plot(margin)

Plot with expected confidence intervals

Это дает мне хорошие чистые доверительные интервалы вокруг независимой переменной. Однако, как только я добавлю в состояние фиксированные эффекты, доверительный интервал существенно увеличится с 0 до 1. Несмотря на то, что сохраняется сверхсильная связь.

m2 <- glm(depvar ~ indvar + state, data = data, family = "binomial")

margin <- ggeffect(m2, "indvar")

plot(margin)

Plot with super wide confidence intervals

Мысли высоко ценится!

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

У вас есть проблема полное разделение (см. Также этот перекрестный вопрос ), которая, как показано в ответе @ Ewen, допускает стандартные ошибки Вальда для параметров (и, следовательно, для Вальда). доверительные интервалы по прогнозам) смехотворно велики. (Чтобы ответить на один из ваших вопросов в комментариях, полное разделение происходит только в GLM, а не в линейных моделях.)

В принципе, вы можете справиться с этим, используя вашу текущую модель, вычислив доверительные интервалы на основе прогнозов, основанных на начальной загрузке. или основанный на вычислении профилей вероятности предсказаний. Они оба немного хитры (для начальной загрузки потребуется стратифицированная bootstrap, где вы перекомпилируете ответы каждого состояния с заменой; доверительные интервалы профиля для прогнозируемых значений потребуют реализации ограниченного метода нелинейной оптимизации ...).

A (гораздо) более простое решение, если вы хотите немного изменить свою модель, это использовать штраф GLM (Ферт), например, как это реализовано в пакете brglm2 :

library(brglm2)
m2B <- update(m2, method=brglmFit)
plot(ggeffect(m2B,"indvar"))

enter image description here

0 голосов
/ 31 января 2020

Спасибо за публикацию.

При настройке данных и модели модель не сходится (оценки состояний очень неточны).

Таким образом, когда вы генерируете предельные вероятности для своей объясняющей переменной, содержащей одну константу состояния (состояние 1 по умолчанию), вы, естественно, получаете множество вариаций.

> summary(m2)

Call:
glm(formula = depvar ~ indvar + state, family = "binomial", data = data)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-2.53196  -0.53627  -0.00006   0.54430   2.20165  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -21.8541  1854.7192  -0.012    0.991    
indvar        10.7116     1.1952   8.962   <2e-16 ***
state2        -0.1773  2577.7112   0.000    1.000    
state3         0.2353  2534.9784   0.000    1.000    
state4         0.5125  2569.5228   0.000    1.000
.
.
.   

Вы не упоминаете никакого фона, но вы можете sh рассматривать состояние как случайный эффект (модель случайного перехвата).

library(lme4)
m2 <- glmer(depvar ~ indvar + (1 | state), data = data, family = "binomial")

Редактировать

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...