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

R语言使用lm函数拟合线性回归如何强制回归线过指定点

R中强制线性回归线经过指定坐标点的实现方法

完全可以实现该约束拟合,仅用R基础内置函数即可完成,不需要依赖第三方包。

实现原理

你当前使用的无约束简单线性回归形式为:
Price = a + b * CumQuantity + 随机误差
其中a为截距(对应原代码里的MyCoef[1]),b为斜率(对应MyCoef[2])。

如果要求拟合直线必须经过指定点$(x_0, y_0)$(即CumQuantity=x0时Price=y0),则参数必须满足约束y0 = a + b*x0,推导可得a = y0 - b*x0。将该关系代回原模型做变形,可得到:
Price - y0 = b*(CumQuantity - x0) + 随机误差
此时拟合无截距项的一元线性回归,得到的唯一系数就是约束条件下的斜率b,再代入约束公式即可算出对应的截距a。

实现代码

先替换你需要固定经过的点坐标,再运行以下代码即可得到符合要求的参数:

# 1. 定义需要强制经过的指定点坐标,替换为实际需要的取值
x0 <- 10  # 指定点对应的CumQuantity值
y0 <- 50  # 指定点对应的Price值

# 2. 拟合带过点约束的线性模型
ConstrainedModel <- lm(
  formula = I(MyData$Price - y0) ~ I(MyData$CumQuantity - x0) + 0
)

# 3. 提取约束条件下的斜率、计算对应截距
b_constr <- coef(ConstrainedModel)[[1]]
a_constr <- y0 - b_constr * x0

# 4. 整理成和原MyCoef格式一致的结果(截距在前,斜率在后)
MyCoef_constr <- c(a_constr, b_constr)
names(MyCoef_constr) <- c("(Intercept)", "CumQuantity")

注意事项

  • 代码中I()函数不可省略,作用是告知R将括号内的变量变换结果直接作为模型特征,不要按公式语法解析运算符号
  • 公式末尾的+0是固定写法,作用是移除模型默认的截距项,匹配变形后的无截距模型形式
  • 可通过以下代码快速验证拟合结果是否满足过点约束,返回结果应与设置的y0完全一致:
# 验证指定点的拟合值
a_constr + b_constr * x0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:47:37