You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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()。具体步骤如下:

  1. 明确指定返回ggplot对象,确保可以用ggplot语法扩展
  2. 构造包含分面变量和对应水平线y值的数据框
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:40:22