Функция R GLM, исключающая данные - PullRequest
1 голос
/ 07 февраля 2020

Я создаю регрессионную модель логистики c, предсказывающую факторизованную двоичную переменную результата (да / нет), но сталкиваюсь со странной проблемой с отсутствующими данными. По сути, я получаю совсем другой R-квадрат, когда вручную отфильтрую наблюдения из модели перед запуском функции GLM по сравнению с тем, чтобы позволить GLM выполнить свое собственное действие na.action. Ниже приведен пример кода:

outcome <- rnorm(100)
outcome <- ifelse(outcome <= 0.5, 0, 1)
var1 <- rnorm(100)
var2 <- rnorm(100)
var3 <- c(rnorm(88), NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
df <- data.frame(cbind(outcome, var1, var2, var3))
df$outcome <- factor(df$outcome)

model_1 <- glm(outcome ~., data = df, family = "binomial")
nagelkerke(model_1)

Результат model_1:

$Pseudo.R.squared.for.model.vs.null
                             Pseudo.R.squared
McFadden                             0.160916
Cox and Snell (ML)                   0.192093
Nagelkerke (Cragg and Uhler)         0.261581

Теперь я попытался отфильтровать случаи заранее и получить совершенно другой R-квадрат:

df_clean <- filter(df, is.na(var3) == FALSE)

model_2 <- glm(outcome ~., data = df_clean, family = "binomial")
nagelkerke(model_2)

Результат model_2:

$Pseudo.R.squared.for.model.vs.null
                             Pseudo.R.squared
McFadden                            0.0110171
Cox and Snell (ML)                  0.0123142
Nagelkerke (Cragg and Uhler)        0.0182368

Почему это так, учитывая, что GLM по умолчанию na.action = na.omit (который я интерпретирую как пропущенные случаи с пропущенными значениями)? Разве это не то же самое, что предварительно отфильтровать эти случаи и затем запустить модель?

Кроме того, я попытался изменить na.action на «na.omit» и «na.exclude» и получить одинаковые выводы. Спасибо за вашу помощь!

1 Ответ

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

Вы правы в том, что na.omit пропустит пропущенные значения и запустит вашу модель. Фактически, вы должны видеть идентичные выходные данные при запуске summary(model_1) и summary(model_2).

Однако используемая вами функция nagelkerke сталкивается с проблемами, когда в одной переменной из исходной переменной есть значения NA набор данных. Оттуда документация ...

Установленная модель и нулевая модель должны быть правильно вложены. То есть члены одного должны быть подмножеством другого, и они должны иметь одинаковый набор наблюдений. Одна проблема возникает, когда есть значения NA в одной переменной, но не в другой, и наблюдения с NA удаляются при подгонке модели. В результате могут быть подогнаны и нулевые модели с различными наборами наблюдений. Если для restrictNobs задано значение TRUE, то в нулевой модели используются только наблюдения в модели соответствия. Похоже, это работает для моделей lm и некоторых моделей glm, но вызывает сбой функции для других типов объектов модели

Если вы установите restrictNobs в TRUE, вы должны увидеть тот же вывод

...