R语言如何可视化3个以上自变量的多元回归并绘制±1 SD区间
多元线性回归可视化问题解答
注:你提供的示例代码中
lm1的公式重复写入了iris$Petal.Width,实际使用时建议删除重复项避免共线性问题。
一、多自变量多元线性回归的高效汇总可视化方案
- 优先推荐
ggeffects包:专门用于回归模型边际效应可视化,支持最多4个自变量同时展示(通过x轴、分组颜色、行/列分面组合实现),生成的图表自带置信区间、标准差区间配置,代码非常简洁:library(ggeffects) # 计算边际效应,terms参数指定要展示的变量,可指定控制变量固定的分位数 me <- ggpredict(lm1, terms = c("Sepal.Width", "Species", "Petal.Width [quart2]")) plot(me) + theme_bw() - 其次可以用
ggstatsplot包的ggcoefstats函数:一键生成回归系数森林图,同时展示系数值、置信区间、显著性标记,适合快速汇总所有自变量的效应方向和显著性,比附加变量图更适合结果汇报:library(ggstatsplot) ggcoefstats(lm1) - 你提到的
ggPredict函数来自ggiraphExtra包,确实支持最多3个变量的可视化,还支持交互效果,用法如下:library(ggiraphExtra) ggPredict(lm1, mapping = aes(color=Species, fill=Species), se=FALSE, show.point = TRUE)
如果自变量超过4个,可以用分面分组分批展示核心变量的效应,其余控制变量固定在均值/分位数值即可。
二、添加±1标准差区间带的实现方法
1. 基于ggplot的散点回归图实现
geom_smooth默认的se参数输出的是95%置信区间,要改成±1标准差的话,需要手动计算预测值和标准差,再用geom_ribbon绘制:
library(dplyr) # 按物种分组拟合模型,提取预测值和标准差 iris_reg <- iris %>% group_by(Species) %>% mutate( pred = predict(lm(Sepal.Length ~ Sepal.Width, data = cur_data())), sd = predict(lm(Sepal.Length ~ Sepal.Width, data = cur_data()), se.fit = TRUE)$se.fit ) ggplot(iris_reg, aes(x = Sepal.Width, y = Sepal.Length, col = Species, fill = Species)) + geom_point(size=1) + geom_line(aes(y = pred), linewidth = 1) + # 添加±1标准差区间 geom_ribbon(aes(ymin = pred - sd, ymax = pred + sd), alpha = 0.2, color = NA) + theme_bw()
如果是全样本不分物种的回归,去掉group_by分组逻辑即可。
2. 附加变量图添加±1标准差区间
car包的avPlots默认没有提供标准差区间的参数,可以手动提取附加变量图的数据,再用ggplot重绘并添加区间:
library(car) # 提取avPlots的数据,不直接绘图 av_data <- avPlots(lm1, intercept = TRUE, plot = FALSE) # 提取Sepal.Width对应的附加变量数据,可按需替换为其他自变量 sw_av <- as.data.frame(av_data$`iris$Sepal.Width`) colnames(sw_av) <- c("x", "y") # 拟合附加变量的回归,计算标准差 av_lm <- lm(y ~ x, data = sw_av) sw_av$pred <- predict(av_lm) sw_av$sd <- predict(av_lm, se.fit = TRUE)$se.fit # 绘制带±1标准差区间的附加变量图 ggplot(sw_av, aes(x = x, y = y)) + geom_point() + geom_line(aes(y = pred), color = "blue") + geom_ribbon(aes(ymin = pred - sd, ymax = pred + sd), alpha = 0.2, fill = "blue") + labs(x = "Sepal.Width | 控制其余变量", y = "Sepal.Length | 控制其余变量") + theme_bw()
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

