Regresja logistyczna: zmienne zgrupowane i niezgrupowane (za pomocą R)

9

Czytam A. Agresti (2007), An Introduction to Categorical Data Analysis , 2nd. wydanie i nie jestem pewien, czy dobrze rozumiem ten ustęp (p.106, 4.2.1) (chociaż powinno to być łatwe):

W Tabeli 3.1 dotyczącej chrapania i chorób serca w poprzednim rozdziale 254 pacjentów zgłaszało chrapanie każdej nocy, z czego 30 miało choroby serca. Jeśli plik danych zawiera zgrupowane dane binarne, wiersz w pliku danych zgłasza te dane jako 30 przypadków choroby serca na podstawie próbki o wielkości 254. Jeśli plik danych zawiera niepogrupowane dane binarne, każda linia w pliku danych odnosi się do osobny podmiot, więc 30 linii zawiera 1 dla choroby serca, a 224 linie zawiera 0 dla choroby serca. Szacunki ML i wartości SE są takie same dla każdego typu pliku danych.

Przekształcenie zestawu niepogrupowanych danych (1 zależne, 1 niezależne) zajęłoby więcej niż „linię” obejmującą wszystkie informacje !?

W poniższym przykładzie tworzony jest (nierealistyczny!) Prosty zestaw danych i budowany jest model regresji logistycznej.

Jak wyglądałyby zgrupowane dane (karta zmiennych?)? Jak można zbudować ten sam model przy użyciu zgrupowanych danych?

> dat = data.frame(y=c(0,1,0,1,0), x=c(1,1,0,0,0))
> dat
  y x
1 0 1
2 1 1
3 0 0
4 1 0
5 0 0
> tab=table(dat)
> tab
   x
y   0 1
  0 2 1
  1 1 1
> mod1=glm(y~x, data=dat, family=binomial())
Kra
źródło

Odpowiedzi:

11

Tabela 3.1 została przedstawiona poniżej:

wprowadź opis zdjęcia tutaj

Agresti rozpatrzył następujące wyniki liczbowe za poziom chrapania: {0,2,4,5}.

Istnieją dwa sposoby dopasowania GLM do R: albo twój wynik jest podawany jako wektor 0/1 lub czynnik z dwoma poziomami, z predyktorami na podstawie twojej formuły; lub możesz podać macierz z dwiema kolumnami liczb odnoszących się do sukcesu / niepowodzenia jako wartości LH w formule. Ten ostatni odpowiada temu, co Agresti nazywa „zgrupowanymi” danymi. Trzecią metodą, która ma również zastosowanie do ustawień pogrupowanych, byłoby użycie weights=argumentu do wskazania, ile pozytywnych i negatywnych wyników zaobserwowano dla każdej kategorii tabeli klasyfikacji.

Dane w widoku macierzy brzmiałyby:

snoring <- matrix(c(24,35,21,30,1355,603,192,224), nc=2)

Na tej podstawie możemy wygenerować data.frameformat długi (2484 wiersze = sum(snoring)obserwacje) w następujący sposób:

snoring.df <- data.frame(snoring=gl(4, 1, labels=c("Never", "Occasional",
                                                   "Nearly every night", 
                                                   "Every night")),
                         disease=gl(2, 4, labels=c("Yes", "No")),
                         counts=as.vector(snoring))
snoring.df <- snoring.df[rep(seq_len(nrow(snoring.df)), snoring.df$counts), 1:2]

A następujące dwa modele przyniosą identyczne wyniki:

levels(snoring.df$snoring) <- c(0, 2, 4, 5)
y <- abs(as.numeric(snoring.df$disease)-2)
x <- as.numeric(as.character(snoring.df$snoring))
fit.glm1 <- glm(y ~ x, family=binomial)

fit.glm2 <- glm(snoring ~ c(0, 2, 4, 5), family=binomial)

To jest, logit[π^(x)]=3.87+0.40x, używając notacji Agresti.

Druga notacja jest często używana w tabeli zagregowanej z instrukcją typu cbind(a, b), gdzie ai bsą kolumnami liczb dla zdarzenia binarnego (patrz np. Uogólnione modele liniowe ). Wygląda na to, że działałoby to również przy użyciu tabeli zamiast macierzy (jak w twoim przykładzie), np

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)
chl
źródło
Dziękuję Ci bardzo! Idealna odpowiedź! Mam jeden prosty dodatek: Zamiast as.tabela (chrapanie) sugerowałbym tabelę (x, y, dnn = c („chrapanie”, „choroba”)) jako ekwiwalent mojego przykładu, ponieważ przekształcenie niepogrupowane w pogrupowane dane były również interesujące.
FloE
1
@FloE Masz rację. Nadal będziesz musiał zbudować swój rh ad hoc . Na przykład, coś podobnego tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)działałoby (odwrócenie znaku minus dla współczynników, ponieważ „Tak” ma kod 0 zamiast 1).
chl