如何从多变量glmnet(coxnet)模型创建二元预测器?

时间:2017-03-14 14:32:38

标签: r survival-analysis glmnet cox-regression

让我们使用以下示例:

生成生存数据(1000个样本,包含30个变量)

library(glmnet)
library(survival)
set.seed(10101)
N=1000;p=30
nzc=p/3
x=matrix(rnorm(N*p),N,p)
beta=rnorm(nzc)
fx=x[,seq(nzc)]%*%beta/3
hx=exp(fx)
ty=rexp(N,hx)
tcens=rbinom(n=N,prob=.3,size=1) 
y=cbind(time=ty,status=1-tcens)  

使用glmnet识别与生存相关的变量

fit=glmnet(x,y,family="cox")
cvfit <- cv.glmnet(x, y, family="cox")
plot(cvfit)
coefficients <- coef(fit, s = cvfit$lambda.min)
active_coefficients <- coefficients[,1] != 0

子集矩阵,只保留那些被glmnet

识别为相关的参数(n = 17)
x_selected <- x[,active_coefficients]

生成具有相关参数的cox模型(n = 17)

summary(coxph(Surv(y[,1],y[,2])~x_selected))

现在给我的问题是&amp;如何从n = 17参数中包含信息以获得单个(理想二进制)预测变量来创建Kaplan-Meier图,该图说明了这个基于17参数的签名的预测性能。我可以使用PCA并对主要组件进行二值化(然后将其用于Kaplan-Meier图)但我确定必须有更优雅的方式,因为基本上我想要执行的相同分析最近已经完成其他人(参见http://ascopubs.org/doi/pdf/10.1200/JCO.2012.45.5626&amp; http://ascopubs.org/doi/suppl/10.1200/jco.2012.45.5626/suppl_file/DS2_JCO.2012.45.5626.pdf - &gt;作者使用glmnet并确定20个基因与预测生存相关(到目前为止,我的代码完全相同)。然而,他们也显示了Kaplan- Meier绘制了他们将这个“20基因签名”汇集到一个变量中的3个级别[“低”,“中”,“高”] - 看图1 C&amp; D.我不知道如何重现这是我的例子。任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

已经找到了解决方案 - 继续进行如下分析:

cox_model <- coxph(Surv(y)~x_selected)

#generate a linear predictor from my cox_model
linear_predictor <- predict(cox_model, type="lp")

#check the linear predictor
coxph(Surv(y) ~ linear_predictor)

#stone-beran estimate of survival curve
df <- cbind.data.frame(y,linear_predictor)
s <- prodlim(Surv(time,status) ~ linear_predictor, data=df)

#plot survival curve
xl <- c(0,60)
plot(s, xlab="Time (months)", ylab="Survival rate",
     col=c("green","blue","red"), automar=TRUE, axes=FALSE, atrisk=FALSE,
     confint=FALSE, legend=TRUE,
     legend.title="Coxnet signature", legend.legend=c("low levels", "medium
levels","high levels"), legend.x="bottomright", legend.cex=0.8, xlim=xl)
axis(side=1, at=seq(0,240,12))
axis(side=2, at=seq(0,1,.2))