限制性立方样条函数(RCS)在比较非线性关系中很常用。既往我们已经讲过R语言制作限制性立方条图,但是讲得比较简单,中间有些环节没写出来,我也不是很满意,今天重新来说一下。主要是要用到rms包的rcs函数来绘制,继续用我们的乳腺癌数据来绘制,因为目前也没找到什么好的数据。
我们先导入包,导入数据
library(foreign)
library(rms)
bc <- read.spss("E:/r/test/Breast cancer survival agec.sav",
use.value.labels=F, to.data.frame=T)
bc <- na.omit(bc)
names(bc)
我们先来看看数据:
age表示年龄,pathsize表示病理肿瘤大小(厘米),lnpos表示腋窝淋巴结阳性,histgrad表示病理组织学等级,er表示雌激素受体状态,pr表示孕激素受体状态,status结局事件是否死亡,pathscat表示病理肿瘤大小类别(分组变量),ln_yesno表示是否有淋巴结肿大,time是生存时间,后面的agec是我们自己设定的,不用管它。
转换分类变量并且抽取一部分变量等下来拟合模型
attach(bc)
be<-data.frame(age,status,time,ln_yesno)
be$ln_yesno<-as.factor(be$ln_yesno)
对数据进行打包,整理
dd <- datadist(be) #为后续程序设定数据环境
options(datadist='dd') #为后续程序设定数据环境
拟合模型
fit<- cph(Surv(time,status) ~ rcs(age,4) + ln_yesno,data=be)
an<-anova(fit)
生成预测值并且做图,我们要注意一下,这里的exp等于把它返回了HR值
plot(Predict(fit, age,fun=exp), anova=an, pval=T)
Nonlinear值为0.33,提示不是非线性,
论文中我们常可以看见有一条等于1的对比线,如下图这样,说明线上的值大于1,线下面小于1。我们可以通过HR等于1的age对它进行设定。
我们进行查看预测表,HR等于1,age为50
dd$limits$age[2] <-50
fit1=update(fit)
最后画出图形
HR<-Predict(fit, age,fun=exp,ref.zero = TRUE)
ggplot(HR)
ggplot()+geom_line(data=HR, aes(age,yhat),linetype=1,size=1,alpha = 0.9,colour="red")+
geom_ribbon(data=HR, aes(age,ymin = lower, ymax = upper),alpha = 0.3,fill="red")+
geom_hline(yintercept=1, linetype=2,size=1)+theme_classic()+
labs(title = "RCS", x="age", y="HR (95%CI)")