Предупреждение в анализе GLM - PullRequest
1 голос
/ 25 апреля 2020

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

glm.fit: подогнанные вероятности численно 0 или 1 произошло glm.fit: алгоритм не выполнил сходятся glm.fit: подогнанные вероятности численно 0 или 1 произошло

Затем я создал фрейм данных моделирования и запустил его так же, как и для своего фактического набора данных без предупреждения. Ниже приведены мой код и набор данных моделирования. Любая помощь будет принята с благодарностью! Спасибо!

library(tidyverse)
library(broom)
data <- data.frame(B = c("m","m","m","m","m", "m", "f","f","f","f","f"),
                   G= c("s","s","s","u","u", "u", "k","k","k","r","r"),
                   g1 = c(35, 2, 3, 4, 5, 6, 7, 10, 12, 41, 76), 
                   g2 = c(20, 2, 7, 2, 8, 5, 5, 3, 7, 2, 12), 
                   g3 = c(5, 0, 4, 5, 2, 4, 8, 9, 20, 1, 11,
                   g4 = c(1,3,4,5,7,3,1,5,7,3,10),
                   g5=  c(20,23, 27, 35, 12, 10, 17, 24, 21, 15, 16)))
data %>% 
  pivot_longer(-c(1:3)) %>% 
  group_split(name) %>% 
  set_names(nm = map(., ~ first(.x$name))) %>% 
  map(~ tidy(glm(factor(data$B) ~ value,family="binomial", data = .))) %>% 
  map(~ filter(., p.value > 0.05)) %>% 
  bind_rows(.id = "var")```


1 Ответ

0 голосов
/ 25 апреля 2020

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

Существует несколько реализаций, которые добавляют небольшой штраф к вероятности для получения оценок для всех параметров. Посмотрите Ферт Логисти c регресс. В R это может быть обработано функцией logistf() из пакета logistf.

Замените

glm(factor(data$B) ~ value,family="binomial", data = .)

в вашем коде на

logistf(factor(data$B) ~ value, data = .)

, и вы должен быть запущен. (Не забудьте сначала загрузить пакет).

Следует отметить, что разделение не обязательно является проблемой само по себе. Только если вам нужны оценки параметров.

На самом деле вы можете увидеть проблему разделения, если табулировать B против G:

xtabs(~ B + G, data=data)

Это приводит к

   G
B   k r s u
  f 9 6 0 0
  m 0 0 9 9

Итак, вы можете видеть, что если вы знаете, скажем, G, то вы знаете результат B.

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