运行迭代函数以绘制交互作用效应的边际效应斜率(R)

4xy9mtcn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(120)

我有代码来生成交互效应图,如下所示:(以MTcars为模型)

library(ggplot2)
library(tidyverse)

outcome_var_list = mtcars %>% select(qsec,hp) %>% names()
var_list = mtcars %>% select(cyl,wt) %>% names()

iterate <- sapply(outcome_var_list,function(k){

outcome_var_list = outcome_var_list[outcome_var_list == k] 
  
test= mtcars %>%
  select(all_of(c(outcome_var_list, var_list)), drat)%>%
  pivot_longer(all_of(var_list))%>%
  reframe(broom::tidy(lm(as.matrix(pick(all_of(outcome_var_list)))~
               name/factor(drat):value + 0, data = .)))%>%
  select(term, estimate)%>%
  mutate(color = str_extract(term, "(?<=name)[^:]+"),
         xvar = as.numeric(str_extract(term, "[0-9.]+")))%>%
  drop_na()


test %>%  ggplot(aes(x=xvar, y=estimate, color = color)) + geom_line() + theme_light() + ggtitle(label = paste0("Model 1: ",k)) + theme(plot.title = element_text(hjust = 0.5))

ggsave(file=paste0("file_",k,".png"), width = 19, height = 7, units = "cm",path= "descriptive_1/test")

})

字符串
这将生成如下图:
x1c 0d1x的数据
它绘制了感兴趣的变量和“drat”的每个因子水平之间的交互作用效应的估计值。每个单独的图针对所列出的不同结果变量重复该过程。
我现在想稍微修改一下,(大概)使用marginaleffects包。我想执行与上面类似的功能(评估和绘制组内每个结果变量的每个交互),但我需要稍微不同。我现在的目标是绘制与drat的每个相互作用的相互作用效应的斜率(通过减去边际效应)。我相信这可以通过使用plot_slopes函数来完成,并将因子水平“drat”设置为“condition”参数,并与var_list变量进行交互。然而,我不确定如何迭代类似于上面的函数的这个函数。我也不知道如何将这些斜率一起绘制在与上面相同的ggplot2图上。
此外,我不想绘制一条连续的线,而是想绘制完整的置信区间(点估计的下限和上限),要么用一条线和阴影区域连接,要么不连接。
有没有可能像我前面的例子一样迭代绘制斜率?这是适合marginaleffects包的情况吗?或者有没有一个基础R/替代解决方案更适合它?我还假设,为了正确计算这些斜率,我必须从相互作用项中的:切换到*,绘制两个未相互作用的效应,以便找到真实的斜率。是这样吗?

更新

我看到这在marginaleffects中确实是可能的,至少在手动绘制交互时是这样。例如,我可以执行以下操作:

library(marginaleffects)
lm1 = lm(data = mtcars, formula = hp ~ cyl*factor(drat))
lm2 = lm(data = mtcars, formula = hp ~ wt*factor(drat))
p1_data = plot_slopes(lm1, variables = "cyl", condition = "drat", draw = FALSE) %>% select(-cyl)
p2_data = plot_slopes(lm2, variables = "wt", condition = "drat", draw = FALSE) %>% select(-wt)

rbind(p1_data,p2_data) %>% ggplot() + geom_point(aes(x = factor(drat), y = predicted, color = term)) + geom_errorbar(aes(ymin = predicted_lo, ymax = predicted_hi, x = factor(drat), color = term))


这将生成以下图:



由于比例关系,无法看到误差线,但这是正确的绘图。然而,我的目标是自动化这一点,就像上面的代码一样,这样就不会为var_list中的每个变量单独绘制每个回归,而是自动输入并为每个变量生成不同颜色的线条。然后,我将对outcome_var_list中的每个变量进行迭代,以生成多个图。

i86rm4rw

i86rm4rw1#

也许只是使用一个简单的循环?对我来说,这似乎很容易和可读:

library(ggplot2)
library(marginaleffects)

outcome_var_list = c("qsec", "hp")
regressor_var_list = c("wt", "cyl")
results = list()
for (o in outcome_var_list) {
  for (r in regressor_var_list) {
    f = paste(o, "~", r, "* factor(drat)")
    m = lm(f, mtcars)
    s = plot_slopes(m, variables = r, condition = "drat", draw = FALSE)
    tmp = s[, c("estimate", "conf.low", "conf.high", "drat")]
    tmp$outcome = o
    tmp$regressor = r
    results = c(results, list(tmp))
  }
}
results = do.call("rbind", results)

# remove outlier for nicer plot
results = subset(results, estimate < 4000)

ggplot(results, aes(x = drat, y = estimate, ymin = conf.low, ymax = conf.high)) +
  geom_pointrange() +
  facet_wrap(~outcome + regressor)

字符串


的数据

相关问题