如何在R的多变量回归模型中使用受限三次样条(restricted cubic splines)
多变量回归引入受限三次样条的R实现方法
依赖包准备
常用两种实现方案,按需选择:
- 基础实现:用R内置
splines包的ns()函数(自然三次样条,即受限三次样条),无需额外安装 - 进阶实现:用
rms包的rcs()函数,配套的检验、可视化功能更完善,安装命令为install.packages("rms")
具体操作步骤
场景1:仅单个变量存在非线性关联
假设经检验只有bloodtest和因变量存在曲线关系,其余变量保持线性:
- 若使用
rms包实现:
首先需要提前声明数据分布,避免后续绘图、预测报错:
library(rms) dd <- datadist(df) options(datadist = "dd") # 构建模型,4为节点数,可按需调整为3-5 fit <- ols(imaging ~ rcs(bloodtest, 4) + age + sex + timetoblood + timetoimage, data = df)
- 若使用基础
splines包实现:
library(splines) # df=3对应3个节点,自由度与节点数的对应关系为 节点数=自由度 fit <- lm(imaging ~ ns(bloodtest, df = 3) + age + sex + timetoblood + timetoimage, data = df)
场景2:多个变量存在非线性关联
如果同时有多个变量(比如bloodtest和age)都存在曲线关系,直接给所有非线性变量套样条函数即可:
# rms包示例,bloodtest用4个节点,age用3个节点 fit <- ols(imaging ~ rcs(bloodtest, 4) + rcs(age, 3) + sex + timetoblood + timetoimage, data = df)
结果检验与可视化
- 拟合后可通过
anova(fit)查看样条项的显著性,若非线性部分的p值小于0.05,说明引入样条的拟合效果显著优于线性假设 - 若使用
rms包,可直接通过Predict函数绘制调整其他协变量后的变量关联曲线:
# 绘制bloodtest和imaging的调整后关联曲线 plot(Predict(fit, bloodtest))
注意事项
- 节点数通常选择3-5即可,节点越多曲线灵活性越高,但也越容易出现过拟合,小样本优先选3个节点
- 受限三次样条的外推稳定性差,预测新数据时,新样本的自变量不要超出建模数据的取值范围
- 样条仅用于连续变量,分类变量(如sex)无需也不能套样条函数
内容的提问来源于stack exchange,提问作者DW1310
相关产品推荐
相关产品推荐

