单纯的COX模型可解释性很强,但是预测性能不能满足我的要求,所以采用花式优化COX模型。想了两种方法,一种是用Boosting,Bagging,方法二是提取主成分。然后今天搜了一下真的有现成的R包(没有我就准备罢工了……),还发现了一个python通过神经网络优化Cox,deepsurv包依赖python2,而且有点老,几个依赖的包已经更新名称了,deepsurv中还没更改,所以安装过程中一直报错。等有时间在搞这个吧~下边是对CoxBoos包功能和参数的解释,这个包集合了Boosting和k-fold功能,后边翻译的没意思了,就直接百度翻译粘贴了。有兴趣想钻研的小伙伴可以自己找原文看。
第一个coef.CoxBoost提示么有它,不造为啥~example中用到的是coef。
CoxBoost就是常规的用boosting做COX模型,
cv.CoxBoost:通过交叉验证得到最佳的boosting步数。
cvcb.control:允许设置要传递到iCoxBoost调用的交叉验证的控制参数,
estimPVal:对CoxBoost拟合中的可选协变量执行基于排列的p值估计。
iCoxBoost:使用公式描述进行交叉验证和模型拟合的接口
optimCoxBoostPenalty :此例程有助于找到一个惩罚值,该值由交叉验证确定,该值不会太小/在指定范围内,从而导致CoxBoost的“最佳”boosting step数。
optimStepSizeFactor :这一程序有助于找到一个最佳的步骤大小修改系数,即,结果在交叉验证的部分对数似然的最佳条件下。
plot.CoxBoost:绘制系数路径,即,根据由CoxBoost拟合的CoxBoost对象获得的boosting step绘制的参数估计值。
predict.CoxBoost:从一个由CoxBoost装配的CoxBoost对象获得指定boosting step的预测。
predict.iCoxBoost:从由iCoxBoost拟合的iCoxBoost对象获取指定boosting step的预测。
1.CoxBoost
CoxBoost:通过基于分量似然的boost方法,用CoxBoost拟合Cox比例风险模型。它特别适用于具有大量预测因子的模型,并允许具有未经初始化的参数估计的强制协变量。
CoxBoost(time,status,x,unpen.index=NULL,standardize=TRUE,subset=1:length(time), weights=NULL,stepno=100,penalty=9*sum(status[subset]==1), criterion = c("pscore", "score","hpscore","hscore"), stepsize.factor=1,sf.scheme=c("sigmoid","linear"),pendistmat=NULL, connected.index=NULL,x.is.01=FALSE,return.score=TRUE,trace=FALSE)
参数
第一个参数生存时间,第二个参数生存或死亡状态,第三个参数是引入的变量,
unpen.index=NULL(翻译是具有强制协变量指标的p.unpen长度向量,其中参数估计应不加密)个人认为是强制进入模型的变量,这一点不知道对不对。
standaedize:只是些变量是否应标准化以进行估计的逻辑值。这不适用于强制性协变量,即这些变量没有标准化
subset:指定在拟合过程中使用观测子集
weights:长度n的可选向量,用于指定单个观测值的权重
penalty:在每一个提升步骤中更新参数向量的单个元素的惩罚值(boosting迭代过程中的惩罚值)
criterion:指示在每个boosting步骤中用于选择的标准,pscore对应惩罚分数统计,score对应为出发分数统计。只有在未标准化的协变量两种才会看到不同结果(pscore将优先选择协方差较大的量),或者如果对不同的协变量使用不同的惩罚措施。hpscore和hscore对应pscore和score。然而如Binder等人所述,启发式方法仅用于平哥每个提升步骤中的协变量子集,这可以大大加快计算速度,但可能导致不同的结果。
stepsize.factor:确定步长修改因子,在选择了协变量后,应通过该因子更改提升步骤的自然步长。默认值为1即恒定惩罚,<1,协变量的惩罚在提升步骤中被选择后增加,>1,惩罚减少,如果给定pendistmat,则仅对至少有一个连接到另一个协变量的协变量执行惩罚更新。
sf.scheme:改变步长大小,线性对应Binder和Schumacher,sigmoid采用sigmoid型。
pendistmat:连接矩阵,条目范围在0和1之间,条目(i,j)表示协变量i和j之间连接的确定性。根据该信息,由于步长.因子<1传播,即,如果条目(i,j)为非零,则协变量j的惩罚在增加协变量j后减少i、 在提升步骤中被选中后。这个矩阵要么有维数(p-p.unpen)*(p-p.unpen),要么p.连接的协变量的指标必须在4个CoxBoost中给出已连接.index,在这种情况下,矩阵必须有维数p.connected*p.connected。通常情况下,可以使用包矩阵中的稀疏矩阵来节省内存。
connected.index:p.连通关联协变量的指数,其中pendistmat为分布惩罚变化提供了连接信息。无重叠未打开索引是允许的。如果为空,并且给定一个连接矩阵,则假定所有协变量都是连通的。
stepno:boosting步长
x.is.01:stepno表示x(的非强制部分)是否只包含值0和1的逻辑值,即二进制协变量。如果是这种情况,并由这个论点指出,计算量很大更快。加速台阶(m)。
return.score:逻辑值,指示是否应返回每个协变量的每个提升步骤中评估的分数统计值(或惩罚分数统计值,取决于标准)。当协变量和提升步数较多时,对应的元素记分表可能会变得非常大(并且需要大量内存)
trace:逻辑值,指示是否应通过打印更新的协变量的名称来指示估计进度。
details:与梯度升压(例如,在R包MBOST中的GLMBOST程序中,使用CoxPH损失函数实现)不同,CoxBoost不是基于损失函数的梯度,而是采用了Tutz和Binder(2007)的基于偏移量的增压方法来估计Cox比例风险模型。在每个提升步骤中,先前的提升步骤被合并为惩罚偏似然估计中的偏移量,用于获得每个提升步骤中单个参数(即一个协变量)的更新。这导致稀疏拟合类似于套索方法,许多估计系数为零。必须选择的主要模型复杂性参数(例如,通过交叉验证使用增压),是升压步数stepno。惩罚参数惩罚可以相当粗略地选择,可以手工或使用最佳选择与梯度提升法相比,基于偏移量的方法的优点是惩罚结构非常灵活。在目前的实施中,这是用来允许未经批准的强制性协变量,这些协变量在推进步骤过程中得到非常快的系数累积,而其他(可选)协变量则受到惩罚。例如,在微阵列设置中,(许多)微阵列特征将被视为可选的协变量,而(少数)潜在的临床协变量将被视为强制性的,通过将它们的指数包括在未打开索引. 如果一组相关的协变量对反应有影响,例如来自同一途径的基因,成分增强通常只会导致该组中只有一个成员的估计值为非零。为了避免这种情况,可以在pendistmat中提供关于协变量之间联系的信息。如果那么,另外,一个惩罚更新方案步长.因子如果选择了<1,则在将来的增压步骤中更可能选择连接的协变量,如果在之前的增压步骤中选择了直接连接的协变量(见Binder和Schumacher,2009b)。
2.predict.CoxBoost
如果要求不高,CoxBoost和predict.CoxBoost(不知道为什么predict.Coxboost没有,而且example里边也是predict)就够了。
3.cv.CoxBoost
cv.CoxBoost:通过K-fold交叉验证搜索最佳的boosting步数
参数
time:表示观测时间的长度n
status:截尾指示符,即长度为n的向量,截尾观测值为0,未截尾观测值为1。如果该向量包含不等于0或1的元素,则这些元素表示来自竞争风险的事件,并拟合出与事件1相关的子分布风险模型(参见Fine and Gray,1999)。
x:协变量的x矩阵
subset:子集指定拟用于拟合过程的观测子集的向量
maxstepno:要评估的最大升压步数,即返回的“最优”升压步数将在[0,maxstepno]范围内。
K:用于交叉验证的折叠数。如果K大于或等于处于状态的非零元素的数量,则执行leave one out交叉验证。
type:计算保留fold中观测值部分似然贡献的方法:“verweij”使用verweij和van Houwelingen(1996)中描述的更合适的方法,“naive”使用忽略不在保留褶皱中的观测值的方法(通常在其他R包中找到)
parallel:逻辑值,该值指示交叉验证折叠中的计算是否应使用包snownflow在计算集群上并行执行。并行化是通过包snownflow执行的,在调用之前应该调用这个包的初始化函数sfInit.
multicore:指示是否应使用package parallel并行执行交叉验证折叠中的计算。如果为TRUE,则使用默认核心数采用package parallel。取大于1的值作为应采用的芯数。
upload.x:指示是否应该/必须将x上载到计算群集以进行并行计算的逻辑值。只上载一次(使用sfExport(x)from library snownflow)可以为大型数据集节省大量时间。
folds:如果不为空,则必须是长度K的列表,每个元素都是fold元素索引的向量。用于重复运行时使用相同的折叠。
trace:逻辑值,指示是否应通过打印交叉验证次数和更新的协变量索引来指示估计进度。
4.predict.iCoxBoost
分析过程:
组合1
#造数据~
n <- 200; p <- 100
beta <- c(rep(1,10),rep(0,p-10))
x <- matrix(rnorm(n*p),n,p)
real.time <- -(log(runif(n)))/(10*exp(drop(x %*% beta)))
cens.time <- rexp(n,rate=1/10)
status <- ifelse(real.time <= cens.time,1,0)
obs.time <- ifelse(real.time <= cens.time,real.time,cens.time)
#造训练集和测试集
train.index <- 1:100
test.index <- 101:200
cv.res <- cv.CoxBoost(time=obs.time,status=status,x=x,maxstepno=500,
K=10,type="verweij",penalty=100)#建立交叉验证
plot(cv.res$mean.logplik)#作图观察log-likelihood最大的情况
cbfit <- CoxBoost(time=obs.time[train.index],status=status[train.index],
x=x[train.index,],stepno=300,penalty=100)
#cbfit <- CoxBoost(time=obs.time,status=status,x=x,stepno=cv.res$optimal.step,
penalty=100)#交叉验证的方法最优boosting步数,即具有最小平均局部对数似然。
summary(cbfit)#不为0的参数
#预测部分
step.logplik <- predict(cbfit,newdata=x[test.index,],
newtime=obs.time[test.index],
newstatus=status[test.index],
at.step=0:300,type="logplik")
plot(step.logplik)
#打印非0的参数
print(cbfit$xnames[cbfit$coefficients[which.max(step.logplik),] != 0])
组合2
#造数据
n <- 200; p <- 100
beta <- c(rep(1,2),rep(0,p-2))
x <- matrix(rnorm(n*p),n,p)
actual.data <- as.data.frame(x)
real.time <- -(log(runif(n)))/(10*exp(drop(x %*% beta)))
cens.time <- rexp(n,rate=1/10)
actual.data$status <- ifelse(real.time <= cens.time,1,0)
actual.data$time <- ifelse(real.time <= cens.time,real.time,cens.time)
#训练集和测试集
train.index <- 1:100
test.index <- 101:200
#模型
cbfit <- iCoxBoost(Surv(time,status) ~ .,data=actual.data[train.index,],
stepno=300,cv=FALSE)
step.logplik <- predict(cbfit,newdata=actual.data[test.index,],
at.step=0:300,type="logplik")#type是“risk”,time=对应时间点,得到的应该是对应时间点的风险概率
plot(step.logplik)
#打印所有的系数
print(coef(cbfit,at.step=which.max(step.logplik)-1))