Usando glm () como sustituto de la prueba simple de chi cuadrado

15

Estoy interesado en cambiar las hipótesis nulas usando glm()en R.

Por ejemplo:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

prueba la hipótesis de que . ¿Qué pasa si quiero cambiar el valor nulo a = algún valor arbitrario, dentro ? p=0.5pglm()

Sé que esto también se puede hacer con prop.test()y chisq.test(), pero me gustaría explorar la idea de usar glm()para probar todas las hipótesis relacionadas con datos categóricos.

Bill Ravenwood
fuente
77
+1. p evidentemente se refiere al parámetro Binomial expresado como una probabilidad. Dado que el enlace natural (y el que se usa por glmdefecto) es el logit, para evitar confusiones es importante distinguir p de su logit, que es el log odds log(p/(1p)) .
whuber

Respuestas:

19

Puede usar un desplazamiento : glmcon family="binomial"parámetros estimados en la escala de log-odds o logit, entonces corresponde a log-odds de 0 o una probabilidad de 0.5. Si desea comparar con una probabilidad de , desea que el valor de referencia sea . El modelo estadístico es ahorap q = logit ( p ) = log ( p / ( 1 - p ) )β0=0pq=logit(p)=log(p/(1p))

YBinom(μ)μ=1/(1+exp(η))η=β0+q

donde solo la última línea ha cambiado desde la configuración estándar. En código R:

  • usar offset(q)en la fórmula
  • la función logit / log-odds es qlogis(p)
  • un poco molesto, debe proporcionar un valor de compensación para cada elemento en la variable de respuesta: R no replicará automáticamente un valor constante para usted. Esto se hace a continuación configurando un marco de datos, pero podría usarlo rep(q,100).
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))
Ben Bolker
fuente
2
(+1) esto te dará la prueba de Wald. Se puede hacer un LRT ajustando el modelo nulo glm(y ~ offset(q)-1, family=binomial, data=dd)y utilizando lrtestel lmtestpaquete. La prueba de chi-cuadrado de Pearson es la prueba de puntaje para el modelo GLM. Wald / LRT / Score son pruebas consistentes y deben proporcionar una inferencia equivalente en tamaños de muestra razonablemente grandes.
AdamO
1
Creo que también puedes usar anova()desde la base R en el glm para obtener una prueba de LR
Ben Bolker
Interesante, he perdido el hábito de usar ANOVA. Sin embargo, observo que anova se niega a imprimir el pvalue para la prueba, mientras que lo lrtesthace.
AdamO
2
tal vez anova(.,test="Chisq")?
Ben Bolker
6

Mire el intervalo de confianza para los parámetros de su GLM:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

Este es un intervalo de confianza para las probabilidades de registro.

Para tenemos . Por lo tanto, probar la hipótesis de que es equivalente a verificar si el intervalo de confianza contiene 0. Este no, por lo que la hipótesis se rechaza.log ( o d d s ) = log pp=0.5log(odds)=logp1p=log1=0p=0.5

Ahora, para cualquier arbitraria , puede calcular las probabilidades de registro y verificar si está dentro del intervalo de confianza.p

Łukasz Deryło
fuente
1
Esto es útil, pero solo funciona para verificar si . Si desea el valor p real, mi respuesta será más útil. p<0.05
Ben Bolker
2
Puede solicitar cualquier nivel de confianza confint. Por lo tanto, no es solo para . Por supuesto, su solución es mucho mejor cuando se trata de calcular el valor pp<0,05
Łukasz Deryło
2

No es (del todo) correcto / exacto usar los valores p basados ​​en los valores z- / t en la función glm.summary como prueba de hipótesis.

  1. Es un lenguaje confuso. Los valores informados se denominan valores z. Pero en este caso utilizan el error estándar estimado en lugar de la verdadera desviación. Por lo tanto, en realidad están más cerca de los valores t . Compare los siguientes tres resultados:
    1) summary.glm
    2) prueba t
    3) prueba z

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. No son valores p exactos. Un cálculo exacto del valor p utilizando la distribución binomial funcionaría mejor (con la potencia de cálculo hoy en día, esto no es un problema). La distribución t, suponiendo una distribución gaussiana del error, no es exacta (sobreestima p, exceder el nivel alfa ocurre con menos frecuencia en la "realidad"). Vea la siguiente comparación:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF de rechazo por alfa

    La curva negra representa la igualdad. La curva roja está debajo de ella. Eso significa que para un valor p calculado dado por la función de resumen glm, encontramos esta situación (o una diferencia mayor) en la realidad con menos frecuencia de lo que indica el valor p.

Sexto Empírico
fuente
Hmm .. Puedo estar confundido acerca de la razón para usar la distribución T para un GLM. ¿Puedes echar un vistazo a una pregunta relacionada que acabo de hacer aquí ?
AdamO
2
Esta respuesta es interesante pero problemática. (1) el OP en realidad no preguntó sobre la diferencia entre los enfoques de puntaje, chi-cuadrado, "exacto" o basado en GLM para probar hipótesis sobre respuestas binomiales (es posible que ya sepan todo esto), por lo que esto no t responda la pregunta que se le hizo; (2) las estimaciones de la varianza residual, etc. tienen un conjunto diferente de supuestos y distribuciones de muestreo de modelos lineales (como en la pregunta de @ AdamO), por lo que el uso de una prueba t es discutible; ...
Ben Bolker
2
(3) los intervalos de confianza 'exactos' para las respuestas binomiales son realmente difíciles (los intervalos 'exactos' [Clopper-Wilson] son ​​conservadores; las pruebas de puntaje pueden funcionar mejor en algunos rangos
Ben Bolker
@Ben Tienes razón en que la prueba z es realmente mejor que la prueba t. El gráfico que se muestra en la respuesta es para la prueba z. Utiliza la salida de la función GLM. La conclusión de mi respuesta fue que el "valor p" es algo complicado. Por lo tanto, me parece mejor calcularlo explícitamente, por ejemplo, usando la distribución normal, en lugar de extraer el valor p de una función glm, que se ha desplazado muy convenientemente con el desplazamiento pero oculta los orígenes de los cálculos para el valor p .
Sextus Empiricus
1
@BenBolker, creo que la prueba exacta es realmente conservadora, pero ... solo porque en realidad no estamos tomando muestras de distribuciones binomiales perfectas. La prueba z alternativa, solo es mejor desde un punto de vista empírico . Es que los dos "errores" se cancelan entre sí 1) la distribución binomial no es la distribución real de los residuos en situaciones prácticas, 2) la distribución z no es una expresión exacta para una distribución binomial. Es cuestionable si deberíamos preferir la distribución incorrecta para el modelo incorrecto , solo porque en la práctica resulta "correcto".
Sextus Empiricus