Prueba de razón de probabilidad en R


25

Supongamos que voy a hacer una regresión logística univariada en varias variables independientes, como esta:

mod.a <- glm(x ~ a, data=z, family=binominal("logistic"))
mod.b <- glm(x ~ b, data=z, family=binominal("logistic"))

Hice una comparación de modelo (prueba de razón de probabilidad) para ver si este modelo es mejor que el modelo nulo con este comando

1-pchisq(mod.a$null.deviance-mod.a$deviance, mod.a$df.null-mod.a$df.residual)

Luego construí otro modelo con todas las variables.

mod.c <- glm(x ~ a+b, data=z, family=binomial("logistic"))

Para ver si la variable es estadísticamente significativa en el modelo multivariante, utilicé el lrtestcomando deepicalc

lrtest(mod.c,mod.a) ### see if variable b is statistically significant after adjustment of a
lrtest(mod.c,mod.b) ### see if variable a is statistically significant after adjustment of b

Me pregunto si el pchisqmétodo y el lrtestmétodo son equivalentes para hacer la prueba de loglikelihood. Como no sé cómo usar lrtestpara el modelo logístico univado.


@Gavin, gracias por recordarme que, en comparación con stackoverflow, necesito pasar más tiempo para "digerir" la respuesta antes de decidir si la respuesta es apropiada o no, de todos modos, gracias de nuevo.
lokheart

No recomendaría usar waldtest de lmtest. Use el paquete aod para la prueba del modelo. Es mucho más sencillo. cran.r-project.org/web/packages/aod/aod.pdf
Mr. Nobody

epicalcfue eliminado ( fuente ). Una alternativa podría ser lmtest.
Martin Thoma

Respuestas:


21

Básicamente, sí, siempre que use la diferencia correcta en la probabilidad de registro:

> library(epicalc)
> model0 <- glm(case ~ induced + spontaneous, family=binomial, data=infert)
> model1 <- glm(case ~ induced, family=binomial, data=infert)
> lrtest (model0, model1)
Likelihood ratio test for MLE method 
Chi-squared 1 d.f. =  36.48675 , P value =  0 
> model1$deviance-model0$deviance
[1] 36.48675

y no la desviación para el modelo nulo que es igual en ambos casos. El número de df es el número de parámetros que difieren entre los dos modelos anidados, aquí df = 1. Por cierto, puede mirar el código fuente lrtest()simplemente escribiendo

> lrtest

en el indicador R.


gracias, y acabo de descubrir que puedo usar glm (output ~ NULL, data = z, family = binomial ("logistic")) para crear un modelo NULL, y así puedo usar lrtest después. FYI, gracias de nuevo
lokheart

2
@lokheart anova(model1, model0)también funcionará.
chl

55
@lokheart glm(output ~ 1, data=z, family=binomial("logistic"))sería un modelo nulo más natural, que dice que outputse explica por un término constante (la intercepción) / La intercepción está implícita en todos sus modelos, por lo que está probando el efecto adespués de contabilizar la intercepción.
Restablece a Monica - G. Simpson el

O puede hacerlo "manualmente": valor p de la prueba LR = 1-pchisq (desviación, dof)
Umka

22

Una alternativa es el lmtestpaquete, que tiene una lrtest()función que acepta un solo modelo. Aquí está el ejemplo de ?lrtesten el lmtestpaquete, que es para un LM pero hay métodos que el trabajo con GLMs:

> require(lmtest)
Loading required package: lmtest
Loading required package: zoo
> ## with data from Greene (1993):
> ## load data and compute lags
> data("USDistLag")
> usdl <- na.contiguous(cbind(USDistLag, lag(USDistLag, k = -1)))
> colnames(usdl) <- c("con", "gnp", "con1", "gnp1")
> fm1 <- lm(con ~ gnp + gnp1, data = usdl)
> fm2 <- lm(con ~ gnp + con1 + gnp1, data = usdl)
> ## various equivalent specifications of the LR test
>
> ## Compare two nested models
> lrtest(fm2, fm1)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ gnp + gnp1
  #Df  LogLik Df  Chisq Pr(>Chisq)    
1   5 -56.069                         
2   4 -65.871 -1 19.605  9.524e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 
>
> ## with just one model provided, compare this model to a null one
> lrtest(fm2)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ 1
  #Df   LogLik Df  Chisq Pr(>Chisq)    
1   5  -56.069                         
2   2 -119.091 -3 126.04  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

+1 Es bueno saberlo (y parece que me olvidé de ese paquete).
chl

2
@GavinSimpson Esto puede parecer una tontería, pero ¿cómo interpretaría los resultados de 'lrtest (fm2, fm1)'? ¿El modelo 2 es significativamente diferente del modelo 1 y, por lo tanto, la adición de la variable con1 fue útil? ¿O el primero (fm2) dice que el modelo 2 es significativamente diferente del modelo 1? ¿Pero qué modelo es mejor?
Kerry

55
@ Kerry fm1tiene una probabilidad de registro más baja y, por lo tanto, un peor ajuste que fm2. El LRT nos dice que el grado en que hicimos fm1un modelo más pobre de lo que fm2es inesperadamente grande si los términos que son diferentes entre los modelos fueron útiles (explicó la respuesta). lrtest(fm2)no se compara con fm1nada, el modelo fm2se compara con que en ese caso si, como se indica en la salida, lo siguiente: con ~ 1. Ese modelo, el modelo nulo, dice que el mejor predictor de cones la media muestral de con(el término de intercepción / constante).
Restablece a Monica - G. Simpson 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.