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

R语言plot_cap如何绘制指定反事实范围的响应曲线

问题复现

下述代码可复现大规模复杂数据集处理中遇到的同类问题:

library(marginaleffects)
library(truncnorm)

yield_kgha<-rtruncnorm(n=100, mean=2000, sd=150)
n_kgha<-rtruncnorm(n=100, a=40, b=298, mean=150, sd=40)

i<-lm(yield_kgha~n_kgha+I(n_kgha^2))
summary(i)

使用marginaleffects包的predictions函数,可基于回归模型i计算不同施氮率(n_kgha)对应的预测产量(yield_kgha)。原始数据中n_kgha取值范围仅约为40-250,通过下述代码可获取原始数据未覆盖区间的预测结果:

p <- predictions(
  i,
  newdata = datagrid(model = i, n_kgha = seq(0, 300, by = 25), grid_type = "counterfactual"))
summary(p, by = "n_kgha")

最初尝试调用plot_cap函数绘制0-300全范围(含原始数据未覆盖区间)的产量条件响应曲线:

plot_cap(i, condition = "n_kgha")

受限于原始数据n_kgha的40-250取值范围,上述代码仅能输出原始数据极值区间内的曲线,无法覆盖0-300全范围,运行效果如下:
运行结果示意图

待解决问题:

  • 是否存在参数设置方式,让plot_cap函数和predictions函数一致,支持基于指定的反事实n_kgha取值范围计算并绘图?
  • 若plot_cap不支持该功能,应使用什么方法绘制反事实取值下的预测值响应曲线?

解决方案

plot_cap是marginaleffects旧版本留存的函数,本身不支持直接传入自定义反事实取值网格,不推荐继续使用。有两种可直接实现需求的方法:

方法1:使用官方推荐的plot_predictions函数(最简便)

当前版本marginaleffects的预测绘图统一使用plot_predictions实现,原生支持在condition参数中直接指定目标变量的取值序列,无需额外数据处理即可绘制全范围反事实曲线:

# 直接指定n_kgha的取值范围为0-300,步长设为1保证曲线平滑
plot_predictions(
  i,
  condition = list(n_kgha = seq(0, 300, by = 1))
)

该函数默认输出带95%置信区间的响应曲线,和plot_cap输出样式一致,且完全支持自定义取值范围。

方法2:基于predictions结果手动绘图(灵活度最高)

如果需要自定义绘图样式,可先生成目标范围的预测结果,再用ggplot2手动绘制,样式完全可控:

library(ggplot2)

# 生成0-300范围、步长1的平滑预测网格
p <- predictions(
  i,
  newdata = datagrid(model = i, n_kgha = seq(0, 300, by = 1), grid_type = "counterfactual")
)

# 自定义绘图
ggplot(p, aes(x = n_kgha, y = estimate)) +
  geom_line(linewidth = 1, color = "#2c3e50") +
  # 绘制置信区间阴影
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = 0.2, fill = "#3498db") +
  labs(
    x = "施氮率 (kg/ha)",
    y = "预测产量 (kg/ha)"
  ) +
  theme_bw()

内容的提问来源于stack exchange,提问作者Erin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:36:20