การตีความปฏิสัมพันธ์ในแบบจำลองการถดถอย

คำถามง่ายๆที่ฉันหวัง

ฉันมีการออกแบบการทดลองโดยวัดการตอบสนองบางอย่าง (เช่น ความดันโลหิต) จากสองกลุ่ม: กลุ่มควบคุมและกลุ่มที่ได้รับผลกระทบ โดยทั้งสองกลุ่มได้รับการรักษาสามแบบ: t1, t2, t3 ข้อมูลไม่ได้ถูกจับคู่ไม่ว่าในแง่ใดก็ตาม

นี่คือข้อมูลตัวอย่าง:

set.seed(1)
df <- data.frame(response = c(rnorm(5,10,1),rnorm(5,10,1),rnorm(5,10,1),
                         rnorm(5,7,1),rnorm(5,5,1),rnorm(5,10,1)),
                 group = as.factor(c(rep("control",15),rep("affected",15))),
                 treatment = as.factor(rep(c(rep("t1",5),rep("t2",5),rep("t3",5)),2)))

สิ่งที่ฉันสนใจคือการหาปริมาณผลกระทบที่การรักษาแต่ละครั้งมีต่อกลุ่มที่ได้รับผลกระทบโดยสัมพันธ์กับกลุ่มควบคุม ฉันจะสร้างโมเดลนี้ได้อย่างไร พูดโดยใช้โมเดลเชิงเส้น (เช่น lm ใน R)

ฉันผิดหรือเปล่าที่คิดแบบนั้น:

lm(response ~ 0 + treatment * group, data = df)

ซึ่งเทียบเท่ากับ:

lm(response ~ 0 + treatment + group + treatment:group, data = df)

ไม่ใช่สิ่งที่ฉันต้องการใช่ไหม? ฉันคิดว่าในรูปแบบนี้ เงื่อนไขปฏิสัมพันธ์ระหว่างการรักษา: กลุ่มสัมพันธ์กับค่าเฉลี่ยของการวัดกลุ่มพื้นฐานและการรักษาพื้นฐานทั้งหมด

ฉันจึงคิดว่ารุ่นนี้:

lm(response ~ 0 + treatment:group, data = df)

เป็นสิ่งที่ฉันต้องการ แต่มันกำลังวัดปริมาณการรักษาแต่ละแบบรวมกันและเงื่อนไขปฏิสัมพันธ์ระหว่างกลุ่ม: treatmentt1:groupcontrol treatmentt1:groupaffected treatmentt2:groupcontrol treatmentt2:groupaffected treatmentt3:groupcontrol treatmentt3:groupaffected

บางทีโมเดลนี้:

lm(response ~ 0 + treatment + treatment:group, data = df)

อันที่ถูกต้องใช่ไหม?

แม้ว่านอกเหนือจากการระบุปริมาณการรักษาแต่ละแบบรวมกันและเงื่อนไขปฏิสัมพันธ์ที่ได้รับผลกระทบแบบกลุ่มแล้ว ยังเป็นการวัดปริมาณผลของการรักษาแต่ละครั้งด้วย ฉันไม่แน่ใจว่าการเปรียบเทียบแต่ละเงื่อนไขของการรักษาและปฏิสัมพันธ์ที่ได้รับผลกระทบแบบกลุ่มในแบบจำลองนี้ถือเป็นพื้นฐานอะไร

ความช่วยเหลือจะได้รับการชื่นชม

นอกจากนี้ สมมติว่าฉันทำการรักษาครั้งที่สี่ ซึ่งจริงๆ แล้วเป็นการผสมผสานระหว่างการรักษาสองอย่าง เช่น t1+t3 โดยที่ฉันไม่รู้ว่าความคาดหวังของผลรวมของมันคืออะไร: การบวก/การลบ หรือการทำงานร่วมกัน มีวิธีใดบ้างที่สามารถรวมกันได้?


person dan    schedule 11.11.2015    source แหล่งที่มา
comment
ถ้าฉันเข้าใจถูกต้องโดยพื้นฐานแล้วคุณสนใจ 3 ความแตกต่างใช่ไหม? คุณต้องการทราบว่าความแตกต่างระหว่าง t1 ที่ได้รับผลกระทบและการควบคุม t1 ระหว่าง t2 ที่ได้รับผลกระทบและการควบคุม t2 และสุดท้ายระหว่าง t3 ที่ได้รับผลกระทบและการควบคุม t2 คืออะไร   -  person N311V    schedule 11.11.2015
comment
คุณไม่ได้ถามคำถามเกี่ยวกับการเขียนโปรแกรมที่นี่ แต่คุณกำลังถามคำถามเกี่ยวกับการสร้างแบบจำลองทางสถิติ ดังนั้น คำถามของคุณอยู่ใน Cross Validated ไม่ใช่ Stack Overflow   -  person MrFlick    schedule 11.11.2015
comment
N311V คุณพูดถูก นี่คือสิ่งที่ฉันสนใจ   -  person dan    schedule 11.11.2015


คำตอบ (2)


คำโต้ตอบจะบอกคุณว่าความแตกต่างระหว่างกลุ่มขึ้นอยู่กับการรักษา กล่าวคือ ความแตกต่างระหว่างที่ได้รับผลกระทบและกลุ่มควบคุมสำหรับ t1, t2 และ t3 นั้นไม่เหมือนกัน

ฉันจะสร้างแบบจำลองการสกัดกั้น

lm(response ~ group + treatment + group:treatment, data=df)

หลังจากได้รับคำโต้ตอบที่สำคัญ ฉันจะใช้ t.tests เพื่อตรวจสอบเพิ่มเติมและเพื่อช่วยในการตีความ

ดังที่เห็นได้ว่าปฏิสัมพันธ์นั้นขับเคลื่อนด้วยเอฟเฟกต์ที่ใหญ่กว่าของ t2 เมื่อเทียบกับเอฟเฟกต์อื่น ๆ

library(data.table)
library(dplyr)
library(ggplot2)

set.seed(1)
df <- data.frame(response = c(rnorm(5,10,1),rnorm(5,10,1),rnorm(5,10,1),rnorm(5,7,1),rnorm(5,5,1),rnorm(5,10,1)),
             group = as.factor(c(rep("control",15),rep("affected",15))),
             treatment = as.factor(rep(c(rep("t1",5),rep("t2",5),rep("t3",5)),2)))

# t tests of the desired comparisons to see if there is a difference and get 95% confidence intervals
t.test(df$response[df$treatment=="t1"] ~ df$group[df$treatment=="t1"])
t.test(df$response[df$treatment=="t2"] ~ df$group[df$treatment=="t2"])
t.test(df$response[df$treatment=="t3"] ~ df$group[df$treatment=="t3"])

# plot 95% C.I.
ci_plot <- matrix(nrow=3, ncol=3)
ci_plot <- as.data.frame(ci_plot)
colnames(ci_plot) <- c("treatment", "lci", "uci")

ci_plot[,1] <- c("t1", "t2", "t3")
ci_plot[,3] <- c(t.test(df$response[df$treatment=="t1"] ~ df$group[df$treatment=="t1"])$conf.int[1],
             t.test(df$response[df$treatment=="t2"] ~ df$group[df$treatment=="t2"])$conf.int[1],
             t.test(df$response[df$treatment=="t3"] ~ df$group[df$treatment=="t3"])$conf.int[1])
ci_plot[,4] <- c(t.test(df$response[df$treatment=="t1"] ~ df$group[df$treatment=="t1"])$conf.int[2],
             t.test(df$response[df$treatment=="t2"] ~ df$group[df$treatment=="t2"])$conf.int[2],
             t.test(df$response[df$treatment=="t3"] ~ df$group[df$treatment=="t3"])$conf.int[2])

ggplot(ci_plot, aes(x=treatment, y=uci)) +
    geom_errorbar(aes(ymin=uci, ymax=lci), width=0.5, position=position_dodge(0.9), weight=0.5) +
    xlab("Treatment") +
    ylab("Change in mean relative to control (95% C.I.)") +
    theme_bw() +
    theme(panel.border = element_blank(),
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          axis.line = element_line(colour = "black"),
          axis.text.x = element_text(angle = 90, hjust = 1))

ป้อนคำอธิบายรูปภาพที่นี่

person N311V    schedule 11.11.2015
comment
จุดดี การทดสอบแบบง่ายๆ ก็เพียงพอแล้ว แม้ว่าฉันจะชอบวิธีการของฉันก็ตาม ผลลัพธ์เดียวกัน ใช้โค้ดน้อยลงเล็กน้อย (เช่น ฉันโทร lm หนึ่งครั้ง และคุณโทร t.test สามครั้ง) โครงเรื่องดี! - person Jacob H; 11.11.2015
comment
ฉันคิดว่าการแทนที่การถดถอยพหุคูณด้วยชุดการทดสอบทีเป็นแนวคิดทั่วไปที่มักจะหลีกเลี่ยงได้ เนื่องจากในการถดถอยจะมีการประมาณความแปรปรวนได้ดีกว่า ตามข้อเสนอแนะของคุณ การใช้ ANOVA จะมีประโยชน์อะไรหากคุณสามารถแทนที่ด้วยการทดสอบ t-test ได้ - person dan; 11.11.2015
comment
@ แดนคุณพูดถูก เนื่องจากคุณมีปัญหาในการตีความการโต้ตอบ ฉันจึงพยายามทำให้มันง่ายขึ้นสำหรับคุณ ฉันเห็นด้วยกับคำตอบของ Jacob H ด้านล่าง เก็บการสกัดกั้นไว้ คำโต้ตอบที่สำคัญบอกคุณว่าความแตกต่างระหว่างได้รับผลกระทบและการควบคุมขึ้นอยู่กับการรักษา รูปด้านบนและการทดสอบภายหลังเฉพาะกิจ (ซึ่งจริงๆ แล้วใช้เพื่อให้ได้ CI 95% ของการเปลี่ยนแปลงเท่านั้น) แสดงให้เห็นว่าปฏิสัมพันธ์ที่มีนัยสำคัญได้รับแรงผลักดันจากผลกระทบที่ใหญ่กว่าของ t2 มากกว่าสิ่งอื่นๆ ฉันจะพยายามปรับปรุงคำตอบของฉัน - person N311V; 11.11.2015
comment
@dan การถดถอยและการทดสอบทีเทียบเท่าในตัวอย่างนี้ อย่างไรก็ตาม ข้อดีของการถดถอยก็คือ ง่ายต่อการแนะนำการควบคุมเพิ่มเติมให้กับโมเดล ลองจินตนาการว่าคุณคิดว่ารายได้ของบุคคลจะส่งผลต่อการตอบสนองของพวกเขา คุณสามารถรวมรายได้เป็นผู้ถดถอยได้โดยตรง การถดถอยยังทำให้ง่ายต่อการเปรียบเทียบผลลัพธ์จำนวนมากในคราวเดียว สุดท้าย การถดถอยช่วยให้คุณสามารถรับมือกับสถานการณ์ที่ไม่ได้มาตรฐานได้อย่างง่ายดาย จะเกิดอะไรขึ้นถ้าข้อมูลเป็นแบบเฮเทอโรสเคดาสติก? จะเกิดอะไรขึ้นหากคุณใช้ข้อมูลการนับ จะเกิดอะไรขึ้นหากการรักษาของคุณไม่ได้รับการสุ่ม แต่มีเครื่องมืออยู่? - person Jacob H; 11.11.2015
comment
ไม่ต้องพูดถึงการแก้ไขสมมติฐานหลายประการที่เกี่ยวข้องกับชุดการทดสอบที ดังนั้นความคิดเห็นของฉัน ฉันต้องบอกว่าเงื่อนไขการโต้ตอบใน lm(response ~ 0 + treatment + treatment:group, data = df) ให้ผลลัพธ์ที่แน่นอนในโครงเรื่องของคุณ คุณเห็นอะไรผิดปกติกับสูตรนี้หรือไม่? - person dan; 11.11.2015
comment
ฉันไม่แน่ใจจริงๆ ว่า lm(response ~ 0 + treatment + treatment:group, data = df) จะทำอะไร อาจเป็นแบบจำลองที่บังคับให้ทั้งสองกลุ่มมีค่าเฉลี่ยเท่ากัน หากสิ่งนี้ถูกย้ายไปที่ Cross Validated คุณอาจได้รับการตอบกลับที่ดีขึ้นมาก - person N311V; 11.11.2015

ข้อกำหนดแรกของคุณเป็นเรื่องปกติ

lm(response ~  0 + treatment * group, data = df)

Call:
lm(formula = response ~ 0 + treatment * group, data = df)

Coefficients:
         treatmentt1               treatmentt2               treatmentt3  
               7.460                     5.081                     9.651  
        groupcontrol  treatmentt2:groupcontrol  treatmentt3:groupcontrol  
               2.670                     2.384                    -2.283 

ค่าสัมประสิทธิ์แรก 7.460 แสดงถึงผลกระทบที่เกิดขึ้นเมื่อผู้เข้าร่วมได้รับการรักษาด้วย t1 และได้รับผลกระทบ จากซ้ายไปขวา ค่าสัมประสิทธิ์ที่สอง 5.081 แสดงถึงเมื่อผู้เข้าร่วมได้รับการรักษาด้วย t2 และได้รับผลกระทบ ฯลฯ

ตัวอย่างเช่น เมื่อผู้เข้าร่วมได้รับการปฏิบัติด้วย t2 และในส่วนควบคุม เอฟเฟกต์จะเป็น 5.081 + 2.384

ถ้าผมทำการวิเคราะห์นี้ ผมคงจะเก็บจุดตัดไว้

Call:
lm(formula = response ~ treatment * group, data = df)

Coefficients:
         (Intercept)               treatmentt2               treatmentt3  
               7.460                    -2.378                     2.192  
        groupcontrol  treatmentt2:groupcontrol  treatmentt3:groupcontrol  
               2.670                     2.384                    -2.283  

ตอนนี้ค่าสัมประสิทธิ์ที่สอง เรียงจากซ้ายไปขวา แสดงถึงผลกระทบของผู้เข้าร่วมที่รักษาด้วย t2 และได้รับผลกระทบโดยสัมพันธ์กับผู้เข้าร่วมที่รักษาด้วย t1 และได้รับผลกระทบ หากต้องการดูข้อสังเกตนี้ว่า 7.460 - 2.378 = 5.081 (ค่าสัมประสิทธิ์ที่สองในข้อกำหนดแรก) ฉันชอบแนวทางนี้เพราะมันช่วยให้ตีความผลกระทบที่สัมพันธ์กันได้ง่ายขึ้น

ทั้งหมดที่กล่าวมา @MrFlick นั้นถูกต้อง นี่เป็นคำถามสำหรับการตรวจสอบข้าม

person Jacob H    schedule 11.11.2015