Multinomiale Logit

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Multinomiale Logit

Beitrag von Rnest2 »

HAllo Zusammen,
wie ihr euch es nicht vorstellen könnt, habe ich ein Problem.. :lol: :?
Nämlich mit der Codierung einer Multinomialer logistischen Regression und (später) deren Interpretation.

Aber vorab möchte ich mich bei jogo für seine Hilfe und Tipps bei meinem vorherigen Problem bedanken. Das hat bis dato wunderbar funktioniert und mir sehr geholfen.

Nun bin ich aber an einem Punkt angekommen, an dem ich (zumindest auf diesem Weg) nicht mehr weiterkomme.
Ich möchte für eine Analyse eine MNlogit durchführen, die im auf dem Lehrbuch von Wollschläger(2020): "Grundlagen der Datenanalyse mit R", S. 373ff. basiert. (Wenn es entsprechend der Forumregeln ok ist, poste ich gerne die entsprechenden Seiten in einem späteren Post.)
Meinen gesamten Datensatz möchte ich nicht gerne offenlegen, hoffe das ist verständlich. Dafür habe ich aber ein Sample/Subset erstellt.
av_uv_sample.csv
(11.72 KiB) 129-mal heruntergeladen
Ich denke, damit könnt ihr soweit alles nachvollziehen, und mit im Idealfall Ratschläge/Hinweise/Hilfestellungen geben.

Hier ist mein bisheriger Code..

Code: Alles auswählen


```{r include=FALSE}
library(data.table) # fread
library(VGAM) # vglm
library(DescTools) # für PseudoR2
```

```{r}
av_uv <- fread("av_uv_sample.csv")
```

```{r}
# names(av_uv)
# av_uv$c1_school_closing
table(av_uv$c1_school_closing)
```
# Test mit Politischen Faktoren und Maßnahme (AV) c1

```{r}
logitc1p <- vglm(c1_school_closing ~ system_of_government + system_of_internal_government + chambers + x1p_gov_ind, family=multinomial(refLevel="0"), model = TRUE, data = av_uv)
summary(logitc1p)
```

```{r}
exp(coef(logitc1p)) # odds ratios
```

```{r}
deviance(logitc1p)
AIC(logitc1p)
PseudoR2(logitc1p, which = "Nagelkerke") # hierfür "vglm-model = TRUE" gestellt 
```

```{r}
sumc1p <- summary(logitc1p)
coefc1p <- coef(sumc1p)
coefc1p
```

```{r}
confint(logitc1p)
```
# ANOVA (Im Buch von zwei Prädiktoren auf einen im FitR-Modell, hier Minus x1p_gov_ind)

```{r}
logitc1pFitR <- vglm(c1_school_closing ~ system_of_government + system_of_internal_government + chambers, family=multinomial(refLevel="1"), model = TRUE, data = av_uv)
anova(logitc1pFitR, logitc1p, type = "I")
```

```{r}
c1categ <- predict(logitc1p, type="response") # vorhergesagte Kategorienwahrscheinlichkeiten
# c1categ
head(c1categ)
```
```{r}
colMeans(c1categ) # mittlere vorhergesagte Kategorien-Wahrscheinlichkeiten
```

```{r}
proportions(table(av_uv$c1_school_closing)) # empirische relative Kategorien-Häufigkeiten
```


```{r}
c1categhat <- levels(av_uv$c1_school_closing)[max.col(c1categ)]
head(c1categhat) # -> [b]NULL (Fehler?)[/b]
c1categhat # -> [b]NULL (Fehler?)[/b]
```
# Kontingenztafel

```{r}
[b]# Fehler aus c1categhat führt sich hier fort[/b]
c1hat <- factor(c1categhat, levels = levels(av_uv$c1_school_closing))
c1tab <- table(av_uv$c1_school_closing, c1hat, dnn = c("c1_school_closing", "c1hat"))
addmargins(c1tab)
```

```{r}
CCR <- sum(diag(c1tab)) / sum(c1tab)
```
Den Fehler den ich nicht finde, bzw. nicht nachvollziehen kann ist bei "c1categhat" auch FETT markiert. Da gibt R nur "NULL" raus und damit kann der weitere Code nicht ausgeführt werden..

Würde mich freuen, wenn jemand von euch einen Rat für mich hat, wie ich das auf diesem Weg hinbekomme.

Vielen Dank und einen entspannten Abend auch allen..

Danke R2
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Multinomiale Logit

Beitrag von EDi »

Ich würde diese Zeile

Code: Alles auswählen

levels(av_uv$c1_school_closing)[max.col(c1categ)]

In die Einzelteile zerlegen und schauen ob das meinen Erwartungen entspricht.
Was gibt z.b. max.col(c1categ) zurück?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Multinomiale Logit

Beitrag von Rnest2 »

EDi hat geschrieben: Fr Mai 07, 2021 7:15 am Ich würde diese Zeile

Code: Alles auswählen

levels(av_uv$c1_school_closing)[max.col(c1categ)]

In die Einzelteile zerlegen und schauen ob das meinen Erwartungen entspricht.
Was gibt z.b. max.col(c1categ) zurück?
Laut Vorlage: "Die vorhergesagten Kategorien selbst lassen sich aus den vorhergesagten Kategorienwahrscheinlichkeiten
bestimmen, indem pro Beobachtung die Kategorie mit der maximalen
vorhergesagten Wahrscheinlichkeit herangezogen wird. Das zeilenweise Maximum einer
Matrix gibt max.col(Matrix) aus."

Bei mir interpretier ich das so:
"c1categ" wird hieraus berechnet

Code: Alles auswählen

c1categ <- predict(logitc1p, type="response")
daraus soll dann mit der von dir auserwählten Zeilen "c1categhat" berechnet werden..

In Einzelteilen zerlegt, funktioniert

Code: Alles auswählen

c1categhat <- max.col(c1categ)
head(c1categhat)
Jedoch kommt so angewandt im nächsten Chunk die nächste Fehlermeldung.
Fehler in rep_len(FALSE, n.mar * runl) : ungültiger 'length.out' Wert
3.
rep_len(FALSE, n.mar * runl)
2.
expand.one(A = new.A, margin = margin, FUN = FUN[], fnames = fnames[])
1.
addmargins(c1tab)

Code: Alles auswählen

levels(av_uv$c1_school_closing)
gibt wieder nur "NULL" aus. Warum verstehe ich nicht.
Ebenso, was die Verknüpfung mit den "[]" bezwecken soll.

Ich suche mal und lese. Freue mich auf eure weitere Hilfe.

Danke
R2
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Multinomiale Logit

Beitrag von EDi »

gibt wieder nur "NULL" aus
Dann bist du schonmal einen Schritt weiter. Nächste Frage: Warum ist das so? Was ist av_uv$c1_school_closing (z.b. mit str untersuchen)? Soll das Null dein? Wo wird es erzeugt?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Rnest2
Beiträge: 11
Registriert: Mi Jan 27, 2021 2:33 pm

Re: Multinomiale Logit

Beitrag von Rnest2 »

Ach f--k, danke.
Ich war mir sicher das ich die Variablen mit "as.factor" "formatiert" habe. Jetzt läuft der Code mit dem Datensatzsample durch.
Mit meinem gesamten Datensatz bekomme ich aber an dieser Stelle

Code: Alles auswählen

c1tab <- table(av_uv$c1_school_closing, c1hat, dnn = c("c1_school_closing", "c1hat"))
folgende Fehlermeldung
Fehler in table(av_uv$c1_school_closing, c1hat, dnn = c("c1_school_closing", : alle Argumente müssen die selbe Länge haben
Liegt wahrscheinlich daran, dass dort ich ein "NA-Ausprägung" dabei habe.. werde mein Sample mal entsprechend präparieren..
gesagt, getan.. Yop, daher kommt der Fehler.. nun bin ich schon mal schlauer..

Habt ihr sonstige Tipps zur MN-Logit?
Ich habe zum einen hier https://www.princeton.edu/~otorres/LogitR101.pdf eine Anleitung gefunden, die auf stargazer verweist. Das läuft beinahe automatisch und ist ziemlich easy. Zum anderen habe ich hier https://www.youtube.com/watch?v=S2rZp4L_nXo eine Anleitung die etwas mehr "Handarbeit" benötigt, aber auch easy läuft..
Antworten