Nhanes数据(复杂调查数据)绘制限制立方样条(rcs)函数svyggrcs1.8尝鲜版发布

临床上,因变量和临床的结局有时候不是线性关系,而回归模型有一个重要的假设就是自变量和因变量呈线性关联,因此非线性关系模型用回归分析来拟合受到限制。因此,一个更好的解决方法是拟合自变量与因变量之间的非线性关系,限制性立方样条(Restricted cubic spline,RCS)就是分析非线性关系的最常见的方法之一。

在这里插入图片描述
既往再文章《R语言绘制复杂抽样设计logistic回归限制立方样条图(RCS)》我已经介绍了nhanes数据(复杂调查抽样数据)怎么手动绘制限制立方样条图,但是手动相对麻烦,而且要清除异常离群值,绘制不好的话没有rms包绘制得漂亮,对新手有点难度。参考了网络上一些其他大神得画法,经过我自己改良后,svyggrcs1.8给出了两种绘图得方法,一个是常规方法,一个是重抽样绘图,重抽样绘图能很好的印证你的结果,增强结论的可靠性。因为survey包还要对残差进行加权,计算可信区间,因此我觉得重抽样绘制的图形更加可靠。总而言之,svyggrcs1.8还是一个新的函数包,还有很多待升级的空间,有意见或建议都可以私信我。

先说个结论,rms包绘图和我既往文章的绘图结果是一样的,间接证明了我文章《R语言绘制复杂抽样设计logistic回归限制立方样条图(RCS)》方法没有问题。

在这里插入图片描述
在这里插入图片描述
下面我来演示一下怎么使用svyggrcs1.8函数绘制nhanes数据(复杂调查数据)的限制立方样条图绘制。支持线性回归、逻辑回归和cox回归。
先要安装常规一些辅助包,如果没有安装的话我们要提前安装好

install.packages(c("stringr","ggplot2","rms","cowplot","survey"))

导入我写的函数,把函数放在指定的位置(我这里在E:/r/test/),然后用下面代码导入

source("E:/r/test/svyggrcs1.8.R")

在这里插入图片描述
正常导入的话应该生成5个函数,
我们先来做个cox回归的
先导入R包和数据

noNA<-read.csv("E:/r/test/noNA.csv",sep=',',header=TRUE)

在这里插入图片描述
这是一个转移性胃癌患者(Power、Capanu、Kelsen 和 Shah 2011)的数据(公众号回复:胃癌数据,可以获得数据),数据很多我们选取一部分建模,age_dx:年龄,group:分组变量,分为存活率小于2年的和大于两年的,inv_weight:概率权重,ssize:每个分组患者的人数,survival生存时间,surv_cens生存结局

建立调查函数表

dstr2 <- svydesign(id = ~1, strata = ~group, prob = ~inv_weight, 
                   fpc = ~ssize, data = noNA)

假设我们研究的是年龄和生产率关系。生成cox回归方程,我们研究的目前是年龄age这里需要给它rcs(Age,4)

svy.cox.fit <- svycoxph(Surv(survival, surv_cens) ~ ECOG + liver_only + 
                          Alb + Hb + rcs(Age,4) + Differentiation + Gt_1_m1site + lymph_only, x = TRUE, 
                        design = dstr2)

生成限制立方样条图,非常简单,一句话代码

out<-svyggrcs(svy.cox.fit)

生成结果在out这里

在这里插入图片描述
我们打开看一下,生成3个内容,newdat是绘图数据,你可以通过它手动绘图,这样自由度大一点,boot.p是重抽样生成的图片,p2是rms包生成的图片

在这里插入图片描述
我们点开看一下,常规绘图

out[["p2"]]

在这里插入图片描述
再看下重抽样的

out[["boot.p"]]

在这里插入图片描述
我们可以修改X轴和Y轴标题,P值的位置也可以通过px和py参数修改

out<-svyggrcs(svy.cox.fit,xlab = "血糖",ylab="预测值",ggtitle="血糖与预测值关系")

在这里插入图片描述
再看看提取的数据

dat<-out[["newdat"]]

在这里插入图片描述
手动绘制灵活一点

ggplot(dat,aes(Age,yhat))+
  geom_ribbon(aes(ymin=lower,ymax=upper),fill="red",alpha=.2)+
  geom_line(linewidth=1,col="red",alpha=.2)+
  theme_bw()+
  theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank())

在这里插入图片描述
接下来演示一下逻辑回归,差不多,直接上代码了

#逻辑回归
library(survey)
bc<-read.csv("E:/r/test/subtext.csv",sep=',',header=TRUE)
bc <- na.omit(bc)
bc$DMDMARTL<-ifelse(bc$DMDMARTL==1,1,0)
bc$RIAGENDR<-as.factor(bc$RIAGENDR)
bc$RIDRETH1<-as.factor(bc$RIDRETH1)
bc$DMDMARTL<-as.factor(bc$DMDMARTL)
#bc$factor.FVC<-as.factor(bc$factor.FVC)
bcSvy1<- svydesign(ids = ~ SDMVPSU, strata = ~ SDMVSTRA, weights = ~ WTMEC2YR,
                   nest=TRUE,data = bc)
svy.glm<- svyglm(factor.FVC ~ RIAGENDR + RIDAGEYR+RIDRETH1+ DMDMARTL + rcs(LBXGH,4),
                design = bcSvy1)

也是一句话生成图,

out<-svyggrcs(svy.glm)
out[["p2"]]

在这里插入图片描述
最后展示线性回归,也是直接上代码

##线性回归
library(survey)
bc<-read.csv("E:/nhanes/nhanes.csv",sep=',',header=TRUE)
bc <- na.omit(bc)
bc$DMDMARTL<-ifelse(bc$DMDMARTL==1,1,0)
bc$RIAGENDR<-as.factor(bc$RIAGENDR)
bc$RIDRETH1<-as.factor(bc$RIDRETH1)
bc$DMDMARTL<-as.factor(bc$DMDMARTL)
bcSvy2<- svydesign(ids = ~ SDMVPSU, strata = ~ SDMVSTRA, weights = ~ WTMEC2YR,
                   nest=TRUE,data = bc)
svy.glm.fit <- svyglm(SPXNFVC ~ RIAGENDR + RIDAGEYR+RIDRETH1+ DMDMARTL + LBXGH,
                      design = bcSvy2)
svy.lm<- svyglm(SPXNFVC ~ RIAGENDR + RIDAGEYR+RIDRETH1+ DMDMARTL + rcs(LBXGH,4),
                design = bcSvy2)
out<-svyggrcs(svy.lm)
out[["p2"]]

在这里插入图片描述

如果你还不会,可以看下面视频

Nhanes数据(复杂调查数据)绘制限制立方样条图(rcs)

需要获得svyggrcs1.8函数尝鲜版,可以看下面这篇文章

Nhanes数据(复杂调查数据)绘制限制立方样条(rcs)函数svyggrcs1.8尝鲜版发布

### 如何在NHANES数据分析中确定RCS曲线的拐点 对于NHANES数据中的限制立方样条(Restricted Cubic Spline, RCS) 曲线拐点的研究,可以采用多种方式来实现。一种常用的方法是利用`rms`包下的`rcs()`函数,在R环境中构建回归模型并寻找潜在的非线性关系及其转折点。 #### 使用R进行RCS建模及拐点检测 ```r library(rms) # 假设df为已加载好的NHANES数据框,并且目标变量名为y,自变量为x fit <- lrm(y ~ rcs(x, 4), data=df) # 创建带有四个结点(knots)RCS模型 plot(Predict(fit)) # 绘制预测图查看拟合效果 anova(fit) # 查看ANOVA表评估各成分的重要性 ``` 上述代码片段展示了如何基于给定的数据集创建一个具有四个内部节点(即三次多项式的分段表示形式)RCS模型[^1]。通过调整参数`k=4`内的数值改变节点数量从而影响平滑程度;而`Predict()`函数则帮助可视化最终得到的结果以便直观理解趋势变化情况。 当涉及到具体定位到所谓的“拐点”,这通常指的是曲线上斜率发生显著转变的位置。可以通过计算一阶导数或二阶导数的变化来进行判断: - **一阶导数法**:求解使得$\frac{dy}{dx}=0$成立处对应的$x$值; - **二阶导数法**:找出满足$\frac{{d}^{2}y}{{dx}^{2}}=0$条件的地方作为候选位置再进一步验证其两侧是否存在正负号转换现象以确认真正的极值/拐点所在区间。 实际操作时建议先绘制出原始散点图连同拟合后的光滑曲线一起观察整体形态特征之后再决定采取哪种策略更为合适。 #### 关于Python的应用 虽然本案例主要围绕着R语言展开讨论,但在Python生态系统里同样存在强大的工具支持类似的分析工作流程。比如SciPy库提供了`splrep()`, ` splev()`等接口可用于生成B-spline基底进而模拟复杂的非线性模式;另外statsmodels模块也包含了专门针对广义加性模型(GAM)的支持,允许用户方便地引入各种类型的样条结构进入统计学习框架之中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值