Restricted cubic splines

本文主要译自:Restricted cubic splines, 翻译加上自己的理解,整理如下。

在统计学里,splines 技术用来对变量进行转换。有时候我们会将连续性变量转化为分类变量(哑变量化),因为该连续性变量与结局变量之间的线性关系比较差。比如建立疾病预后模型时,年龄这个变量通常会被通过选取一个合适的界值转化为分类变量。然而,很多大佬并不推荐使用分类变量。生统大佬 Frank Harrell 教授在 Regression Modeling Strategies 一书中就有专门一个小标题是 Avoiding Categorization,并指出推荐使用splines 技巧。很多大佬都认为 categorizing (which is the dummy variable method) isn’t a good method. 转为分类变量的这种方法主要有2个缺陷:第一是会压缩变量的效应(损失了大量方差信息),第二是会出现跳跃(界点附近的跳跃会使模型拟合变差)。Restricted cubic splines (RCS) 可以很好地解决这些问题,但是RCS有个最大的缺陷就是,生物学解释性较差。

处理非线性关系的方法有很多,rms包中rms.trans提供的方法就有好几种,其中RCS是最常用的策略,以下表格进行了大致汇总:

      

 

RCS有个问题:选择多少个knots(节点)以及选择哪些位置作为 knots。Frank Harrell 教授的推荐如下:

N<100 时,选择4个knots,分别选定在:5%, 35%, 65% 和 95% 这4个百分位点处。

N≥100 时,选择5个knots,分别选定在:5%, 27.5%, 50%, 72.5% 和 95% 这5个百分位点处。

      

 

哑变量化(直接转成分类变量)的效果:

      

解决“效应压缩”问题(恢复方差),效果:

      

解决“跳跃”问题(界点前后保持连续),即采用 restricted linear spline 变换,效果:

      

用曲线技术平滑化(多项式平滑),效果:

      

 

笔者曾试图自己写函数变换(包括多项式变换、指数变换等)进行预处理,但是比较麻烦,需要预先评估变换的类型,而RCS这种方式,通常都比较有效,还是回归到用RCS策略吧。

RCS相关的工具包:rms包的rcs函数、splines包的bs函数等。

 

参考资料

Restricted cubic splines

Frank Harrell. Regression Modeling Strategies. Springer

Restricted Cubic Spline Regression: A Brief Introduction

 

 

我目前的代码是” #清空环境 rm(list = ls()) install.packages("ggeffects") # 加载必要的 R 包 library(nnet) # 多项 logistic 回归 library(rms) # restricted cubic splines library(ggeffects) # 预测可视化 library(ggplot2) # 绘图 # 读取数据(CSV 文件) df <- read.csv("/Users/haoyuqing/Desktop/正在做的/CLHLS休闲活动认知轨迹 all/RCSuse.csv") # 查看数据 view(df) # 创建 datadist 对象并设定 dd <- datadist(df) options(datadist = "dd") # 把 group223 转换为 factor,并设定 reference level 为 2 df$group223 <- relevel(factor(df$group223), ref = "2") # Restricted cubic spline 模型 model_rcs <- multinom(group223 ~ rcs(leisurescore, 3) + age + ADL + rural + gender + education + living + BMI + smoking + drinking + income + cardio + marital + visual, data = df) # Gradual decline (类别 3) pred_gradual <- ggpredict(model_rcs, terms = "leisurescore [all]", outcome = 3, type = "fixed") # Steep decline (类别 1) pred_steep <- ggpredict(model_rcs, terms = "leisurescore [all]", outcome = 1, type = "fixed") library(ggplot2) library(dplyr) # 添加分组标签 pred_gradual$group <- "Gradual Decline" pred_steep$group <- "Steep Decline" # 合并 pred_all <- bind_rows(pred_gradual, pred_steep) ggplot(pred_all, aes(x = x, y = predicted, color = group)) + geom_smooth(se = FALSE, method = "loess", span = 0.5) + # 平滑拟合 labs(x = "Leisure Activity Score", y = "Predicted Probability", title = "Smoothed Probability of Cognitive Decline Trajectories") + theme_minimal() + theme(text = element_text(size = 14)) “哪里有问题?
最新发布
03-25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值