如何让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)
代码说明
- 变量转换:在
stat_poly_line的aes中,将y转换为y - 5.05,此时拟合过零点模型等价于原模型y = 5.05 + b*x。 - 逆转换绘图:通过
after_stat(y = y + 5.05)将拟合得到的预测值转换回原y的尺度,确保绘制的线符合原始数据的坐标范围。 - 公式标签调整:修改
stat_poly_eq的eq.with.lhs参数,让显示的公式直接体现固定截距5.05,避免显示转换后的变量公式。
内容的提问来源于stack exchange,提问作者Gage R. Coon
相关产品推荐
相关产品推荐

