为effects包多面板效应图添加面板专属水平线
问题描述
使用effects包绘制有序逻辑回归的效应图时,希望为多面板图的每个面板添加对应不同基线概率的水平线(代表预测变量无效应时的预期基线概率)。尝试用基础绘图的abline()函数添加失败,不清楚如何为effects生成的绘图对象添加自定义线条元素。示例代码如下:
# Simulate some data data = data.frame(predictor_x = rnorm(100, mean = 5, sd = 1), response_y = as.factor(rbinom(100, size = 2, prob = 0.5))) # Make a model library(MASS) model = polr(response_y ~ predictor_x, data = data, Hess= TRUE) # Plot library(effects) p1 = plot(Effects(focal.predictor = "predictor_x", model)) # View p1 # Try to add a red dashed line for expected probabilities p1 + abline(h = c(0.25, 0.5, 0.25), col = "red", lty = 3) #failed
需求为:上层面板添加y=0.25的水平线,中间面板添加y=0.5的水平线,下层面板添加y=0.25的水平线。
解决方案
effects包的plot()函数可以返回ggplot2对象,因此需要用ggplot2的语法添加图层,而非基础绘图的abline()。具体步骤如下:
- 明确指定返回ggplot对象,确保可以用ggplot语法扩展
- 构造包含分面变量和对应水平线y值的数据框
- 使用
geom_hline()为每个面板匹配对应水平线
完整代码:
# 模拟可重复的数据 set.seed(123) data <- data.frame( predictor_x = rnorm(100, mean = 5, sd = 1), response_y = as.factor(rbinom(100, size = 2, prob = 0.5)) ) # 拟合有序逻辑回归模型 library(MASS) model <- polr(response_y ~ predictor_x, data = data, Hess = TRUE) # 生成效应图并指定返回ggplot对象 library(effects) library(ggplot2) p1 <- plot(Effects(focal.predictor = "predictor_x", model), returnType = "ggplot") # 构造每个面板对应的基线概率数据 # response_y对应分面的变量,yintercept是每个面板的水平线位置 hline_data <- data.frame( response_y = levels(data$response_y), yintercept = c(0.25, 0.5, 0.25) ) # 为每个面板添加红色虚线 p1 + geom_hline( data = hline_data, aes(yintercept = yintercept), color = "red", linetype = "dashed" )
关键说明
returnType = "ggplot":强制effects返回ggplot对象,避免默认的格子图(lattice)格式,确保兼容ggplot2的图层扩展hline_data:通过匹配分面变量(response_y的水平),让ggplot自动为每个面板分配对应的水平线位置geom_hline():利用ggplot的分面映射逻辑,精准将水平线添加到对应面板
内容的提问来源于stack exchange,提问作者Jade131621
相关产品推荐
相关产品推荐

