我想使用“ranger”R包来计算我的分析中的Brier分数和综合Brier分数。
作为示例,我使用“survival”包中的veteran数据如下
install.packages("ranger")library(ranger)install.packages("survival")library(survival)#加载veteran数据data(veteran)data <- veteran#训练和测试数据n <- nrow(data)testind <- sample(1:n,n*0.7)trainind <- (1:n)[-testind]#训练ranger模型rg <- ranger(Surv(time, status) ~ ., data = data[trainind,])#使用rg预测测试数据pred <- predict(rg,data=data[testind,],num.trees=rg$num.trees)#每个样本的累积风险函数pred$chf#每个样本的生存概率pred$survival
如何计算Brier分数和综合Brier分数?
回答:
综合Brier分数(IBS)可以使用pec
包的pec
函数来计算,但你需要定义一个predictSurvProb
命令来从ranger
建模方法中提取生存概率预测(有关可用模型的列表,请参阅?pec:::predictSurvProb
)。
一种可能的解决方案是:
predictSurvProb.ranger <- function (object, newdata, times, ...) { ptemp <- ranger:::predict.ranger(object, data = newdata, importance = "none")$survival pos <- prodlim::sindex(jump.times = object$unique.death.times, eval.times = times) p <- cbind(1, ptemp)[, pos + 1, drop = FALSE] if (NROW(p) != NROW(newdata) || NCOL(p) != length(times)) stop(paste("\nPrediction matrix has wrong dimensions:\nRequested newdata x times: ", NROW(newdata), " x ", length(times), "\nProvided prediction matrix: ", NROW(p), " x ", NCOL(p), "\n\n", sep = "")) p}
这个函数可以按如下方式使用:
library(ranger)library(survival)data(veteran)dts <- veterann <- nrow(dts)set.seed(1)testind <- sample(1:n,n*0.7)trainind <- (1:n)[-testind]rg <- ranger(Surv(time, status) ~ ., data = dts[trainind,])#输入到pec命令中的公式frm <- as.formula(paste("Surv(time, status)~", paste(rg$forest$independent.variable.names, collapse="+")))library(pec)#使用pec估计IBS值PredError <- pec(object=rg, formula = frm, cens.model="marginal", data=dts[testind,], verbose=F, maxtime=200)
可以使用print.pec
命令评估IBS,在times
中指示要显示IBS的时间点:
print(PredError, times=seq(10,200,50))# ...# 综合Brier分数 (crps):# # IBS[0;time=10) IBS[0;time=60) IBS[0;time=110) IBS[0;time=160)# Reference 0.043 0.183 0.212 0.209# ranger 0.041 0.144 0.166 0.176