R语言生存分析

自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享。部分参考薛毅的《统计建模与R软件》和《R语言实战》

生存分析是研究生存时间的分布规律,以及生存时间和相关因素之间关系的一种统计分析方法。生存分析在医学科学研究中具有广泛而重要的应用价值,它对人群寿命的研究,各种慢性疾病的现场追踪研究,临床疗效试验和动物试验等研究中随访资料的处理骑着举足轻重的作用。

I. 生存曲线

例. 某医生收集到35例白血病患者治疗后的生存时间t(月),仔细观察后发现这些病人中有一部分出现了白细胞(WBC)倍增的现象。现将他们按是否出现WBC倍增分成两组如下(注:负值代表删失数据),试用寿命表法分析患者有无WBC倍增,对其生存时间长短有无显著影响。

输入data,变为表格形式:

A=data.frame()
#输入变量
x=c(2, -2.5, 3.5, 4, 4, -5, 6, -6, 7, -7, 8, -9, 10.5, 12.5, 19, 2.5, 5, 7, -8.5, 9, -10, 11, -11, 12, 13, -14, 15, -16, 17, -18, 19, -20, 21, 24, 32)
#若survt小于0(代表数据删失),则变量censor赋值为1,否则,赋值为0
for (i in 1:length(x))
{
  A[i,1]=x[i]
  if(A[i,1]<0)
    A[i,2]=1
  else
    A[i,2]=0
}
#分为high-wbc和low-wbc两组
A[,3] <- c(rep("high",15),rep("low",20))
A[,1] <- abs(x)
#变量命名
names(A) <- c("survt","censor","wbc")

1. 估计生存函数,观察不同组间的区别

# 建立生存对象
library(survival)
Surv(A$survt,A$censor==1)

# 估计KM生存曲线(Kaplan–Meier estimator乘积极限法)
y <- Surv(A$survt,A$censor==1)
kmfit1 <- survfit(y~1)
summary(kmfit1)
plot(kmfit1)

# 根据wbc分组估计KM生存曲线
kmfit2 <- survfit(y~A$wbc)
plot(kmfit2, lty = c('solid', 'dashed'), col=c('black','blue'),
     xlab='survival time in days',ylab='survival probabilities')
legend('topright', c('wbc high','wbc low'), lty=c('solid','dashed'),
       col=c('black','blue'))
# 检验显著性,rho=0为log-rank法或Mantel Haenszel法,rho=1为Wilcoxon法
survdiff(Surv(survt,censor)~wbc, data=A,rho = 0)
survdiff(Surv(survt,censor)~wbc, data=A,rho = 1)

#设置不同函数的不同参数,选择不同的检验方法
survreg(Surv(survt,censor)~wbc, data=A,dist="weibull")
survreg(Surv(survt,censor)~wbc, data=A,dist="logistic")
survreg(Surv(survt,censor)~wbc, data=A,dist="lognormal")
#-logS(p)对生存时间t的散点图
kmfit3=kmfit2
kmfit3$surv=-log(kmfit3$surv)
b1=data.frame(kmfit3$time[1:12],kmfit3$surv[1:12])
b2=data.frame(kmfit3$time[13:31],kmfit3$surv[13:31])
plot(b1,type="b",col="black",main="估计生存函数的负数对数")
lines(b2,type="b",col="blue")
legend('bottomright', c('wbc high','wbc low'), lty=c('solid','dashed'),
       col=c('black','blue'))

此资料不服从指数分布,近似服从Weibull分布,故宜选用对数秩法或Wilcoxon法检验的结果,两条生存曲线分布有显著性差异(p<0.05)。结果显示:两条生存曲线Wilcoxon检验的结果为p=0.025<0.05,两条生存曲线分布有显著差异,无WBC倍增的白血病患者的生存时间显著长于有WBC倍增的白血病患者。

生存函数图,横轴为生存时间t(治疗后生存的月份),纵轴为生存概率。High-WBC(有WBC倍增)在第20个月终止,low-WBC(无WBC倍增)在第32个月终止。其第一组的生存率下降速度显著快于第二组,说明无WBC倍增的患者比有WBC倍增患者的生存时间长。

上述-logS(p)对生存时间t的散点图,呈非直线趋势,说明生存时间不呈指数分布。

#log(-logS(t))对log(t)的散点图
kmfit4=kmfit3
kmfit4$surv=log(kmfit4$surv)
C1=data.frame(kmfit4$time[1:12],kmfit4$surv[1:12])
C2=data.frame(kmfit4$time[13:31],kmfit4$surv[13:31])
plot(C1,type="b",col="black",main="估计生存函数的负数对数的对数")
lines(C2,type="b",col="blue")
legend('bottomright', c('wbc high','wbc low'), lty=c('solid','dashed'),
       col=c('black','blue'))

上述为log(-logS(t))对log(t)的散点图,两条线分别近似直线,说明生存时间近似呈Weibull分布。

# 由word文件里的公式--(n.risk差值)/(n.risk*time差值),画出wbc分别为high和low的死亡风险函数图
summary(kmfit2)
B =data.frame(kmfit2$time[1:12],kmfit2$n.risk[1:12])
B$rr= 0
for (i in 2:12)
{
  B[i,3]=(B[i-1,2]-B[i,2])/(B[i-1,2]*(B[i,1]-B[i-1,1]))
}

plot(B$rr~B$kmfit2.time.1.12.,xlab = "t",ylab = "死亡率",col="black",type="l",main="死亡风险函数")
legend('topright', c('wbc high','wbc low'), lty=c('solid','dashed'),
       col=c('black','blue'))

C =data.frame(kmfit2$time[13:31],kmfit2$n.risk[13:31])
C$rr= 0
for (i in 2:19)
{
  C[i,3]=(C[i-1,2]-C[i,2])/(C[i-1,2]*(C[i,1]-C[i-1,1]))
}

lines(C$rr~C$kmfit2.time.13.31.,col="blue",type="l")

给出生存时间T对应的死亡风险函数。黑色曲线表现的是high-WBC组对应的风险率,蓝色曲线表现的是low-WBC对应的风险率,从图中看出:体内WBC倍增的病人死亡的风险率更高。


2. 用图形方法检验PH假设 (与1.中对数图相似)

plot(kmfit2,fun='cloglog',xlab='time in days using logarithmic
     scale',ylab='log-log survival', main='log-log curves by wbc')

不平行,不符合PH假设


3. 构建COX PH回归模型

#cox模型
y <- Surv(A$survt,A$censor == 1)
coxmodel <- coxph(y~wbc,data=A)
summary(coxmodel)
# 此例中只有wbc一个变量,不涉及到两模型选择问题。假如有多个变量,可以选择y~x1+x2+x3,y~x1+x2+x3+x3*x2+x3*x1这两个模型
mod1 <- coxph(y ~ wbc,data=A)
#再用anova函数比较两个模型
#anova(mod1,mod2)
#step(mod2)
# 简洁模型更好
# 风险预测
predict(mod1,type='risk')
## 此例中只有wbc一个变量,不涉及到两模型选择问题。假如有多个变量,可以选择y~x1+x2+x3,y~x1+x2+x3+x3*x2+x3*x1这两个模型
#构建一个stratified Cox model.
# 当PH假设在clinic不成立,控制这个变量
#mod3 <- coxph(y ~ prison + dose + strata(clinic),data=addicts)
#summary(mod3)

对PH假设进行统计检验

mod1 <- coxph(y ~ wbc,data=A)
cox.zph(mod1,transform=rank)
# P值小显示PH假设不符合
# 显示系数变化图
plot(cox.zph(mod1,transform=rank),se=F)

得到COX调整后生存曲线

mod1 <- coxph(y ~ wbc,data=A)
pattern1 <- data.frame(wbc = 'low')
summary(survfit(mod1,newdata=pattern1))
plot(survfit(mod1,newdata=pattern1),conf.int=F)

mod2 <- coxph(y ~ strata(wbc),data=A)
pattern2 <- data.frame(wbc = 'high')

构建参数模型

modpar1 <- survreg(Surv(A$survt)~wbc,data=A,dist='exponential')
summary(modpar1)

猜你喜欢

转载自blog.csdn.net/Tiaaaaa/article/details/58144188