繁体   English   中英

比较 R 中两个连续变量和一个分类变量之间的三向交互作用的治疗效果

[英]Compare treatment effects in three way interaction between two continuous variables and one categorical variable in R

我正在尝试运行线性回归 model,其中包含连续变量 A * 连续变量 B * 分类变量(4 个级别的处理)。 数据可以在这里下载。

Model<-lm(H2O2~Treatment*(A*B), data=mydata)

现在我想比较不同的治疗效果。

我知道lstrends可以处理线性 model 中的连续变量 * 分类变量,但在我的情况下它无法工作。 我还尝试根据不同的治疗组划分数据,并创建了 4 个不同的线性模型进行比较,但这也不起作用。

你估计的方程是:

在此处输入图像描述

您可能会对六种不同的处理效果感兴趣 - 它们包含给定AB固定值的处理类别之间的成对差异。 其中三个由估计类别与参考类别的比较来表示。 例如,要计算出HFHC (参考)的影响,您可以计算:

查看 model 中的系数:

b <- coef(Model)
b
    (Intercept)     TreatmentHF     TreatmentLF     TreatmentMF               A               B 
  -1.4318658015    1.5744952961    1.7649475644   -0.6971275663    0.0334782841    0.1528682774 
            A:B   TreatmentHF:A   TreatmentLF:A   TreatmentMF:A   TreatmentHF:B   TreatmentLF:B 
  -0.0022753098   -0.0313728254   -0.0342105088    0.0173173280   -0.1430777577   -0.1214230927 
  TreatmentMF:B TreatmentHF:A:B TreatmentLF:A:B TreatmentMF:A:B 
   0.0212295284    0.0025811227    0.0023565223   -0.0007721532 

你会想要 R,像

b[2] + b[8]*A + b[11]*B + b[14]*A*B

您可能希望替换AB的各种组合,您可以通过将每个值的序列从最小值到最大值,然后将它们交叉来实现。

a_seq <- seq(min(mydata$A), max(mydata$A), length=25)
b_seq <- seq(min(mydata$B), max(mydata$B), length=25)
eg <- expand.grid(A=a_seq, B=b_seq)
head(eg)
#          A    B
# 1  5.03000 4.34
# 2 10.01292 4.34
# 3 14.99583 4.34
# 4 19.97875 4.34
# 5 24.96167 4.34
# 6 29.94458 4.34

然后,您可以在此数据集中制作处理效果。

library(dplyr)
eg <- eg %>% mutate(treat_HC_HF = b[2] + b[8]*A + b[11]*B + b[14]*A*B)

然后,您可以使用热图或类似方法 plot 它。

ggplot(eg, aes(x=A, y=B, fill=treat_HC_HF)) + 
  geom_tile() + 
  scale_fill_viridis_c() + 
  theme_classic() + 
  labs(fill="Treatment\nEffect")

在此处输入图像描述

您也可以对其他比较执行此操作。 有两件事你不能直接从中得到。 首先,这并不能告诉您实际观察到 A 和 B 的位置。其次,它不能告诉您这些影响中的任何一个是否具有统计显着性。 第一个问题可以通过仅绘制数据中 A 和 B 的凸包中的 A 和 B 的假设值来或多或少地解决。

library(geometry)
ch <- convhulln(mydata[,c("A", "B")])
eg <- eg %>% 
  mutate(inhull = inhulln(ch, cbind(A,B)))

eg %>% 
  filter(inhull) %>% 
  ggplot(aes(x=A, y=B, fill=treat_HC_HF)) + 
  geom_tile() + 
  scale_fill_viridis_c(limits = c(min(eg$treat_HC_HF), max(eg$treat_HC_HF))) + 
  theme_classic() + 
  labs(fill="Treatment\nEffect")

在此处输入图像描述

要计算这些是否重要,您必须做更多的工作。 首先,您必须获得每次比较的标准误差。 你需要的是一个我们称之为M的矩阵,它收集你乘以系数以获得治疗效果的值。 因此,在上面的示例中,我们将拥有三个信息:

在此处输入图像描述

在 R 中,我们可以通过以下方式获得这些:

b_t <- b[c(2,8,11,14)]
V_t <- vcov(Model)[c(2,8,11,14), c(2,8,11,14)]
M <- cbind(1, eg$A, eg$B, eg$A*eg$B)

然后,我们可以计算治疗效果的标准误差为:

在 R 中,我们可以这样做并确定哪些治疗效果显着(双尾 95% 检验):

eg <- eg %>% 
  mutate(se = sqrt(diag(M %*% V_t %*% t(M))), 
         sig = abs(treat_HC_HF/se) > pt(0.975, Model$df.residual))

然后我们可以 plot 只有那些在凸包中且显着的效果:

eg %>% 
  filter(inhull, sig) %>% 
  ggplot(aes(x=A, y=B, fill=treat_HC_HF)) + 
  geom_tile() + 
  scale_fill_viridis_c(limits = c(min(eg$treat_HC_HF), max(eg$treat_HC_HF))) + 
  theme_classic() + 
  labs(fill="Treatment\nEffect")

在此处输入图像描述

对于治疗效果水平的六对配对比较中的每一个,您都必须这样做。 这似乎需要做很多工作,但是 model 尽管估算起来很简单,但解释起来却相当复杂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM