Logistische Regression: gruppierte und nicht gruppierte Variablen (mit R)

9

Ich lese A. Agresti (2007), Eine Einführung in die kategoriale Datenanalyse , 2 .. Ich bin mir nicht sicher, ob ich diesen Absatz (S.106, 4.2.1) richtig verstehe (obwohl es einfach sein sollte):

In Tabelle 3.1 zu Schnarchen und Herzerkrankungen im vorherigen Kapitel gaben 254 Probanden an, jede Nacht zu schnarchen, von denen 30 an Herzerkrankungen litten. Wenn die Datendatei Binärdaten gruppiert hat, werden diese Daten in einer Zeile in der Datendatei als 30 Fälle von Herzerkrankungen bei einer Stichprobengröße von 254 gemeldet. Wenn die Datendatei nicht gruppierte Binärdaten enthält, bezieht sich jede Zeile in der Datendatei auf a separates Subjekt, also enthalten 30 Zeilen eine 1 für Herzerkrankungen und 224 Zeilen eine 0 für Herzerkrankungen. Die ML-Schätzungen und SE-Werte sind für beide Datendateitypen gleich.

Das Transformieren eines Satzes nicht gruppierter Daten (1 abhängig, 1 unabhängig) würde mehr als "eine Zeile" erfordern, um alle Informationen einzuschließen!?

Im folgenden Beispiel wird ein (unrealistischer!) Einfacher Datensatz erstellt und ein logistisches Regressionsmodell erstellt.

Wie würden gruppierte Daten tatsächlich aussehen (Registerkarte "Variable"?)? Wie könnte dasselbe Modell mit gruppierten Daten erstellt werden?

> 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())
Scholle
quelle

Antworten:

11

Tabelle 3.1 ist nachstehend wiedergegeben:

Geben Sie hier die Bildbeschreibung ein

Agresti berücksichtigte die folgenden numerischen Werte für das Schnarchniveau: {0,2,4,5}.

Es gibt zwei Möglichkeiten, ein GLM mit R anzupassen: Entweder wird Ihr Ergebnis als Vektor von 0/1 oder als Faktor mit zwei Ebenen angegeben, wobei sich die Prädiktoren auf der rechten Seite Ihrer Formel befinden. oder Sie können eine Matrix mit zwei Spalten mit Zählungen für Erfolg / Misserfolg als lhs der Formel angeben. Letzteres entspricht dem, was Agresti als "gruppierte" Daten bezeichnet. Eine dritte Methode, die auch für gruppierte Einstellungen gilt, besteht darin, anhand des weights=Arguments anzugeben, wie viele positive und negative Ergebnisse für jede Kategorie der Klassifizierungstabelle beobachtet wurden.

Daten in der Matrixansicht würden lauten:

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

Daraus können wir ein data.frameLangformat (2484 Zeilen = sum(snoring)Beobachtungen) wie folgt erzeugen :

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]

Die folgenden beiden Modelle liefern identische Ergebnisse:

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)

logit[π^(x)]=3.87+0.40x

Die zweite Notation wird häufig für aggregierte Tabellen mit einer Anweisung wie cbind(a, b), wobei aund bZählspalten für ein binäres Ereignis verwendet werden (siehe z. B. Generalisierte lineare Modelle ). Es sieht so aus, als würde es auch funktionieren, wenn Sie eine Tabelle anstelle einer Matrix verwenden (wie in Ihrem Beispiel), z

glm(as.table(snoring) ~ c(0, 2, 4, 5), family=binomial)
chl
quelle
Vielen Dank! Eine perfekte Antwort! Ich habe eine einfache Ergänzung: Anstelle von as.table (Schnarchen) würde ich die Tabelle (x, y, dnn = c ('Schnarchen', 'Krankheit')) als Äquivalent zu meinem Beispiel vorschlagen, da die Umwandlung von nicht gruppiert in gruppiert erfolgt Daten waren ebenfalls von Interesse.
FloE
1
@FloE Du hast recht. Sie müssen Ihre rhs noch ad hoc erstellen . Zum Beispiel tab <- table(x,y, dnn=c('snoring','disease')); glm(tab ~ as.numeric(rownames(tab)), family=binomial)würde so etwas funktionieren (Minuszeichenumkehr für die Koeffizienten, weil "Ja" mit 0 statt 1 codiert ist).
Chl