Regresión logística en R (Odds Ratio)


41

Estoy tratando de realizar un análisis de regresión logística en R. He asistido a cursos que cubren este material usando STATA. Me resulta muy difícil replicar la funcionalidad en R. ¿Es maduro en esta área? Parece que hay poca documentación u orientación disponible. Producir resultados de odds ratio parece requerir instalación epicalcy / o epitools/ u otros, ninguno de los cuales puedo poner a trabajar, está desactualizado o carece de documentación. Solía glmhacer la regresión logística. Cualquier sugerencia será bienvenida.

Mejor hago de esto una pregunta real. ¿Cómo ejecuto una regresión logística y produzco raciones de probabilidades R?

Esto es lo que he hecho para un análisis univariante:

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

Y para multivariante:

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

Entonces yo he mirado x, y, summary(x)y summary(y).

¿Tiene x$coefficientsalgún valor?

Respuestas:


36

si desea interpretar los efectos estimados como razones de probabilidades relativas, simplemente haga exp(coef(x))(le da , el cambio multiplicativo en la razón de probabilidades para y = 1 si la covariable asociada con β aumenta en 1). Para intervalos de probabilidad de perfil para esta cantidad, puede hacermiβy=1β

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

EDITAR: @caracal fue más rápido ...


1
+1 para la sugerencia de @ fabian. Una manera inferior a hacer esto que por lo general produce intervalos similares es calcular el intervalo en la escala logit y luego transformar a la escala de probabilidades: 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]) ). También está el método delta: ats.ucla.edu/stat/r/faq/deltamethod.htm
cerrado el

42

Tiene razón en que la salida de R generalmente contiene solo información esencial, y se necesita calcular más por separado.

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()le da los parámetros de regresión estimados . Sin embargo, es más fácil interpretar e x p ( b j ) (a excepción de la intercepción).sijmiXpags(sij)

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

Para obtener el odds ratio, necesitamos la tabla cruzada de clasificación del DV dicotómico original y la clasificación pronosticada de acuerdo con algún umbral de probabilidad que debe elegirse primero. También puede ver la función ClassLog()en el paquete QuantPsyc(como se menciona en una pregunta relacionada ).

# 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

Para la razón de posibilidades, puede usar el paquete vcdo hacer el cálculo 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
Gracias. Necesitaré revisar su respuesta cuidadosamente. En STATA uno puede simplemente correr logity logisticy obtener odds ratios y los intervalos de confianza fácilmente. Estoy algo frustrado porque esto parece ser tan complicado y no estándar en R. ¿Puedo usar exp(cbind(coef(x), confint(x)))la respuesta de fabians a continuación para obtener el OD y el CI? ¿No tengo claro cuál es su respuesta?
SabreWolfy

3
cTabmiXpags(sij)miXpags(sij)Xj

44
en realidad @SabreWolfy Me resulta frustrante que la gente pueda hacer clic en un solo botón en stata / sas / spss, etc., y obtener odds ratios (inserte estadísticas de ajuste, tipo III SS, lo que quiera aquí) sin tener una idea de lo que significa / cómo calcularlo / si es significativo en una situación particular / y (quizás lo más importante) sin tener un conocimiento práctico del lenguaje en sí.
rawr


5

El paquete epiDisplay hace esto muy fácilmente.

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

¿Hay alguna forma de combinar la visualización logística con un envoltorio de látex como outrego xtable?
Nombre inapropiado el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.