Usando lm para la prueba de proporción de 2 muestras

12

He estado usando modelos lineales para realizar pruebas de proporción de 2 muestras durante un tiempo, pero me di cuenta de que podría no ser completamente correcto. Parece que el uso de un modelo lineal generalizado con un vínculo binomial familia + identidad proporciona exactamente los resultados de la prueba de proporción de 2 muestras no agrupados. Sin embargo, el uso de un modelo lineal (o glm con familia gaussiana) da un resultado ligeramente diferente. Estoy racionalizando que esto podría deberse a cómo R resuelve glm para familias binomiales versus gaussianas, pero ¿podría haber otra causa?

## prop.test gives pooled 2-sample proportion result
## glm w/ binomial family gives unpooled 2-sample proportion result
## lm and glm w/ gaussian family give unknown result

library(dplyr)
library(broom)
set.seed(12345)

## set up dataframe -------------------------
n_A <- 5000
n_B <- 5000

outcome <- rbinom(
  n = n_A + n_B,
  size = 1,
  prob = 0.5
)
treatment <- c(
  rep("A", n_A),
  rep("B", n_B)
)

df <- tbl_df(data.frame(outcome = outcome, treatment = treatment))


## by hand, 2-sample prop tests ---------------------------------------------
p_A <- sum(df$outcome[df$treatment == "A"])/n_A
p_B <- sum(df$outcome[df$treatment == "B"])/n_B

p_pooled <- sum(df$outcome)/(n_A + n_B)
z_pooled <- (p_B - p_A) / sqrt( p_pooled * (1 - p_pooled) * (1/n_A + 1/n_B) )
pvalue_pooled <- 2*(1-pnorm(abs(z_pooled)))

z_unpooled <- (p_B - p_A) / sqrt( (p_A * (1 - p_A))/n_A + (p_B * (1 - p_B))/n_B )
pvalue_unpooled <- 2*(1-pnorm(abs(z_unpooled)))


## using prop.test --------------------------------------
res_prop_test <- tidy(prop.test(
  x = c(sum(df$outcome[df$treatment == "A"]), 
        sum(df$outcome[df$treatment == "B"])),
  n = c(n_A, n_B),
  correct = FALSE
))
res_prop_test # same as pvalue_pooled
all.equal(res_prop_test$p.value, pvalue_pooled)
# [1] TRUE


# using glm with identity link -----------------------------------
res_glm_binomial <- df %>%
  do(tidy(glm(outcome ~ treatment, family = binomial(link = "identity")))) %>%
  filter(term == "treatmentB")
res_glm_binomial # same as p_unpooled
all.equal(res_glm_binomial$p.value, pvalue_unpooled)
# [1] TRUE


## glm and lm gaussian --------------------------------

res_glm <- df %>%
  do(tidy(glm(outcome ~ treatment))) %>%
  filter(term == "treatmentB")
res_glm 
all.equal(res_glm$p.value, pvalue_unpooled)
all.equal(res_glm$p.value, pvalue_pooled)

res_lm <- df %>%
  do(tidy(lm(outcome ~ treatment))) %>% 
  filter(term == "treatmentB")
res_lm
all.equal(res_lm$p.value, pvalue_unpooled)
all.equal(res_lm$p.value, pvalue_pooled)

all.equal(res_lm$p.value, res_glm$p.value)
# [1] TRUE
Hilary Parker
fuente

Respuestas:

8

No tiene que ver con cómo resuelven los problemas de optimización que corresponden a la adaptación de los modelos, tiene que ver con los problemas de optimización reales que plantean los modelos.

Específicamente, en muestras grandes, puede considerarlo efectivamente como la comparación de dos problemas de mínimos cuadrados ponderados

El modelo lineal ( lm) se supone (cuando no está ponderado) que la varianza de las proporciones es constante. El glm supone que la varianza de las proporciones proviene del supuesto binomial . Esto pondera los puntos de datos de manera diferente y, por lo tanto, llega a estimaciones * algo diferentes y diferentes variaciones de diferencias.Var(p^)=Var(X/n)=p(1p)/n

* al menos en algunas situaciones, aunque no necesariamente en una comparación directa de proporciones

Glen_b -Reinstate a Monica
fuente
0

En términos de cálculo, compare el error estándar del coeficiente de tratamiento B para lm vs. binomial glm. Tiene la fórmula para el error estándar del coeficiente de tratamiento B en el glom binomial (el denominador de z_unpooled). El error estándar del coeficiente de tratamiento B en el lm estándar es (SE_lm):

    test = lm(outcome ~ treatment, data = df)
    treat_B =  as.numeric(df$treatment == "B")
    SE_lm = sqrt( sum(test$residuals^2)/(n_A+n_B-2) / 
              sum((treat_B - mean(treat_B))^2))

Vea esta publicación para obtener una derivación, la única diferencia es que aquí se encuentra el error de muestra en lugar de (es decir, reste 2 de para los grados de libertad perdidos). Sin ese , los errores estándar lm y binomial glm realmente parecen coincidir cuando .n A + n B - 2 n A = n Bσ2nA+nB2nA=nB

jac
fuente