我在R中有一个模型,其中包括两个连续自变量IVContinuousA,IVContinuousB,IVCategorical和一个分类变量(具有两个级别:控制和治疗)之间的重要三元交互。因变量是连续的(DV)。

model <- lm(DV ~ IVContinuousA * IVContinuousB * IVCategorical)

您可以找到数据here

我试图找到一种方法在R中可视化它,以简化我的解释(也许在ggplot2中?)。

受到this blog post的某种启发,我认为我可以将IVContinuousB分为高值和低值(所以它本身将是一个两级因素:
IVContinuousBHigh <- mean(IVContinuousB) + sd (IVContinuousB)
IVContinuousBLow <- mean(IVContinuousB) - sd (IVContinuousB)

然后,我计划绘制DV和IV ContinuousA之间的关系,并针对IVCategorical和我的新二分IVContinuousB的不同组合,绘制代表该关系的斜率的拟合线:
IVCategoricalControlIVContinuousBHighIVCategoricalControlIVContinuousBLowIVCategoricalTreatmentIVContinuousBHighIVCategoricalTreatmentIVContinuousBLow
我的第一个问题是,这听起来像是一种可行的解决方案,它可以产生这种可解释的三向相互作用图吗?我想尽可能避免使用3D绘图,因为我不觉得它们直观...还是有另一种解决方法?也许上面不同组合的面图?

如果可以,那么我的第二个问题是如何生成数据以预测拟合线以表示上述不同组合?

第三个问题-是否有人对如何在ggplot2中进行编码有任何建议?

我在Cross Validated上发布了一个非常类似的问题,但是因为它与更多的代码相关,所以我想我可以改在这里尝试(如果该帖子与社区更相关,我将删除CV帖子:))

在此先多谢

莎拉

请注意,DV列中有NA(空白),设计是不平衡的-变量IVCategorical的“对照组”与“治疗”组中的数据点数量略有不同。

仅供引用,我有将IVContinuousA和IVCategorical之间双向交互进行验证的代码:

A
但是我想要的是在IVContinuousB ...上绘制这种关系的条件。

最佳答案

这里有几个选项可以在二维中可视化模型输出。我在这里假设目标是将TreatmentControl进行比较

library(tidyverse)
  theme_set(theme_classic() +
          theme(panel.background=element_rect(colour="grey40", fill=NA))

dat = read_excel("Some Data.xlsx")  # I downloaded your data file

mod <- lm(DV ~ IVContinuousA * IVContinuousB * IVCategorical, data=dat)

# Function to create prediction grid data frame
make_pred_dat = function(data=dat, nA=20, nB=5) {
  nCat = length(unique(data$IVCategorical))
  d = with(data,
           data.frame(IVContinuousA=rep(seq(min(IVContinuousA), max(IVContinuousA), length=nA), nB*2),
                      IVContinuousB=rep(rep(seq(min(IVContinuousB), max(IVContinuousB), length=nB), each=nA), nCat),
                      IVCategorical=rep(unique(IVCategorical), each=nA*nB)))

  d$DV = predict(mod, newdata=d)

  return(d)
}

IVContinuousA级别划分DVIVContinuousB
当然,这里可以切换IVContinuousAIVContinuousB的角色。
ggplot(make_pred_dat(), aes(x=IVContinuousA, y=DV, colour=IVCategorical)) +
  geom_line() +
  facet_grid(. ~ round(IVContinuousB,2)) +
  ggtitle("IVContinuousA vs. DV, by Level of IVContinousB") +
  labs(colour="")

r - 可视化R中两个连续变量和一个分类变量之间的三向交互-LMLPHP

您可以不加分面地绘制类似的图,但是随着IVContinuousB级别数的增加,它变得难以解释:
ggplot(make_pred_dat(nB=3),
       aes(x=IVContinuousA, y=DV, colour=IVCategorical, linetype=factor(round(IVContinuousB,2)))) +
  geom_line() +
  #facet_grid(. ~ round(IVContinuousB,2)) +
  ggtitle("IVContinuousA vs. DV, by Level of IVContinousB") +
  labs(colour="", linetype="IVContinuousB") +
  scale_linetype_manual(values=c("1434","11","62")) +
  guides(linetype=guide_legend(reverse=TRUE))

r - 可视化R中两个连续变量和一个分类变量之间的三向交互-LMLPHP

模型预测差异的热图,DV处理-IVContinuousAIVContinuousB值网格上的DV控制

下面,我们看一下每对IVContinuousAIVContinuousB的处理和控制之间的区别。
ggplot(make_pred_dat(nA=100, nB=100) %>%
         group_by(IVContinuousA, IVContinuousB) %>%
         arrange(IVCategorical) %>%
         summarise(DV = diff(DV)),
       aes(x=IVContinuousA, y=IVContinuousB)) +
  geom_tile(aes(fill=DV)) +
  scale_fill_gradient2(low="red", mid="white", high="blue") +
  labs(fill=expression(Delta*DV~(Treatment - Control)))

r - 可视化R中两个连续变量和一个分类变量之间的三向交互-LMLPHP

关于r - 可视化R中两个连续变量和一个分类变量之间的三向交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49086652/

10-12 17:22