前几天在PubMed检索了一下“Prediction Model”,然后就看到了预测模型在每年的发表情况,真的可以用指数增长来描述其爆发式增长了。 示例:SMART研究(Second Manifestations of ARTerial disease study)。该研究是一项由荷兰乌得勒支大学医学中心协调的正在进行的前瞻性队列研究。此次示例的数据纳入了1996年9月至2006年3月期间纳入研究的3873名患者,纳入的患者均有动脉粥样硬化的临床表现(短暂性脑缺血发作、缺血性卒中、外周动脉疾病、腹主动脉瘤或冠心病),知情同意后进入研究。研究终点事件是(急性)血管性死亡、(非)致死性缺血性卒中或(非)致死性心肌梗死,以及任何这些血管事件的复合终点。在心血管疾病领域的许多预测模型都是根据没有动脉粥样硬化临床表现的受试者数据开发的,本研究则是建立一个针对已存在心血管疾病(冠状动脉疾病、脑动脉疾病、外周动脉疾病和腹主动脉瘤)患者的预测模型,用于估计血管事件(中风、心肌梗死或心血管死亡)1年、3年和5年的发生风险。 library(haven) smartdata<-read_sav("D:/Temp/SMART.sav") smart<-smartdata[c("stdays","event","Sex","Age","BMI","Smoking","Alcohol","Diabetes","MAP","LDLC","HDLC","TG","Cerebral","Coronary","Peripheral","AAA","Hcy","Gln","CrCl","AU","IMT","CAStn")]##为什么选择要分析的变量重新建立一个数据库,而不是直接通过命令smart<-as.data.frame(as.matrix(smardatat))来实现达到目的?主要是考虑到有些没有被选择的变量可能存在缺失值,直接通过前面这个命令可能会损失更多的信息 smart<-as.data.frame(as.matrix(smart)) smart$Sex<-factor(smart$Sex,levels=c(1,2),labels=c("male","female")) smart$Smoking<-factor(smart$Smoking,levels=c(0,1,2),labels=c("Never","Former","Current")) smart$Alcohol<-factor(smart$Alcohol,levels=c(0,1,2),labels=c("Never","Former","Current")) smart$Diabetes<-factor(smart$Diabetes,levels=c(0,1),labels=c("No","Yes")) smart$Cerebral<-factor(smart$Cerebral,levels=c(0,1),labels=c("No","Yes")) smart$Coronary<-factor(smart$Coronary,levels=c(0,1),labels=c("No","Yes")) smart$Peripheral<-factor(smart$Peripheral,levels=c(0,1),labels=c("No","Yes")) smart$AAA<-factor(smart$AAA,levels=c(0,1),labels=c("No","Yes")) smart$AU<-factor(smart$AU,levels=c(0,1,2),labels=c("No","Micro","Macro")) smart$CAStn<-factor(smart$CAStn,levels=c(0,1),labels=c("No","Yes")) smart<-na.omit(smart) 示例共有病例3873例,其中460例发生失效事件,相对而言预测变量并不多,因此考虑不进行先单后多的初步筛选,而是想直接采用全子集回归,但是20个变量的全子集回归的计算量还是超出了我的预估:电脑跑了一晚上竟然没跑出来,最终采用了向后逐步回归,筛选标准为AIC。考虑到血压中SBP与DBP存在较强的相关性,可以只选取对心血管预测有更重要作用的SBP,或者是同时考虑了SBP和DBP的平均动脉压MAP(DBP+(SBP-DBP)/3)。另外,血脂水平中TC与LDLC等存在较强的相关性,目前专业上也普遍认为TC或LDLC是心脑血管疾病独立的危险因素,而HDLC则可能是保护因素,因此模型对血脂方面的预测因素考虑LDLC、HDLC和TG。 #逐步回归(向后法) library(StepReg) stepwiseCox(Surv(stdays,event==1)~Sex+Age+BMI+Smoking+Alcohol+Diabetes+MAP+LDLC+HDLC+TG+Cerebral+Coronary+Peripheral+AAA+Hcy+Gln+CrCl+AU+IMT+CAStn,data=smart, selection ="backward", select ="AIC",method=c("efron")) 如上图结果所示,以AIC为标准,向后逐步回归筛选到10个变量(如果P为标准筛选到的是9个变量)。 library(rms) library(Hmisc);library(lattice);library(survival);library(Formula);library(ggplot2);library(SparseM) options(datadist='CoxNM') surv1<-function(x)surv(365.25,lp=x) surv3<-function(x)surv(3*365.25,lp=x) surv5<-function(x)surv(5*365.25,lp=x) plot((NomCox)) library(survival) Coxfit<-coxph(Surv(stdays,event==1)~Age+Alcohol+Cerebral+Coronary+Peripheral+AAA+Hcy+Gln+CrCl+IMT,data=smart) regplot(Coxfit, plots=c("density","boxes"), observation=T, title="Survival Nomogram", failtime=c(365.25,1095.75,1826.25), prfail=F, clickable=TRUE, points=TRUE, dencol="green", boxcol="yellow", droplines=TRUE) 模型建立完毕,我们还需要对模型验证一下:结果显示C-index=0.708,表明模型区分度一般般;校准曲线与y=x的直线重合性很差,表明模型的校准度也不好,即结局的实际发生概率与模型的预测概率一致性并不好。 CI_Coxfit<-coxph(Surv(stdays,event==1)~Age+Alcohol+Cerebral+Coronary+Peripheral+AAA+Hcy+Gln+CrCl+IMT,x=T,y=T,data=smart) sum.cox<-summary(CI_Coxfit) CI<-sum.cox$concordance CI C se(C) 0.70843993 0.02530677 #校准曲线Calibration Curve CalCox<-calibrate(Coxfit,cmethod='KM',method='boot',u=5*365.25,m=300,B=200) plot(CalCox,xlim=c(0,1.0),ylim=c(0,1.0)) plot(CalCox,xlim=c(0.9,1.0),ylim=c(0.5,1.0)) — END — |
|
来自: Memo_Cleon > 《待分类》