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

如何让stat_poly_line()拟合指定非零y截距的线性模型?

用ggpmisc的stat_poly_line强制拟合指定非零截距的解决方案

要在不更换包的前提下,让stat_poly_line()拟合固定非零截距(如5.05)的线性模型,可通过变量转换+结果逆转换的方式实现,具体步骤如下:

核心思路

将响应变量y减去指定截距值,把问题转化为拟合过零点的线性模型(即y_adj ~ x + 0,其中y_adj = y - 5.05),再将拟合得到的预测值加回截距,还原为原尺度的拟合线,等价于强制原模型截距为5.05。

完整代码

library(ggplot2)
library(ggpmisc)

# 原始数据
mydata <- structure(list(y = c(20.2, 29.74, 22.37, 24.51, 
37.2, 31.43, 43.05, 54.36, 65.44, 67.28, 46.02), x = c(0.422014140000002, 
1.09152966, 1.3195521, 3.54231348, 2.79431778, 3.40756002, 5.58845772, 
7.10762298, 9.70041246, 11.7199653, 15.89668266)), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

# 绘图代码
myplot <- ggplot(mydata, aes(x = x, y = y)) +
  # 拟合并绘制固定截距的线
  stat_poly_line(
    aes(y = y - 5.05),  # 转换响应变量
    se = FALSE, 
    linetype = "dashed", 
    na.rm = TRUE, 
    formula = y ~ x + 0,  # 拟合过零点模型
    after_stat(y = y + 5.05)  # 逆转换回原尺度
  ) +
  # 显示正确的模型公式与统计量
  stat_poly_eq(
    aes(y = y - 5.05),
    use_label(c("eq", "R2", "adj.R2")), 
    na.rm = TRUE, 
    formula = y ~ x + 0,
    label.x = "right", label.y = "top",
    eq.with.lhs = "italic(y)~`=`~5.05 +",  # 自定义公式左侧,显示固定截距
    eq.x.rhs = "italic(x)"  # 指定公式右侧的自变量符号
  ) +
  geom_point(size = 2.5)

# 查看绘图
print(myplot)

代码说明

  1. 变量转换:在stat_poly_line的aes中,将y转换为y - 5.05,此时拟合过零点模型等价于原模型y = 5.05 + b*x。
  2. 逆转换绘图:通过after_stat(y = y + 5.05)将拟合得到的预测值转换回原y的尺度,确保绘制的线符合原始数据的坐标范围。
  3. 公式标签调整:修改stat_poly_eq的eq.with.lhs参数,让显示的公式直接体现固定截距5.05,避免显示转换后的变量公式。

内容的提问来源于stack exchange,提问作者Gage R. Coon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:33:12