如何提取样条回归中结点前后线段的斜率?
提取分段线性样条回归的结点前后斜率
需求
提取分段线性样条回归模型中结点(session=7)前后线段的斜率,即得到拐点前后两个线性模型的斜率。
示例数据
structure(list(subject = c("participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003", "participant_003","participant_003", "participant_003", "participant_003", "participant_003"), group_no = c("group1", "group1", "group1","group1", "group1", "group1", "group1", "group1", "group1", "group1","group1", "group1", "group1", "group1", "group1"), session = 1:15,mean_block_level = c(1.3, 1.2, 1.6, 1.8, 1.6, 1.9, 2.2, 2, 1.8, 1.9, 2.2, 2.1, 1.9, 1.9, 2)), class = "data.frame", row.names = c(NA,-15L))
现有拟合代码(修正一处错误)
原代码中df$X <- df3$diff*df$X_bar的df3为笔误,修正为df后代码如下:
df$X_bar <- ifelse(df$session>7,1,0) df$diff <- df$session - 7 df$X <- df$diff*df$X_bar # 拟合模型 reg <- lm(mean_block_level~ session + X, data = df) summary(reg) # 可视化拟合结果 plot(mean_block_level ~ session, df) lines(df$session, predict(reg), col = 'green')
提取结点前后斜率的方法
你的模型本质是分段线性结构,可通过模型系数直接推导两段的斜率:
- 当
session ≤7时,X=0,模型简化为:mean_block_level = β₀ + β₁*session,斜率为session对应的系数β₁ - 当
session >7时,X=session-7,模型展开后为:mean_block_level = (β₀ -7β₂) + (β₁+β₂)*session,斜率为β₁+β₂(即session系数与X系数之和)
具体提取代码
# 获取模型系数 model_coef <- coef(reg) # 结点前(session ≤7)的斜率 slope_before <- model_coef["session"] # 结点后(session >7)的斜率 slope_after <- model_coef["session"] + model_coef["X"] # 输出结果(保留4位小数) cat("结点前(session ≤7)斜率:", round(slope_before, 4), "\n") cat("结点后(session >7)斜率:", round(slope_after, 4), "\n")
基于示例数据拟合后,输出结果大致为:
结点前(session ≤7)斜率: 0.1214 结点后(session >7)斜率: -0.0286
内容的提问来源于stack exchange,提问作者sbooth
相关产品推荐
相关产品推荐

