ใช้ lm สำหรับการทดสอบสัดส่วนตัวอย่าง 2 ตัวอย่าง


12

ฉันใช้แบบจำลองเชิงเส้นเพื่อทำการทดสอบสัดส่วนตัวอย่าง 2 ระยะเวลาหนึ่ง แต่ได้ตระหนักว่าอาจไม่ถูกต้องสมบูรณ์ ปรากฏว่าการใช้ตัวแบบเชิงเส้นแบบทั่วไปกับลิงค์แบบทวินาม + ตระกูลนั้นให้ผลการทดสอบสัดส่วนตัวอย่าง 2 ตัวอย่าง อย่างไรก็ตามการใช้โมเดลเชิงเส้น (หรือ glm กับตระกูล Gaussian) จะให้ผลลัพธ์ที่แตกต่างออกไปเล็กน้อย ฉันหาเหตุผลเข้าข้างตนเองว่านี่อาจเป็นเพราะ R แก้ไข glm สำหรับตระกูลทวินามและตระกูลเกาส์ แต่อาจมีสาเหตุอื่นได้หรือไม่

## 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

คำตอบ:


8

มันไม่ได้เกี่ยวกับวิธีที่พวกเขาแก้ปัญหาการปรับให้เหมาะสมที่สอดคล้องกับโมเดลที่เหมาะสม แต่จะทำอย่างไรกับปัญหาการปรับให้เหมาะสมที่แท้จริงของโมเดล

โดยเฉพาะอย่างยิ่งในกลุ่มตัวอย่างขนาดใหญ่คุณสามารถพิจารณาได้อย่างมีประสิทธิภาพโดยเปรียบเทียบปัญหาสองอย่างที่มีน้ำหนักถ่วงน้ำหนักน้อยที่สุด

แบบจำลองเชิงเส้น ( lm) หนึ่งถือว่า (เมื่อไม่ถ่วง) ว่าความแปรปรวนของสัดส่วนคงที่ GLM สันนิษฐานว่าความแปรปรวนของสัดส่วนที่มาจากสมมติฐานทวินาม n จุดนี้ทำให้น้ำหนักของข้อมูลแตกต่างกันดังนั้นจึงมีค่าประมาณที่แตกต่างกัน * และความแตกต่างของความแตกต่างVar(p^)=Var(X/n)=p(1p)/n

* อย่างน้อยในบางสถานการณ์แม้ว่าจะไม่จำเป็นต้องเปรียบเทียบสัดส่วนโดยตรง


0

ในแง่ของการคำนวณเปรียบเทียบข้อผิดพลาดมาตรฐานของสัมประสิทธิ์การรักษาสำหรับ lm กับ binomial glm คุณมีสูตรสำหรับข้อผิดพลาดมาตรฐานของสัมประสิทธิ์การรักษา B ใน binomial glm (ตัวส่วนของ z_unpooled) ข้อผิดพลาดมาตรฐานของสัมประสิทธิ์การรักษา B ใน lm มาตรฐานคือ (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))

ดูโพสต์นี้เพื่อหาสาเหตุความแตกต่างเพียงอย่างเดียวคือที่นี่พบข้อผิดพลาดตัวอย่างแทนที่จะเป็น (เช่นลบ 2 จากสำหรับองศาอิสระที่สูญหาย) โดยไม่ว่าที่ LM และข้อผิดพลาดมาตรฐาน GLM ทวินามจริงดูเหมือนจะตรงกับเมื่อn_Bσ2nA+nB2nA=nB

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.