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
相关产品推荐
相关产品推荐

