R语言分段线性拟合问题求助:2015年为断点的拟合结果异常
R语言分段线性拟合问题修正
问题描述
以2015年为断点,对以下数据进行分段线性拟合:
year <- c(2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022) score <- c(85, 85, 88, 88, 94, 94, 94, 82, 82, 84, 84, 84, 84, 84, 84)
原代码尝试拟合但结果不符合预期,尤其是2015年后的拟合趋势错误:
stage1 <- year - 2008 stage2 <- (year - 2015) * (year >= 2015) fm <- lm(score~ stage1 + stage2) summary(fm) library(car) linearHypothesis(fm, "stage1 + stage2", verbose = TRUE) plot(score ~ year) lines(fitted(fm) ~ year, col = "red") abline(v = 2015, lty = 2)
拟合结果如图:
问题原因
原代码的变量定义逻辑错误:
stage1采用year-2008的平移处理,导致模型无法正确捕捉断点前后的斜率关联stage2的构造未遵循断点连续型分段线性拟合的标准变量规则,使得第二段斜率计算出现偏差
修正方案
采用断点连续的分段线性拟合标准方法:
- 保留原始年份变量
x = year,明确断点c = 2015 - 构造分段变量
x_c = pmax(x - c, 0),该变量在断点前取值为0,断点后取值为year-2015 - 模型中
x的系数对应第一段(2008-2015)的斜率,x_c的系数为两段斜率的差值,即第二段斜率 = 第一段斜率 +x_c系数
修正后的代码:
# 定义数据 year <- c(2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022) score <- c(85, 85, 88, 88, 94, 94, 94, 82, 82, 84, 84, 84, 84, 84, 84) # 构造分段变量 x <- year c <- 2015 x_c <- pmax(x - c, 0) # 拟合模型 fm_correct <- lm(score ~ x + x_c) summary(fm_correct) # 可视化结果 plot(score ~ year, main = "分段线性拟合(断点2015)", xlab = "年份", ylab = "分数") lines(fitted(fm_correct) ~ year, col = "red", lwd = 2) abline(v = 2015, lty = 2, col = "gray")
结果解释
- 第一段(2008-2015)的斜率为
x的系数,代表该区间内分数随年份的变化率 - 第二段(2015-2022)的斜率为
x系数与x_c系数之和,对应2015年后的分数变化趋势 - 模型保证断点(2015年)处的拟合值连续,符合分段线性拟合的常规要求
内容的提问来源于stack exchange,提问作者Skyer
相关产品推荐
相关产品推荐

