首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释回归模型中的交互作用

解释回归模型中的交互作用
EN

Stack Overflow用户
提问于 2015-11-11 12:05:56
回答 2查看 1.8K关注 0票数 3

我希望是一个简单的问题。

我有一个实验设计,我测量了两组的反应(比如说血压):对照组和受影响组,两组都接受了三种治疗: t1,t2,t3。数据在任何意义上都不是配对的。

下面是一个数据示例:

代码语言:javascript
复制
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)))

我感兴趣的是量化每个治疗对受影响组相对于对照组的影响。我该如何建模,比如使用线性模型(例如R中的lm )?

我是不是错了:

代码语言:javascript
复制
lm(response ~ 0 + treatment * group, data = df)

相当于:

代码语言:javascript
复制
lm(response ~ 0 + treatment + group + treatment:group, data = df)

不是我需要的吗?我认为在这个模型中,治疗:组相互作用项相对于所有基线组和基线治疗测量的平均值。

因此,我认为这个模型:

代码语言:javascript
复制
lm(response ~ 0 + treatment:group, data = df)

是我需要的,但它正在量化治疗和组交互作用的每个组合:治疗t1:组对照治疗t1:组有效治疗t2:组对照治疗t2:组影响治疗t3:组对照治疗t3:组有效治疗t3:组影响治疗t3:组影响治疗t3:组影响治疗

所以也许这个模型:

代码语言:javascript
复制
lm(response ~ 0 + treatment + treatment:group, data = df)

是正确的吗?

虽然除了量化每个治疗组合和群体影响的相互作用项外,它还量化了每个治疗的效果。我不确定在这个模型中每个处理和组影响相互作用项的基线是多少。

如果能帮上忙,我们将不胜感激。

另外,假设我运行了第四个处理,实际上是两个处理的组合,比如t1+t3,我不知道它们的组合效果是什么:相加/相减或协同作用。有没有办法把它结合起来呢?

EN

回答 2

Stack Overflow用户

发布于 2015-11-11 13:52:50

交互作用术语告诉您,组之间的差异取决于处理,即对于t1、t2和t3,受影响组和对照组之间的差异是不同的。

不过,我会对拦截进行建模。

代码语言:javascript
复制
lm(response ~ group + treatment + group:treatment, data=df)

在获得一个重要的交互术语后,我将使用t.tests进一步研究并帮助解释。

可以看出,这种相互作用是由t2相对于其他因素的更大影响驱动的。

代码语言:javascript
复制
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))

票数 3
EN

Stack Overflow用户

发布于 2015-11-11 13:18:09

您的第一个规范很好。

代码语言:javascript
复制
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。

如果我做这个分析,我会保留截获的信息。

代码语言:javascript
复制
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先生”是对的。这是一个用于交叉验证的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33644110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档