[英]Visualising a three way interaction between two continuous variables and one categorical variable in 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 个不同的线性模型进行比较,但这也不起作用。
你估计的方程是:
您可能会对六种不同的处理效果感兴趣 - 它们包含给定A
和B
固定值的处理类别之间的成对差异。 其中三个由估计类别与参考类别的比较来表示。 例如,要计算出HF
与HC
(参考)的影响,您可以计算:
查看 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
您可能希望替换A
和B
的各种组合,您可以通过将每个值的序列从最小值到最大值,然后将它们交叉来实现。
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.