¿Cómo puedo calcular la estadística de prueba Pearson por falta de ajuste en un modelo de regresión logística en R?

10

La estadística de razón de probabilidad (también conocida como desviación) y la prueba de falta de ajuste (o bondad de ajuste) es bastante sencilla de obtener para un modelo de regresión logística (ajuste usando la función) en R. Sin embargo, puede ser Es fácil tener algunos recuentos de células lo suficientemente bajos como para que la prueba no sea confiable. Una forma de verificar la confiabilidad de la prueba de razón de probabilidad de falta de ajuste es comparar su estadística de prueba y el valor P con los de la prueba de falta de ajuste chi cuadrado de Pearson (o ).χ 2G2glm(..., family = binomial)χ2

Ni el glmobjeto ni su summary()método informan el estadístico de prueba para la prueba de chi cuadrado de Pearson por falta de ajuste. En mi búsqueda, lo único que se me ocurrió es la chisq.test()función (en el statspaquete): su documentación dice " chisq.testrealiza pruebas de tabla de contingencia chi-cuadrado y pruebas de bondad de ajuste". Sin embargo, la documentación es escasa sobre cómo realizar tales pruebas:

Si xes una matriz con una fila o columna, o si xes un vector y yno se proporciona, se realiza una prueba de bondad de ajuste ( xse trata como una tabla de contingencia unidimensional). Las entradas de xdeben ser enteros no negativos. En este caso, la hipótesis probada es si las probabilidades de la población pson iguales o si son iguales si pno se dan.

Me imagino que podrías usar el ycomponente del glmobjeto para el xargumento de chisq.test. Sin embargo, no puede usar el fitted.valuescomponente del glmobjeto para el pargumento de chisq.test, porque obtendrá un error: " probabilities must sum to 1."

¿Cómo puedo (en R) al menos calcular el estadístico de prueba Pearson por falta de ajuste sin tener que ejecutar los pasos manualmente?χ2

Pluma de fuego
fuente

Respuestas:

13

La suma de los residuos de Pearson al cuadrado es exactamente igual a la estadística de prueba de Pearson por falta de ajuste. Entonces, si se llama a su modelo ajustado (es decir, el objeto) , el siguiente código devolverá la estadística de prueba:χ2glmlogistic.fit

sum(residuals(logistic.fit, type = "pearson")^2)

Consulte la documentación residuals.glmpara obtener más información, incluido qué otros residuos están disponibles. Por ejemplo, el código

sum(residuals(logistic.fit, type = "deviance")^2)

obtendrá la estadística de prueba , exactamente lo mismo que proporciona.G2deviance(logistic.fit)

Pluma de fuego
fuente
Estoy de acuerdo con Macro. Si quería respuestas para el grupo, debería haber esperado para escuchar lo que otros tienen que decir primero. Cualquier cosa que pueda obtener ahora está sesgada al ver su respuesta. Además, si sabes la respuesta, ¿qué estás tratando de demostrar al hacer esto?
Michael R. Chernick
@Macro - Firefeather ha publicado cuatro preguntas en este sitio (incluida esta) y respondió a tres de ellas (incluida esta) él mismo, aceptando una de sus propias respuestas una vez. ¡Algunos más como este y podría comenzar a ver un patrón!
jbowman
@jbowman, me imagino respondiendo tu propia pregunta si la resolviste por tu cuenta antes de que alguien más publicara una respuesta, pero firefeather publicó una respuesta literalmente menos de 5 minutos después de publicar la pregunta, parece que él / ella no necesitaba ayuda , que es lo que me hizo preguntar por qué ... Realmente no entiendo la motivación ...
Macro
3
@Macro, consulte este enlace oficial: blog.stackoverflow.com/2011/07/… (está vinculado en la página Haga una pregunta en la etiqueta de la casilla de verificación en la parte inferior: "Responda su propia pregunta: comparta sus conocimientos, preguntas y respuestas al estilo "). Tenía esta pregunta mientras hacía la tarea (habiendo elegido usar R en lugar de Minitab, aunque se demostró a Minitab en clase), pero no tuve tiempo suficiente para escribir la pregunta y esperar una respuesta. Descubrí esta solución y decidí compartirla con la comunidad.
Firefeather
2
@Macro, de nada! Desearía poder hacer más preguntas donde no proporciono la respuesta y responder más preguntas que no hice. Pero jbowman 's derecho sobre un patrón: mis contribuciones a la comunidad están tendiendo hacia hablando solo. :) (Al menos estoy contribuyendo de alguna manera a la comunidad, ¿verdad?)
Firefeather
10

La estadística de Pearson tiene una distribución degenerada, por lo que no se recomienda en general para la bondad de ajuste del modelo logístico. Prefiero pruebas estructuradas (linealidad, aditividad). Si desea una prueba general, vea el único grado de libertad le Cessie - van Houwelingen - Copas - Hosmer prueba de suma de cuadrados no ponderada tal como se implementa en la función del rmspaquete R.residuals.lrm

Frank Harrell
fuente
2
-1: ¡Gracias por la información! Sin embargo, esto no responde a mi pregunta. Debido a que es un comentario / discusión relevante sobre una declaración que hice en el fondo de mi pregunta, su respuesta probablemente pertenece a un comentario, en lugar de a una respuesta.
Firefeather
2
Supongo que las cuatro personas que votaron por mi respuesta no están de acuerdo contigo. Y no se ha ocupado de la distribución degenerada.
Frank Harrell
@FrankHarrell: ¿Es esta medida GOF diferente de la prueba GOF de Hosmer-Lemeshow (HL)? Asumiendo eso debido al nombre, y también he comparado los dos: Realicé la prueba HL GOF como se encuentra en el ResourceSelectionpaquete, y su resultado es diferente de lo que obtengo al ejecutar resid(lrm_object, 'gof')después de ajustar mi modelo de regresión logística como lrm_object <- lrm(...). Si son realmente diferentes, ¿puede comentar cómo se compara la prueba HL con la que menciona aquí? ¡Gracias!
Meg
1
Los dos son muy diferentes. La estadística HL (ahora obsoleta) tiene df fijo y generalmente se basa en deciles de riesgo. La estadística HL tanto, no se degenera como . Por otro lado, tenga cuidado de cualquier estadística donde el DF se mantiene en expansión con . N χ 2 Nχ2Nχ2N
Frank Harrell
Me encantaría ver una simulación que muestre esta degeneración.
wdkrnls
0

Gracias, no me di cuenta de que era tan simple como: sum (residuales (f1, type = "pearson") ^ 2) Sin embargo, tenga en cuenta que el residual de Pearson varía dependiendo de si se calcula por grupo covariable o por individuo. Un simple ejemplo:

m1 es una matriz (esta es la cabeza de una matriz más grande):

m1 [1: 4,1: 8]

    x1 x2 x3 obs    pi   lev  yhat y
obs  1  1 44   5 0.359 0.131 1.795 2
obs  0  1 43  27 0.176 0.053 4.752 4
obs  0  1 53  15 0.219 0.062 3.285 1
obs  0  1 33  22 0.140 0.069 3.080 3

Donde x1-3 son predictores, obs es no. observaciones en cada grupo, pi es la probabilidad de pertenencia al grupo (predicho a partir de la ecuación de regresión), lev es el apalancamiento, la diagonal de la matriz del sombrero, y el no pronosticado. (de y = 1) en el grupo y y el no real.

Esto te dará Pearson por grupo. Observe cómo es diferente si y == 0: ' 'fun1 <- function(j){        if (m1[j,"y"] ==0){ # y=0 for this covariate pattern     Pr1 <- sqrt( m1[i,"pi"] / (1-m1[i,"pi"]))     Pr2 <- -sqrt (m1[i,"obs"]) res <- round( Pr1 * Pr2, 3) return(res) } else {  Pr1 <- m1[j,"y"] - m1[j,"yhat"] Pr2 <- sqrt(   m1[j,"yhat"] * ( 1-(m1[j,"pi"]) )   ) res <- round( Pr1/Pr2, 3) return(res) }    }

Así

nr <-nrow(m1)
nr1 <- seq(1,nr)
Pr <- sapply(1:nrow[m1], FUN=fun1)
PrSj <- sum(Pr^2)

Si hay un gran número de sujetos con patrones covariables y = 0, entonces el residual de Pearons será mucho mayor cuando se calcule utilizando el método 'por grupo' en lugar del método 'por individuo'.

Véase, por ejemplo, Hosmer & Lemeshow "Regresión logística aplicada", Wiley, 200.

Dardisco
fuente
0

También puede usar c_hat(mod)eso dará el mismo resultado que sum(residuals(mod, type = "pearson")^2).

usuario54098
fuente
1
¿En qué paquete se c_hatencuentra?
Pluma de fuego