Logistische Regression in R (Odds Ratio)


40

Ich versuche eine logistische Regressionsanalyse durchzuführen R. Ich habe Kurse besucht, die dieses Material mit STATA behandeln. Ich finde es sehr schwierig, die Funktionalität in zu replizieren R. Ist es in diesem Bereich ausgereift? Es scheint wenig Dokumentation oder Anleitung zu geben. Die Erstellung der Odds Ratio-Ausgabe erfordert anscheinend die Installation epicalcund / oder epitoolsund / oder andere, von denen keine zur Arbeit kommen kann, veraltet ist oder keine Dokumentation vorliegt. Ich habe glmdie logistische Regression durchgeführt. Anregungen wären willkommen.

Ich mache das besser zu einer echten Frage. Wie führe ich eine logistische Regression durch und erzeuge Quotenrationen in R?

Folgendes habe ich für eine univariate Analyse getan:

x = glm(Outcome ~ Age, family=binomial(link="logit"))

Und für multivariate:

y = glm(Outcome ~ Age + B + C, family=binomial(link="logit"))

Ich habe dann sieht x, y, summary(x)und summary(y).

Ist x$coefficientsirgendetwas wert?

Antworten:


36

Wenn Sie die geschätzten Effekte als relative Quotenverhältnisse interpretieren möchten, tun exp(coef(x))Sie einfach Folgendes (ergibt , die multiplikative Änderung des Quotenverhältnisses für wenn die mit verbundene Kovariate um 1 zunimmt). Für Profilwahrscheinlichkeitsintervalle für diese Menge können Sie Folgendes tun y = 1 βeβy=1β

require(MASS)
exp(cbind(coef(x), confint(x)))  

EDIT: @caracal war schneller ...


1
+1 für @ Fabians Vorschlag. Ein schlechter Weg , dies zu tun , die ähnliche Intervalle in der Regel liefert , ist das Intervall auf der Logit - Skala zu berechnen und dann in die Odds Skala umwandeln: cbind( exp(coef(x)), exp(summary(x)$coefficients[,1] - 1.96*summary(x)$coefficients[,2]), exp(summary(x)$coefficients[,1] + 1.96*summary(x)$coefficients[,2]) ). Es gibt auch die Delta-Methode: ats.ucla.edu/stat/r/faq/deltamethod.htm
vom

42

Sie haben Recht, dass die Ausgabe von R normalerweise nur wichtige Informationen enthält und weitere Informationen separat berechnet werden müssen.

N  <- 100               # generate some data
X1 <- rnorm(N, 175, 7)
X2 <- rnorm(N,  30, 8)
X3 <- abs(rnorm(N, 60, 30))
Y  <- 0.5*X1 - 0.3*X2 - 0.4*X3 + 10 + rnorm(N, 0, 12)

# dichotomize Y and do logistic regression
Yfac   <- cut(Y, breaks=c(-Inf, median(Y), Inf), labels=c("lo", "hi"))
glmFit <- glm(Yfac ~ X1 + X2 + X3, family=binomial(link="logit"))

coefficients()gibt Ihnen die geschätzten Regressionsparameter . Es ist jedoch einfacher, zu interpretieren (mit Ausnahme des Intercept).bjexp(bj)

> exp(coefficients(glmFit))
 (Intercept)           X1           X2           X3 
5.811655e-06 1.098665e+00 9.511785e-01 9.528930e-01

Um die Odds Ratio zu erhalten, benötigen wir die Klassifikationskreuztabelle des ursprünglichen dichotomen DV und die vorhergesagte Klassifikation gemäß einer Wahrscheinlichkeitsschwelle, die zuerst ausgewählt werden muss. Sie können die Funktion auch ClassLog()im Paket sehen QuantPsyc(wie in einer verwandten Frage erwähnt ).

# predicted probabilities or: predict(glmFit, type="response")
> Yhat    <- fitted(glmFit)
> thresh  <- 0.5  # threshold for dichotomizing according to predicted probability
> YhatFac <- cut(Yhat, breaks=c(-Inf, thresh, Inf), labels=c("lo", "hi"))
> cTab    <- table(Yfac, YhatFac)    # contingency table
> addmargins(cTab)                   # marginal sums
     YhatFac
Yfac   lo  hi Sum
  lo   41   9  50
  hi   14  36  50
  Sum  55  45 100

> sum(diag(cTab)) / sum(cTab)        # percentage correct for training data
[1] 0.77

Für das Odds Ratio können Sie entweder das Paket verwenden vcdoder die Berechnung manuell durchführen.

> library(vcd)                       # for oddsratio()
> (OR <- oddsratio(cTab, log=FALSE)) # odds ratio
[1] 11.71429

> (cTab[1, 1] / cTab[1, 2]) / (cTab[2, 1] / cTab[2, 2])
[1] 11.71429

> summary(glmFit)  # test for regression parameters ...

# test for the full model against the 0-model
> glm0 <- glm(Yfac ~ 1, family=binomial(link="logit"))
> anova(glm0, glmFit, test="Chisq")
Analysis of Deviance Table
Model 1: Yfac ~ 1
Model 2: Yfac ~ X1 + X2 + X3
  Resid. Df Resid. Dev Df Deviance P(>|Chi|)    
1        99     138.63                          
2        96     110.58  3   28.045 3.554e-06 ***

2
Danke - ich muss Ihre Antwort sorgfältig durchsehen. In STATA kann man einfach laufen logitund logisticQuoten und Konfidenzintervalle erhalten. Ich bin etwas frustriert, dass dies so kompliziert und ungewöhnlich erscheint R. Kann ich einfach die exp(cbind(coef(x), confint(x)))Antwort von Fabians unten verwenden, um die OD und CI zu erhalten? Mir ist nicht klar, was Ihre Antwort liefert?
SabreWolfy

3
@ SabreWolfy Ich war mir nicht sicher, auf welches ODER Sie sich beziehen: Ursprünglich dachte ich, Sie meinen das ODER aus der Klassifikationstabelle, die die tatsächliche Kategoriemitgliedschaft mit der vorhergesagten Mitgliedschaft vergleicht (der cTabTeil in meiner Antwort). Aber jetzt verstehe ich, dass Sie wahrscheinlich nur die meinen: Wie Fabians erklärte, entspricht Exp dem Faktor, um den sich die vorhergesagten Quoten ändern, wenn um 1 Einheit zunimmt. Dies ist das Verhältnis der Gewinnchancen "nach der Erhöhung um 1 Einheit" zu "vor der Erhöhung um 1 Einheit". Also ja, du kannst einfach Fabians Antwort verwenden. exp(bj)exp(bj)Xj
Karakal

4
@ SabreWolfy Ich finde es frustrierend, dass Leute auf einen einzelnen Knopf in Stata / SAS / SPSS usw. klicken und Quotenverhältnisse abrufen können (FIT-Statistiken einfügen, Typ III SS, was auch immer Sie hier mögen), ohne eine Ahnung zu haben, was es bedeutet / wie man es berechnet / ob es in einer bestimmten Situation von Bedeutung ist / und (was vielleicht noch wichtiger ist) ohne über Grundkenntnisse der Sprache selbst zu verfügen.
Rawr


5

Das epiDisplay-Paket erledigt dies sehr einfach.

library(epiDisplay)
data(Wells, package="carData")
glm1 <- glm(switch~arsenic+distance+education+association, 
            family=binomial, data=Wells)
logistic.display(glm1)
Logistic regression predicting switch : yes vs no 

                       crude OR(95%CI)         adj. OR(95%CI)         P(Wald's test) P(LR-test)
arsenic (cont. var.)   1.461 (1.355,1.576)     1.595 (1.47,1.731)     < 0.001        < 0.001   

distance (cont. var.)  0.9938 (0.9919,0.9957)  0.9911 (0.989,0.9931)  < 0.001        < 0.001   

education (cont. var.) 1.04 (1.021,1.059)      1.043 (1.024,1.063)    < 0.001        < 0.001   

association: yes vs no 0.863 (0.746,0.999)     0.883 (0.759,1.027)    0.1063         0.1064    

Log-likelihood = -1953.91299
No. of observations = 3020
AIC value = 3917.82598

Gibt es eine Möglichkeit, die logistische Darstellung mit einer Latexfolie wie outregoder zu kombinieren xtable?
Seriöser Fehlname vor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.