Regressione logistica in R (Odds Ratio)


41

Sto cercando di intraprendere un'analisi della regressione logistica in R. Ho frequentato corsi su questo materiale usando STATA. Sto trovando molto difficile replicare la funzionalità in R. È maturo in questa zona? Sembra che ci sia poca documentazione o guida disponibile. La produzione di output odds ratio sembra richiedere l'installazione epicalce / o epitoolse / o altri, nessuno dei quali riesco a mettermi al lavoro, sono obsoleti o mancano di documentazione. Ho usato glmper fare la regressione logistica. Qualsiasi suggerimento sarebbe il benvenuto.

Farò meglio a farne una vera domanda. Come posso eseguire una regressione logistica e produrre razioni di probabilità R?

Ecco cosa ho fatto per un'analisi univariata:

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

E per multivariato:

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

Ho poi guardato x, y, summary(x)e summary(y).

È x$coefficientsdi qualche valore?

Risposte:


36

se vuoi interpretare gli effetti stimati come rapporti di probabilità relativi, fai semplicemente exp(coef(x))(ti dà , la variazione moltiplicativa del rapporto di probabilità per se la covariata associata a aumenta di 1). Per gli intervalli di probabilità del profilo per questa quantità, puoi farloeβy=1β

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

EDIT: @caracal è stato più veloce ...


1
+1 per il suggerimento di @ fabian. Un modo per fare questo inferiore che normalmente produce intervalli simili è calcolare l'intervallo sulla scala logit e poi trasformare la scala quote: 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]) ). C'è anche il metodo delta: ats.ucla.edu/stat/r/faq/deltamethod.htm
bloccato dal

42

Hai ragione sul fatto che l'output di R di solito contiene solo informazioni essenziali e che è necessario calcolarne altre separatamente.

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()fornisce i parametri di regressione stimati . È più facile interpretare (tranne l'intercettazione).BjeXp(Bj)

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

Per ottenere il rapporto di probabilità, abbiamo bisogno della tabella incrociata di classificazione del DV dicotomico originale e della classificazione prevista in base a una soglia di probabilità che deve essere scelta per prima. Puoi anche vedere la funzione ClassLog()nel pacchetto QuantPsyc(come chl menzionato in una domanda correlata ).

# 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

Per il rapporto di probabilità, è possibile utilizzare il pacchetto vcdo eseguire il calcolo manualmente.

> 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
Grazie - dovrò esaminare attentamente la tua risposta. In STATA si può solo correre logite logistice ottenere odds ratio e gli intervalli di confidenza facilmente. Sono un po 'frustrato dal fatto che questo sembra essere così complicato e non standard in R. Posso semplicemente usare exp(cbind(coef(x), confint(x)))dalla risposta di Fabians qui sotto per ottenere OD e CI? Non sono chiaro quale sia la tua risposta?
SabreWolfy,

3
@SabreWolfy Non ero sicuro di cosa ti riferissi a OR: originariamente, pensavo intendessi l'OR dalla tabella di classificazione che confronta l'appartenenza effettiva alla categoria con l'appartenenza prevista (la cTabparte nella mia risposta). Ma ora vedo che probabilmente intendi solo : come ha spiegato fabians, uguale al fattore con cui le probabilità previste cambiano quando aumenta di 1 unità. Questo è il rapporto delle probabilità "dopo l'aumento di 1 unità" a "prima dell'aumento di 1 unità". Quindi sì, puoi semplicemente usare fabians answer. eXp(Bj)eXp(Bj)Xj
Caracal

4
in realtà @SabreWolfy trovo frustrante che le persone possano fare clic su un singolo pulsante in stata / sas / spss ecc. e ottenere rapporti di probabilità (inserire statistiche di adattamento, tipo III SS, qualunque cosa ti piaccia qui) senza avere la minima idea di cosa significhi / come calcolarlo / se è significativo in una particolare situazione / e (forse ancora più importante) senza avere una conoscenza pratica della lingua stessa.
Rawr


5

Il pacchetto epiDisplay lo fa molto facilmente.

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

Esiste un modo per combinare la visualizzazione logistica con un wrapper in lattice come outrego xtable?
Misnomer stimabile
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.