imd 统计教程 · RCS非线性建模
← 教程首页 返回本模块

限制性立方样条rcssci大更新,pptx无损,shiny美美免费用

聂志强实战医学统计2026-01-07 16:07:19广东


rcs限制性立方样条越来越成为顶刊神器,重要性不言而喻。

尤其是BMJ 预测模型也强烈推荐,连续变量进入预测模型需要rcs拟合,效果比单纯线性、gam都要强,见之前推文https://mp.weixin.qq.com/s/9RhVE0AYDtZk8Bsg8_8JGA, https://mp.weixin.qq.com/s/Rn4uOsJbOhzdzSmsRZm9Bg。

rcssci系列,陪伴了很多小伙伴的成长,从0.1.0到0.4.0,后来很长一段时间没有更新。期间有很多小伙伴总是私聊不知道一键输出PDF版怎么导出PPTX。还有一些图形错误的问题,我花了些时间修复并且分享出来。下面是一些rcs系列的总结。

一 rcssci推文

公众号总结了个帖子,https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzAxNTUzNDMyNQ==&action=getalbum&album_id=3015203637993930755#wechat_redirect 


二 rcssci高分论文

许多小伙伴不知道如何写论文,可以参考下面3篇文章成文,lancet的不错的。Rcssci包发表在medicine research上,也欢迎大家引用,https://doi.org/10.1002/mdr2.70015                                                                                                                                                                                                                                                                                                              


三 PDF另存为pptx

0.4.0以及之前版本可以一键导出PDF,不知道技巧的朋友可以学下。通过adobe acrobat 等PDF编辑器另存为PPTX,就可以编辑了。缺点是有时候,图片需要去母版视图里面找背景图再复制出来。


四  新版V0.5.0说明

不知不觉从2022年1月介绍rcs开始,已经过去了4个年头。真的一晃居然整整过去了4年!时光飞逝,我心已老。趁着记忆力还在,于是利用间隙学习空挡更新了rcssci V0.5.0,这次代码修复了很多内容,更严谨了。

4.1 新增2系列代码

2系列后缀包括一键输出rcssci_logistic2、rcssci_cox2、rcssci_linear2,以及相应的子函数,不喜欢一键4图的可以针对性的先运行.prob 再视非线性P和overall P来判定后续的图形是线性、L形、U 形、n形。Rcs曲线的切点cutoff内置 “segmented”包,并且进行bootstrap 95%CI估计。需要方法学的可以去看论文原文,模板见lancet那篇。

思维导图,设计见图。



4.2 演示案例

下面是预期的代码,更新2系列。



setwd("D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变")  

# 0) 安装/加载包
pacman::p_load("rcssci""dplyr""ggplot2""tidyr""rms""officer""rvg""mschart"
# 新增函数 rcs_logistic.prob2 
data(sbpdata, package = "rcssci")
library(rcssci)
data(sbpdata, package="rcssci")

#----旧版PDF 
library(rcssci)
data(sbpdata, package="rcssci")

#----测试logistic 系列----
rcs_logistic.prob2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "type3"      # type1/type2/type3/type4/all
)


rcs_logistic.prob2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "type1"      # type1/type2/type3/type4/all
)

rcs_logistic.prob2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
##pptx = TRUE,
#?? pptx = TRUE或者自定义名字,
  pptx = "./OR推荐款.pptx"
  plot_type = "type2"      # type1/type2/type3/type4/all
)

rcs_logistic.prob2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
##pptx = TRUE,
#?? pptx = TRUE或者自定义名字,
  pptx = T, 
  plot_type = "type3"      # type1/type2/type3/type4/all
)



rcs_logistic.prob2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "all"      # type1/type2/type3/type4/all
)


rcs_logistic.lshap2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "all"      # type1/type2/type3/type4/all
)



rcs_logistic.nshap2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "all"      # type1/type2/type3/type4/all
)

rcs_logistic.ushap2(
  data = sbpdata, y = "status", x = "sbp",
  covs = c("age","gender"),
  prob = 0.5,
  filepath = "D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
  pptx = TRUE,
#?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
  plot_type = "all"      # type1/type2/type3/type4/all
)


rcssci_logistic2(
  data      = sbpdata, 
  y         = "status"
  x         = "sbp",
  covs      = c("age""gender"),
  prob      = 0.5,
  filepath  = "./Logistic_Results",
  pptx      = TRUE,       # 自动导出4份PPT
  plot_type = "type2"     # 使用推荐的样式
)
#plot_type = "type1"  # 柱状分布 + 虚线CI(图例两条线)
#plot_type = "type2"  # 柱状分布 + ribbon CI(图例红线+浅红矩形)
#plot_type = "type3"  # 竖线ref + ribbon CI(图例红线+浅红矩形)
#plot_type = "type4"  # 密度曲线 + ribbon CI(图例红线+浅红矩形)
#plot_type = "all"    # 2×2 拼图(PDF固定导出这个)


# 定义输出路径 (例如输出到当前工作目录下的 Results 文件夹)
out_path <- "./Results_Cox_Demo"
# 运行总函数
rcssci_cox2(
  data      = sbpdata, 
  y         = "status",        # 结局变量 (事件状态)
  x         = "sbp",           # 主要暴露变量
  time      = "time",          # 生存时间变量
  covs      = c("age""gender"), # 需要调整的协变量
  prob      = 0.5,             # 参考值位置 (中位数)
  filepath  = out_path,        # 结果保存路径
  pptx      = TRUE,            # ? 开启 PPT 自动导出
  plot_type = "type1"          # ? 选用最美观的 Type 2 风格 (带色带)
)



#----测试cox 系列----
rcs_cox.prob2(data=sbpdata, y = "status",x = "sbp",time = "time",
              covs = c("age","gender"),
             prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
             pptx = TRUE,
             #?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
             plot_type = "all"      # type1/type2/type3/type4/all
)


rcs_cox.lshap2(data=sbpdata, y = "status",x = "sbp",time = "time",
              covs = c("age","gender"),
              prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
              pptx = TRUE,
              #?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
              plot_type = "all"      # type1/type2/type3/type4/all
)


rcs_cox.nshap2(data=sbpdata, y = "status",x = "sbp",time = "time",
               covs = c("age","gender"),
               prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
               pptx = TRUE,
               #?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
               plot_type = "all"      # type1/type2/type3/type4/all
)


rcs_cox.ushap2(data=sbpdata, y = "status",x = "sbp",time = "time",
               covs = c("age","gender"),
               prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
               pptx = TRUE,
               #?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
               plot_type = "all"      # type1/type2/type3/type4/all
)

#----测试linear 系列----
rcs_linear.prob2(data=sbpdata, y = "sbp",x = "age",
                prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
                pptx = TRUE,
                #?? pptx = TRUE或者自定义名字,pptx = "./my_rcs_plot.pptx", 
                plot_type = "all"      # type1/type2/type3/type4/all
)

rcs_linear.prob2(data=sbpdata, y = "sbp",x = "age",
                 prob=0.1,filepath="D:/聂个人文件/我的公众号/中英文字体混排/ppt字体不变",
                pptx = "./linear自定义.pptx"
                 plot_type = "all"      # type1/type2/type3/type4/all
)

4.3 V0.5.0版

V0.5.0 版目前还不完善,有空再上传cran上。目前制作了logistic、cox系列的糖果色智荟shiny版本,直接使用获取pptx足够常规分析。可是花费了我不少精力啊,希望大家喜欢这个配色和风格。


注意:

1、ref prob可以自由调节,推荐0.1或0.5,原则看历史推文合集。

2、Knot默认是AIC最小原则自动判定,当然图片多可以统一选择knot=4,如果样本量太小推荐选knot=3,3~4最常见。

3、rcs图片可点放大按钮。

4、下载报告,包括pptx、pdf、png,其中pptx是用rvg重写的字体保持了times 格式,且pptx的备注信息有AIC和方程说明。

5、无损矢量图pptx可编辑,请自由发挥你的配色想象力。

4.4 网页版

扫下面二维码,https://niezhiqiang.shinyapps.io/rcssci050/,都可以用。网页版细节很多,bug也多修改都零零散散的耗费了几天,成品还是挺满意的。

风格蓝紫色渐进内涵又热情,按钮都是冰激凌味,心情不好的时候来看看吧。



小结

    1 rcssci一键保存pptx绘图版。shiny网页,请保存,用起来!          

    2 优先prob图,再看趋势选择非线性,思维导图有P值细节说明

    niezhiqiang.shinyapps.io/rcssci050


    喜欢就多多分享,多多点??和??哦。