基于原发性胆汁性肝硬化数据生存分析.docx

上传人:b****7 文档编号:25288687 上传时间:2023-06-07 格式:DOCX 页数:23 大小:394.89KB
下载 相关 举报
基于原发性胆汁性肝硬化数据生存分析.docx_第1页
第1页 / 共23页
基于原发性胆汁性肝硬化数据生存分析.docx_第2页
第2页 / 共23页
基于原发性胆汁性肝硬化数据生存分析.docx_第3页
第3页 / 共23页
基于原发性胆汁性肝硬化数据生存分析.docx_第4页
第4页 / 共23页
基于原发性胆汁性肝硬化数据生存分析.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

基于原发性胆汁性肝硬化数据生存分析.docx

《基于原发性胆汁性肝硬化数据生存分析.docx》由会员分享,可在线阅读,更多相关《基于原发性胆汁性肝硬化数据生存分析.docx(23页珍藏版)》请在冰豆网上搜索。

基于原发性胆汁性肝硬化数据生存分析.docx

基于原发性胆汁性肝硬化数据生存分析

一、数据背景

1、数据名称:

原发性胆汁性肝硬化的数据

2、数据来源:

3、数据简介:

该数据以pbc的名字包含在程序包survival中,数据集有20个变量,共有418个患者的观测,每个患者只有一次观测。

其数据是来自于梅奥诊所所审理的从1974年到1984年这十年间的原发性胆汁性肝硬化的病例。

总共有424个PBC患者,按照资格标准随机采用安慰剂对照药物D-青霉胺进行。

312个个案在数据集中参加随机试验,而附加的112个个案没有参加临床试验,但有基本的测量记录。

6个个案失去了确诊后没有跟进,所以数据上附加的是106个个案以及312个随机参与者,共418组观测值。

4、变量介绍:

变量名

描述

性质

id

个人代码

分类

time

登记到换肝或死亡天数

数量

status

状态(活着,肝移植,死亡)

分类

trt

用药(D-青霉胺,安慰剂)

分类

age

年龄

数量

sex

性别

分类

ascites

腹水(No,Yes)

分类

hepatomegaly

肝肿大(No,Yes)

分类

spiders

蜘蛛纹(No,Yes)

分类

edema

水肿(无水肿,未用利尿剂水肿,用利尿剂仍水肿)

分类

bili

血清胆红素(mg/dl)

数量

chol

血清胆固醇(mg/dl)

数量

albumin

白蛋白(mg/dl)

数量

copper

尿铜(ug/day)

数量

alk.phos

碱性磷酸酶(U/liter)

数量

ast

血清谷氨酸谷草转氨酶(U/liter)

数量

trig

甘油三酯(mg/dl)

数量

platelet

血小板(每升千个)

数量

protime

凝血酶原(秒)

数量

stage

疾病组织学分期(1,2,3,4期)

分类

5、分析思路:

如果对后面106个观测值的缺失值整列进行弥补然后对418个观测值进行分析意义不大,因此只将前312个观测值单独提取出来进行非参数、参数、Cox比例风险模型的建立。

本文的分析包括:

选择对生存函数有显著性影响的因子进行建模;通过图形、统计检验的方法比较各个因子变量的不同取值下的生存曲线是否存在差异,差异是否显著;建立的模型是否满足前提假定等。

6、数据预处理:

由于前312个观测值存在缺失的情况,因此首先进行弥补。

之后由于原始数据中status变量分为活着,肝移植和死亡三个结果,而生存分析要求结果为两分类互斥事件,因此将肝移植和死亡的变量值合并。

最终status变量的取值为0=活着,1=换肝或死亡,并在312个观测值中将分类变量status、trt、ascites、hepato、spiders、edema、stage转换为因子。

经过处理后的数据概况如下:

数据集一共包括19个变量,其中11个数值型变量:

time、age、bili、chol、albumin、copper、alk.phos、ast、trig、platelet、protime;8个分类变量:

status、trt、sex、ascites、hepato、spiders、edema、stage;无缺失值。

2、非参数模型

1、不含变量的Kaplan-Meier估计

得到的95%的置信区间的拟合图如下所示:

2、检验D-青霉胺和安慰剂组生存函数的差异

(1)图形检验

上图为用Kaplan-Meier比较D-青霉胺和安慰剂两种不同的药对生存时间的差异,红色的曲线代表安慰剂组,黑色的曲线代表D-青霉胺组,两种不同水平下的曲线大致是重合的,只有小部分存在分歧。

因此可以初步判断两组不同的用药对生存函数没有影响。

(2)log-ranktest

(3)Tarone-Waretest

(4)Wilcoxontest

三种检验方法的原假设均为

,而得到的p值均远远大于0.05,因此可以认为两种不用的用药对生存函数是没有显著性影响的。

3、检验不同性别的生存函数的差异

(1)图形检验

(2)log-ranktest

(3)Tarone-Waretest

(4)Wilcoxontest

分析:

从生存曲线可以看出,在起初的一小段时间里男性和女性的生存曲线重合,没有太大的差异,但随着时间的推移,不同的性别的生存曲线逐渐显示出了较大的差异,从而说明了性别对于生存函数是有影响的,从上面的三种检验得到的p值均为0.02左右也可以得到相应的结论。

而且男性患病的风险比女性更高。

3、Cox比例风险模型

1、基于不同用药组(trt)建立Cox比例风险模型

从回归系数以及三种检验得到的p值可以看出,不同用药组对于生存函数的影响不显著。

2、基于不同性别(sex)建立Cox比例风险模型

从图和分析结果均可以看出,不同性别的生存曲线有显著性的差异,女性的风险是男性的0.617倍,男性患pbc疾病的风险更大。

之后对sex做PHA的检验,得到的p值是大于0.05的,因此满足风险成比例的假定。

对于不同性别组,将建立的KM曲线和Cox比例风险模型的曲线进行比较:

(说明:

下图中的红色和绿色曲线分别代表的是用Cox比例风险模型对男性和女性的生存状况的拟合,黑色和蓝色分别代表的是用Kaplan—Meier估计的男性和女性的生存状况)

从曲线中可以看出用Cox比例风险模型拟合的女性生存曲线与KM曲线基本重合,男性生存曲线大部分是重合的,小部分存在差异。

但从整体来看用Cox比例风险模型拟合的曲线基本与KM曲线重合,因此说明Cox比例风险模型拟合效果较好,也说明了sex变量是满足风险成比例的假定的。

3、基于水肿程度(edema:

无水肿,未用利尿剂水肿,用利尿剂仍水肿)建立Cox比例风险模型

(1)直接建立Cox比例风险模型

从上面的分析结果可以看出,不同水肿程度对生存函数有显著性的影响,其中edema1(用利尿剂仍水肿)的风险是最高的。

从医学的角度来看,用利尿剂仍水肿的个体在一定程度上就反映了该个体的生存状况最差,因此其风险理应最高。

下图是不同水肿程度拟合的Cox比例风险曲线:

检验edema变量是否满足风险比例假定:

检验得到的p值均小于0.05,因此认为edema变量是不满足风险比例假定的。

(2)建立edema与时间的交互项模型

将heavisidefunction设置为

,建立edema变量与gt的交互项,得到的模型为:

得到的交互项的p值为0.00978,小于0.05,因此认为该项是显著的。

同时也说明了将heavisidefunction设置为

较为合理。

4、基于不同疾病组织学分期(stage)建立Cox比例风险模型

从上面的分析结果以及下面的图可以看出,不同疾病组织学分期对生存函数有显著性的影响,相对于其他三个stage=4的风险是最高的。

但是从医学的角度来看,疾病组织学分期本身就是根据病情的严重程度来划分的,因此属于stage=4的个体本身已经处于最差的情况当然其风险越高。

从另外一个角度来看,由于有些指标本身就可以反映个体的生存状况,因此指标本身代表的值就可以反映其风险高低程度。

而且在观测个体患病时记录的很多变量其实本身就存在高度的相关性。

检验stage变量是否满足风险比例假定:

检验结果得到的p值都是大于0.05的,因此stage变量是满足风险成比例的。

5、利用AIC逐步选择变量:

(1)通过10次得到最终的模型,逐步选择的结果如下:

逐步选择次数

变量

AIC

1

1477.7

2

bili

1394.13

3

bili、stage

1353.82

4

bili、stage、copper

1332.9

5

bili、stage、copper、albumin

1318.62

6

bili、stage、copper、albumin、protime

1312.97

7

bili、stage、copper、albumin、protime、edema

1310.75

8

bili、stage、copper、albumin、protime、edema、alk.phos

1309.39

9

bili、stage、copper、albumin、protime、edema、alk.phos、ast

1308.2

10

bili、stage、copper、albumin、protime、edema、alk.phos、ast、sex

1307.67

最终得到的模型为:

从回归结果的p值可以看出,并不是所有的变量都是显著的,比较显著的有bili、copper、albumin,其余的都不太显著。

PHA检验结果:

结果显示并不是所有的变量都满足风险成比例的假设,其中bili、protime、edema0.5均不满足。

(2)模型改进

由于edema0.5既不满足风险成比例,在回归中的系数也不是特别显著,因此直接去掉这个变量,对于bili变量,可以将该变量分段,之后分层建立Cox比例风险模型。

分段是按照个变量的均值进行分段,bili的均值为3.256,因此若

,则

,若

得到的模型为:

PHA检验结果为:

结果显示protime变量仍不满足风险成比例的假定,去除该变量的拟合结果如下:

PHA检验结果如下:

所有变量均满足风险成比例的假定。

四、参数模型

1、没有任何变量的Weibull参数模型:

得到的生存函数和风险函数的图如下所示(已将时间转化为年):

2、将拟合的Weibull参数曲线和K-M曲线进行对比发现在开始阶段Weilbull曲线更低,之后的时间里两条曲线基本重合。

3、引入sex变量的Weibull参数曲线:

得到的sex1的系数为0.4353829,其对应的p值为0.03,视为显著。

得到的kappa值为0.8602776。

因此对于女性,其参数模型为:

对于男性,其参数模型为:

下图为拟合的Weibull参数曲线

4、参数模型的选择

选入的变量有stage、copper、albumin、sex,这些变量是在Cox比例风险模型中极为显著的,参数模型的形式选择了4种,最终得到每种模型的AIC值如下:

其中最小的是log-logistic模型,输出的模型如下所示:

五、代码

library(survival)

data=pbc

w=data[1:

312,2:

20]

w$status[w$status!

=0]=1

sum(complete.cases(w))

library(missForest)

w=missForest(w)$ximp

write.table(w,"c:

\\users\\think\\Desktop\\w.txt")

w=read.table("c:

\\users\\think\\Desktop\\w.txt",header=T)

w$sex=factor(w$sex);w$trt=factor(w$trt);w$ascites=factor(w$ascites);w$hepato=factor(w$hepato);w$spiders=factor(w$spiders);w$edema=factor(w$edema);w$stage=factor(w$stage)

summary(w)

fit1=survfit(Surv(time,status)~1,data=w)

summary(fit1)

plot(fit1,main="Kaplan-Meierestimatewith95%confidencebounds",xlab="t",ylab=expression(hat(S)(t)))

fit2=survfit(Surv(time,status)~trt,data=w)

plot(fit2,conf.int=FALSE,mark.time=TRUE,col=c("black","red"),lty=1:

2,ylab=expression(hat(S)(t)),xlab="time",main="SurvivalFunctions")

legend("topright",box.lwd=1,cex=0.6,c("D-penicillamine","placebo"),lty=1:

2,col=c("black","red"))

survdiff(Surv(time,status)~trt,data=w,rho=0)

survdiff(Surv(time,status)~trt,data=w,rho=0.5)

survdiff(Surv(time,status)~trt,data=w,rho=1)

fit3=survfit(Surv(time,status)~sex,data=w)

plot(fit,conf.int=FALSE,mark.time=TRUE,col=c("blue","red"),lty=1:

2,ylab=expression(hat(S)(t)),xlab="time",main="SurvivalFunctions")

legend("topright",box.lwd=1,cex=0.6,c("men","female"),lty=1:

2,col=c("blue","red"))

survdiff(Surv(time,status)~sex,data=w,rho=0)

survdiff(Surv(time,status)~sex,data=w,rho=0.5)

survdiff(Surv(time,status)~sex,data=w,rho=1)

fit4=coxph(Surv(time,status)~trt,data=w)

summary(fit4)

fit5=coxph(Surv(time,status)~sex,data=w)

summary(fit5)

d.fit5=coxph.detail(fit5)

times=c(0,d.fit5$time)

h0=c(0,d.fit5$hazard)

s0=exp(-cumsum(h0))

beta=c(fit5$coef)

xf=c

(1)-mean(as.numeric(w$sex))

sf=s0^exp(t(beta)%*%xf)

xm=c(0)-mean(as.numeric(w$sex))

sm=s0^exp(t(beta)%*%xm)

plot(times,sf,type='s',xlab="t",ylab=expression(hat(S)(t)),ylim=0:

1)

lines(times,sm,col=2,type='s')

legend("topright",box.lwd=1,cex=0.6,c("female","man"),lty=1,col=c("black","red"))

cox.zph(fit5,transform="rank",global=F)

fit6=coxph(Surv(time/365.25,status)~sex,data=w)

g<-levels(w$sex)

plot(survfit(fit6,newdata=data.frame(sex=g[1])),conf.int=F,col=2,xlab="t",ylab=expression(hat(S)(t)))

lines(survfit(fit6,newdata=data.frame(sex=g[2])),conf.int=F,col=3)

km=survfit(Surv(w$time/365.25,w$status)~w$sex)

lines(km,col=c("black","blue"),lty=1)

legend("topright",box.lwd=1,cex=0.55,c("Cox-man","Cox-female","KM-man","KM-female"),lty=1,col=c("red","green","black","blue"))

fit7=coxph(Surv(time,status)~edema,data=w)

summary(fit7)

g<-levels(w$edema)

plot(survfit(fit7,newdata=data.frame(edema=g[1])),conf.int=F,col=2,xlab="t",ylab=expression(hat(S)(t)))

lines(survfit(fit7,newdata=data.frame(edema=g[2])),conf.int=F,col=3)

lines(survfit(fit7,newdata=data.frame(edema=g[3])),conf.int=F,col=4)

legend("topright",c("edema0","edema0.5","edema1"),col=c(2:

4),lty=1,cex=0.6)

cox.zph(fit7,transform="rank",global=F)

w2=survSplit(w,cut=c(2000),end="time",event="status",start="start")

w2$gt=(w2$start==2000)+0

fit8<-coxph(Surv(start,time,status)~as.numeric(edema)+gt:

as.numeric(edema),data=w2)

summary(fit8)

fit9=coxph(Surv(time,status)~stage,data=w)

summary(fit9)

g<-levels(w$stage)

plot(survfit(fit9,newdata=data.frame(stage=g[1])),conf.int=F,col=2,xlab="t",ylab=expression(hat(S)(t)))

lines(survfit(fit9,newdata=data.frame(stage=g[2])),conf.int=F,col=3)

lines(survfit(fit9,newdata=data.frame(stage=g[3])),conf.int=F,col=4)

lines(survfit(fit9,newdata=data.frame(stage=g[4])),conf.int=F,col=5)

legend("bottomleft",c("stage1","stage2","stage3","stage4"),col=c(2:

5),lty=1,cex=0.6)

cox.zph(fit9,transform="rank",global=F)

library(MASS)

Scope=list(upper=~(trt+age+sex+ascites+hepato+spiders+edema+bili+chol+albumin+copper+alk.phos+ast+trig+platelet+protime+stage),lower=~1)

fit10=coxph(Surv(time,status)~1,data=w)

fit11=stepAIC(fit6,Scope,direction="both")

fit12=coxph(Surv(time,status)~bili+stage+copper+albumin+protime+edema+alk.phos+ast+sex,data=w)

cox.zph(fit12,transform="rank",global=F)

c.bili=w$bili<3.256

c.bili=c.bili+0

summary(w)

fit9=coxph(Surv(time,status)~strata(c.bili)+stage+copper+albumin+alk.phos+ast+sex+protime,data=w)

cox.zph(fit9,transform="rank",global=F)

fit10=coxph(Surv(time,status)~strata(c.bili)+stage+copper+albumin+alk.phos+ast+sex,data=w)

cox.zph(fit10,transform="rank",global=F)

wei=survreg(Surv(w$time/365.25,w$status)~1,dist="w")

kappa=wei$scale

lambda=exp(-wei$coef[1])^kappa

zeit=seq(from=0,to=13,length.out=1000)

s=exp(-lambda*zeit^kappa)

h=lambda*kappa*zeit^(kappa-1)

par(mfrow=c(1,2))

plot(zeit,s,type="l",xlab='t',ylab=expression(hat(s)(t)))

plot(zeit,h,type="l",xlab='t',ylab=expression(hat(h)(t)))

plot(survfit(Surv(w$time/365.25,w$status)~1),xlab='t',ylab=expression(hat(s)(t)),lty=2,conf.int=F,col=3)

lines(zeit,s,col=2)

legend("topright",c("K-M","Weibull"),lty=c(2,1),col=c(3:

2),cex=0.6)

wei=survreg(Surv(w$time/365.25,w$status)~w$sex,dist="w")

kappa=wei$scale

lambda1=exp(-wei$coeff[1])^kappa

lambda2=exp(-wei$coeff[1]-wei$coeff[2])^kappa

zeit=seq(from=0,to=13,length.out=1000)

s1=exp(-lambda1*zeit^kappa)

s2=exp(-lambda2*zeit^kappa)

plot(zeit,s1,conf.int=F,col=1,type="l")

lines(zeit,s2,col=2,lwd=2)

legend("topright",box.lwd=1,cex=0.6,c("female","man"),lty=1,col=c("black","red"))

wei=survreg(Surv(time,status)~stage+copper+albumin+sex,data=w,dist="w")

exp=survreg(Surv(time,status)~stage+copper+albumin+sex,data=w,dist="w",scale=1)

lgl=survreg(Surv(time,status)~stage+copper+albumin+sex,data=w,dist="logl")

lgn=su

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1