logistische Regression mit mehreren Modellen

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
MaRi
Beiträge: 3
Registriert: Di Jan 26, 2021 7:38 am

logistische Regression mit mehreren Modellen

Beitrag von MaRi »

Guten Tag Zusammen,

ich bin leider ein absoluter R-Neuling und befasse mich aktuell mit der logistischen Regression.
Im Grunde komme ich auch zu einem Ergebnisse, aber um es zu optimieren möchte ich einen anderen weg ausprobieren, für den mir leider die Programmierkenntnisse fehlen. Auch im Netz habe ich leider keine Methode gefunden, die mein Problem lösen könnte.
Folgende Idee:
ich habe ca. 5 unabhängige Variablen für mein Modell. Ich möchte am Ende ZWEI (oder evtl. drei) Modelle haben, die abhängig von der Ausprägung einer nominalen Variable auf meine Prognosedaten angewendet werden. Als Output benötige ich EINE .csv Datei, in der die Prognosedaten in exakt der gleichen Reihenfolge ausgegeben werden, wie in der Datenquelle. Wenn ich manuell drei getrennte Modelle erzeuge, indem ich die Daten vorher entsprechend filtere, komme ich auf gute Ergebnisse. Aber ich muss leider diese Ausgabedatei so erzeugen, dass eine neue csv. Datei entsteht, in der die Werte in der gleichen Reihenfolge, wie in der Anwendungsdatei aufgelistet werden.

Variable eist nominal-skaliert mit 3-leveln
glm() soll mir nun drei Modelle berechnen, für jede Ausprägung von Variable e ein spezifisches mit den restlichen vier Variablen.
Oder ich bleibe bei meiner händischen Filterung und vier Modellen, dann benötige ich aber eine Lösung für predict(), damit es je nach Ausprägung von Variable e ein anderes Modell anwendet ...

Version 1

Code: Alles auswählen

#Modellbildung - 3 verschiedene Modelle je nach Ausprägung von e (nominal 3-lvl) ?!
Modell <- glm(y ~ a+ b+ c+ d+ e, family="binomial", data = Training)

# Ausgegeben wird die geschätzte Wahrscheinlichkeit
Ergebnis<- predict(Modell, newdata = Anwendung, type = "response")

# Zuordung zu Ja / Nein
Ergebnis <- ifelse(Ergebnis > 0.5, "Ja", "Nein")

Version 2

Code: Alles auswählen

#Modellbildung
Training.m <- filter(Training, e=="m")  
Training.n <- filter(Training, e=="n") 
Training.o <- filter(Training, e=="o")
Modell.m <- glm(y ~ a + b + c + d, family="binomial", data = Training.m)
Modell.n <- glm(y ~ a + b + c + d, family="binomial", data = Training.n)
Modell.o <- glm(y ~ a + b + c + d, family="binomial", data = Training.o)

# Ausgegeben wird die geschätzte Wahrscheinlichkeit - predict() muss zwischen Modell m, n und o unterscheiden.
Ergebnis<- predict(Modell, newdata = Anwendung, type = "response")

# Zuordung zu Ja / Nein
Ergebnis <- ifelse(Ergebnis > 0.5, "Ja", "Nein")
ich hoffe man versteht mein Problem einigermaßen? :(

wäre euch für eure Hilfe echt sehr Dankbar.

viele Grüße
Richard
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: logistische Regression mit mehreren Modellen

Beitrag von Athomas »

Versuch mal

Code: Alles auswählen

y ~ e*(a + b + c + d)
MaRi
Beiträge: 3
Registriert: Di Jan 26, 2021 7:38 am

Re: logistische Regression mit mehreren Modellen

Beitrag von MaRi »

ich danke dir für deine schnelle Antwort, habe nun folgendes geschrieben:

Versuch 1

Code: Alles auswählen

Modell <- glm(y ~ e*(a + b + c + d), family="binomial", data = Training)
und erhalte den Fehler

Code: Alles auswählen

Warnmeldung:
glm.fit: Angepasste Wahrscheinlichkeiten mit numerischem Wert 0 oder 1 aufgetreten 
daraufhin habe ich im Netz recherchiert und folgende Lösung verwendet:
Versuch 2

Code: Alles auswählen

Modell <- bayesglm(y ~ e*(a + b + c + d), family="binomial", data = Training)
beides führt mich aber leider nicht zum gewünschten Ergebnis ....
Versuch 1 = AIC 155.5
Versuch 2 = AIC 165.6

Wenn ich die drei Modelle durch die gefilterten Daten einzeln erstelle, wie oben beschrieben, komme ich auf folgende AIC: 82.94 | 4 | 56.44
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: logistische Regression mit mehreren Modellen

Beitrag von Athomas »

Ich wollte einen schnellen Tipp geben, jetzt werde ich in eine Diskussion verstrickt - weil Du kein adäquates Datenmaterial mitlieferst und niemand nachvollziehen kann, was bei Dir passiert!

Ich ärgere mich! (Ergänzung: zu 80% über mich selbst, weil ich mich zu solchen "Schnellschüssen" hinreißen lasse :) )
MaRi
Beiträge: 3
Registriert: Di Jan 26, 2021 7:38 am

Re: logistische Regression mit mehreren Modellen

Beitrag von MaRi »

Athomas hat geschrieben: Di Jan 26, 2021 10:03 am Ich wollte einen schnellen Tipp geben, jetzt werde ich in eine Diskussion verstrickt - weil Du kein adäquates Datenmaterial mitlieferst und niemand nachvollziehen kann, was bei Dir passiert!

Ich ärgere mich! (Ergänzung: zu 80% über mich selbst, weil ich mich zu solchen "Schnellschüssen" hinreißen lasse :) )

Es tut mir leid, wenn ich hier für Unmut gesorgt habe.

Ich habe versucht mein Problem möglichst gut zu beschreiben. Wenn diese Informationen für eine kompetente Antwort nicht ausreichen, freue ich mich auch über diese Anmerkung und ergänze dann ggf. gerne noch die nötigen Informationen.

Es ist auch nicht so, dass ich nicht vorher Lösungen recherchiert hätte. Vielleicht sind diese wirklich nicht hilfreich, oder ich verstehe sie einfach nicht. Nichts desto trotz habe ich hier nur nach Hilfe gesucht und meinen Post nach bestem Wissen und Gewissen verfasst. Und jetzt ...
Ich ärgere mich! (dass ich hier auf eine solch verärgerte Reaktion stoße)


Vielleicht hat dennoch jemand eine Idee, wie ich mein Problem lösen kann oder welche Informationen für eine Problemlösung fehlen?

viele Grüße Richard
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: logistische Regression mit mehreren Modellen

Beitrag von bigben »

Hallo Richard,

Code: Alles auswählen

Warnmeldung:
glm.fit: Angepasste Wahrscheinlichkeiten mit numerischem Wert 0 oder 1 aufgetreten
einen kleinen Syntaxfehler oder ein Missverständnis, wie eine Regression funktioniert, das lässt sich oft leicht mit zwei Codezeilen finden. Leider ist das alles nicht Dein Problem. Irgendwas in Deinen Daten passt nicht zu der logistischen Regression, wie Athomas sie sich vorgestellt hat und wir sitzen hier und können nicht weiter evaluieren, woran das liegen mag.

Kurz gesagt: Diese Warnmeldung tritt gerne bei "complete separation" auf, also wenn das GLM die Antworten perfekt vorhersagen kann. Ansich hat man so Daten ja gern. Die eigentlich interessante Frage ist daher, warum diese Warnung beim großen Gesamtmodel und nicht bei den drei kleinen Modellen aufgetreten ist. Bitte nicht persönlich nehmen, aber mit der Forenerfahrung von Athomas fragt man sich da als erstes, ob bei den kleinen Modellen nicht doch die gleiche Warnmeldung aufgetreten ist und möchte das als erstes ausprobieren. Glaub mir, es sind schon komische Typen hier gewesen.

Die Chance, dass Athomas oder ein anderer Dir hier helfen können würde erheblich steigen, wenn wir Deine Daten hätten oder doch einen ausreichend großen Auszug aus Deinen Daten, dass sich das Problem daran festmachen ließe.

Ich weiß, dass Deine Daten für Dich einen Schatz darstellen, den Du Dir hart erarbeitet hast und das es sich komisch anfühlt, die in einem Forum zu posten. Andererseits haben diese Daten für uns keinerlei Wert. Erstens, weil wir alle nicht in Deinem Forschungsgebiet stecken und zweitens weil die Daten a, b, c, d, und e heißen. Wir können da also nichts publizieren oder verkaufen oder sonstwie verwursten. Persönlich glaube ich, dass wir ohne Daten die obenstehende Warnmeldung weder erklären noch bewerten können. Geh in Dich, sprich eventuell mit der Arbeitsgruppe und dann überleg Dir, welchen Teil der Daten (die Spalten a, b, c, d und e wären gut) Du öffentlich machen kannst.

Wenn das nicht geht, überleg Dir, ob nicht 200 EUR(?) für eine professionelle Beratung zum Thema drin sind durch jemanden, der Dir dann auch eine Verschwiegenheitserklärung anbietet. Der hier hat im Web gute Sachen zu R gemacht und ist auch regelmäßig hier im Forum unterwegs 8-) .

LG,
Bernhard



Nachtrag: Bei der Verwendung des AIC bedenke bitte folgendes. Athomas' Formel "y ~ e*(a + b+ c+ d)` führt dazu, dass 15 Koeffizienten geschätzt werden müssen, anstelle der fünf für jedes Deiner kleinen Modelle, ohne dass insgesamt mehr Information eingebracht würde. Das AIC bestraft eine große Zahl von Prädiktoren, daher war zu erwarten, dass das AIC eher größer ausfällt. Was Du in Wirklichkeit vergleichen solltest ist die Zahl der richtigen und falschen Vorhersagen.

Code: Alles auswählen

test <- data.frame(a = rnorm(300), b = rnorm(300), c = rnorm(300), d = rnorm(300), e = gl(3, 100), y = sample(0:1, 300, TRUE))
head(model.matrix(y ~ e * (a + b+ c + d), data = test))
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: logistische Regression mit mehreren Modellen

Beitrag von Athomas »

Ich habe ein Beispiel konstruiert, an dem wir uns langhangeln können.
Schau mal, was Du davon verstehst, Du kannst gerne konkrete Fragen stellen!

Code: Alles auswählen

#---------- Simulation eines "passenden" Datensatzes ---------------------------
 
dfr <- data.frame(Fall = 1:300, e=sample(c("m","n","o"), 300, replace=TRUE),
                  a = rnorm(300), b = rnorm(300), c = rnorm(300), d = rnorm(300))

Val <- c(0.3, -0.4, 0.6)
names(Val) <- c("m","n","o")

dfr$logodds <- Val[dfr$e] + 0.33*dfr$a - 1.27*dfr$b + 0.88*dfr$c + 0.47*dfr$d
dfr$p <- 1/(1 + exp(-dfr$logodds))

dfr$y <-rbinom(nrow(dfr), 1, dfr$p)

#-------------- Berechnung der Einzelmodelle -----------------------------------

dfm <- dfr[dfr$e=="m", ]
Modell.m <- glm(y ~ a + b + c + d, family="binomial", data = dfm)
summary(Modell.m)

dfn <- dfr[dfr$e=="n", ]
Modell.n <- glm(y ~ a + b + c + d, family="binomial", data = dfn)
summary(Modell.n)

dfo <- dfr[dfr$e=="o", ]
Modell.o <- glm(y ~ a + b + c + d, family="binomial", data = dfo)
summary(Modell.o)

#------------- Berechnung des "Gesamtmodells" ----------------------------------
#------------- "+ 0" wegen besserer Vergleichbarkeit ---------------------------

Modell.ges <- glm(y ~ e*(a + b + c + d) + 0, family="binomial", data = dfr)
summary(Modell.ges)

#------ Einzelpredictions + Zusammenfassung der Einzelmodelle ------------------

dfm$pred.single <- predict(Modell.m)
dfn$pred.single <- predict(Modell.n)
dfo$pred.single <- predict(Modell.o)

Zsamma <- rbind(dfm, dfn, dfo)

#------------- Berechnung der Predictions für das "große" Modell ---------------

dfr$pred.ges  <- predict(Modell.ges)

#------------- Vergleich der beiden Versionen ----------------------------------

Abgleich <- merge(Zsamma, dfr[  , c("Fall", "pred.ges")], by="Fall")
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: logistische Regression mit mehreren Modellen

Beitrag von schubbiaschwilli »

Gude!

Etwas Off-Topic, aber: Mit

Code: Alles auswählen

confusionMatrix(table(prediction, current))$table
komme ich ja an die confusionMatrix - Ich möchte die als Tabelle einem ROC-Plot hinzufügen oder auch einzeln als Plot darstellen, geht das irgendwie? plot.table liefert nur einen Mosaic-Plot.

Dank&Gruß
schubbiaschwilli
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: logistische Regression mit mehreren Modellen

Beitrag von Athomas »

Etwas Off-Topic
Tatsächlich - voll die Confusion!
Bitte an einen besseren Ort verschieben...
Antworten