我有代码来生成交互效应图,如下所示:(以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
中的每个变量进行迭代,以生成多个图。
1条答案
按热度按时间i86rm4rw1#
也许只是使用一个简单的循环?对我来说,这似乎很容易和可读:
字符串
的数据