CoxBoost

    单纯的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

图1

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

2.predict.CoxBoost

图3
图4

如果要求不高,CoxBoost和predict.CoxBoost(不知道为什么predict.Coxboost没有,而且example里边也是predict)就够了。


预测图

3.cv.CoxBoost

图5

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:逻辑值,指示是否应通过打印交叉验证次数和更新的协变量索引来指示估计进度。

图6

4.predict.iCoxBoost

图7
图8
预测出图

分析过程:

组合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))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351