如何用R绘制展示自变量负交互效应减弱趋势的可视化图形?
如何用ggplot2绘制有序回归中的交互效应图
问题背景
我对数据集做了有序回归分析,发现两个显著自变量:ER_Ratio和Goals_Score。其中:
Goals_Score与ER_Ratio存在负交互作用:当ER_Ratio降低时,Goals_Score对因变量Academic.Performance的效应会减弱;Goals_Score与不显著自变量Adj_Score也存在负交互作用:当Adj_Score升高时,Goals_Score对Academic.Performance的效应会减弱。
交互模型输出结果
Adj_Score:Goals_Score had a value of -0.064, and Std. Error of 0.026, and a t value of -2.428. Goals_Score:ER_Ratio had a value of -0.055, an Std.Error of 0.0096, and a t value of -5.7654.
尝试的代码及问题
我用下面的ggplot2代码绘图:
ggplot(data, aes(x=Goals_Score, y=Academic.Performance)) + geom_point(aes(color = Adj_Score)) + geom_smooth(method = “lm”, se = FALSE) + scale_color_gradient (low = “blue”, high = “red”)
但这个图只显示高Academic.Performance对应高Goals_Score和高Adj_Score,没法展示“当Adj_Score升高时,Goals_Score对Academic.Performance的效应减弱”(以及ER_Ratio的类似情况)的效果,请问该怎么用R绘制符合需求的图?
修正后的示例数据集
(注:原示例数据存在语法错误,已修正补全并将因变量设为有序因子)
n <- 10 dat <- data.frame(id=1:n, Adj_Score = c(0.555, 0.444, 0.4888, 0.7333, 0.4888, 0.8222, 0.7555, 0.666, 0.9111, 0.5222), Goals_Score= c(32, 54, 38, 47, 35, 50, 53, 42, 49, 39), Academic.Performance = factor(c("0-40%", "41-50%", "51-60%", "61-70%", "71-80%", "81-90%", "91-100%", "51-60%", "71-80%", "41-50%"), levels = c("0-40%", "41-50%", "51-60%", "61-70%", "71-80%", "81-90%", "91-100%"), ordered = TRUE))
解决方案
要展示交互效应,核心是按调节变量的分组(或关键水平)分别拟合回归线,直观呈现自变量斜率随调节变量变化的趋势。以下分两种交互情况给出实现代码:
1. 展示Goals_Score与Adj_Score的交互效应
方法:按Adj_Score分位数分组拟合
将Adj_Score分为高、中、低三组,分别绘制Goals_Score对Academic.Performance的回归线:
library(ggplot2) library(dplyr) # 给Adj_Score按三分位数分组 dat <- dat %>% mutate(Adj_Group = cut(Adj_Score, breaks = quantile(Adj_Score, probs = c(0, 0.33, 0.66, 1)), labels = c("低Adj_Score", "中Adj_Score", "高Adj_Score"), include.lowest = TRUE)) # 绘制交互效应图 ggplot(dat, aes(x = Goals_Score, y = as.numeric(Academic.Performance))) + geom_point(aes(color = Adj_Group), alpha = 0.7) + geom_smooth(aes(color = Adj_Group), method = "lm", se = FALSE, linewidth = 1) + scale_color_manual(values = c("低Adj_Score" = "blue", "中Adj_Score" = "green", "高Adj_Score" = "red")) + labs(x = "目标得分", y = "学业表现(数值化)", color = "调节变量分组") + theme_minimal()
说明:
- 有序因变量需转为数值型(
as.numeric(Academic.Performance))才能用线性拟合展示趋势; - 绘图后可清晰看到:高
Adj_Score组的回归线斜率比低组更平缓,对应“Adj_Score升高时,Goals_Score对学业表现的效应减弱”的结论。
2. 展示Goals_Score与ER_Ratio的交互效应
逻辑与上述一致,按ER_Ratio分位数分组后绘图:
# 假设数据集包含ER_Ratio列,先按三分位数分组 dat <- dat %>% mutate(ER_Group = cut(ER_Ratio, breaks = quantile(ER_Ratio, probs = c(0, 0.33, 0.66, 1)), labels = c("低ER_Ratio", "中ER_Ratio", "高ER_Ratio"), include.lowest = TRUE)) # 绘制交互效应图 ggplot(dat, aes(x = Goals_Score, y = as.numeric(Academic.Performance))) + geom_point(aes(color = ER_Group), alpha = 0.7) + geom_smooth(aes(color = ER_Group), method = "lm", se = FALSE, linewidth = 1) + scale_color_manual(values = c("低ER_Ratio" = "blue", "中ER_Ratio" = "green", "高ER_Ratio" = "red")) + labs(x = "目标得分", y = "学业表现(数值化)", color = "调节变量分组") + theme_minimal()
说明:
- 绘图后会看到低
ER_Ratio组的回归线斜率更平缓,对应“ER_Ratio降低时,Goals_Score对学业表现的效应减弱”的结论。
进阶方法:用interactions包直接绘制有序回归交互效应
如果不想手动分组,可使用interactions包的interact_plot函数,自动处理有序因变量并展示交互趋势:
library(interactions) library(MASS) # 用于拟合有序回归模型 # 拟合包含交互项的有序回归模型(以Adj_Score为例) ord_model <- polr(Academic.Performance ~ Goals_Score * Adj_Score, data = dat, Hess = TRUE) # 绘制交互效应图 interact_plot(ord_model, pred = Goals_Score, modx = Adj_Score, modx.values = c("min", "mean", "max"), y.label = "学业表现", x.label = "目标得分", legend.main = "Adj_Score")
说明:
- 该函数会直接输出不同
Adj_Score水平(最小值、均值、最大值)下,Goals_Score对学业表现的预测趋势线,无需手动转换因变量类型; - 替换
modx = ER_Ratio即可绘制另一组交互效应。
内容的提问来源于stack exchange,提问作者Lina Kader
相关产品推荐
相关产品推荐

