[英]R: how to repeatedly "loop" the results from a function?
我在 R 中写了一些代码。这段代码获取一些数据并将其拆分为训练集和测试集。 然后,我在训练集上拟合了一个“生存随机森林”model。 之后,我使用 model 来预测测试集中的观察结果。
由于我正在处理的问题类型(“生存分析”),必须为每个“唯一时间”(在文件“unique.death.time”内)制作一个混淆矩阵。 对于为每个唯一时间制作的每个混淆矩阵,我感兴趣的是相应的“灵敏度”值(例如 sensitivity_1001、sensitivity_2005 等)。 我正在尝试获取所有这些灵敏度值:我想用它们制作一个 plot(相对于唯一的死亡时间)并确定平均灵敏度值。
为此,我需要重复计算“unique.death.times”中每个时间点的灵敏度。 我尝试手动执行此操作,但需要很长时间。
有人可以告诉我如何用“循环”来做到这一点吗?
我在下面发布了我的代码:
#load libraries
library(survival)
library(data.table)
library(pec)
library(ranger)
library(caret)
#load data
data(cost)
#split data into train and test
ind <- sample(1:nrow(cost),round(nrow(cost) * 0.7,0))
cost_train <- cost[ind,]
cost_test <- cost[-ind,]
#fit survival random forest model
ranger_fit <- ranger(Surv(time, status) ~ .,
data = cost_train,
mtry = 3,
verbose = TRUE,
write.forest=TRUE,
num.trees= 1000,
importance = 'permutation')
#optional: plot training results
plot(ranger_fit$unique.death.times, ranger_fit$survival[1,], type = 'l', col = 'red') # for first observation
lines(ranger_fit$unique.death.times, ranger_fit$survival[21,], type = 'l', col = 'blue') # for twenty first observation
#predict observations test set using the survival random forest model
ranger_preds <- predict(ranger_fit, cost_test, type = 'response')$survival
ranger_preds <- data.table(ranger_preds)
colnames(ranger_preds) <- as.character(ranger_fit$unique.death.times)
#here is my question:
#get results for some time (time >1001)
prediction <- ranger_preds$'1001' > 0.5 # time has to be in "unique.death.times."
real <- cost_test$time >= 1001
#get confusion matrix and sensitivity for this same time
confusion = confusionMatrix(as.factor(prediction), as.factor(real), positive = 'TRUE')
sensitivity_1001 = confusion$byclass[1]
#now, get the results for a second time
prediction <- ranger_preds$'2005' > 0.5 # for any time in unique.death.times. "2005"
real <- cost_test$time >= 2005
#get confusion matirx and sensitivity for the second time
confusion = confusionMatrix(as.factor(prediction), as.factor(real), positive = 'TRUE')
sensitivity_2005 = confusion$byclass[1]
#question: how do I get the "sensitivity" for all the times in "unique.death.times", the average sensitivity and "plot sensitivity vs unique death times"?
有人可以帮帮我吗?
谢谢
编辑:用户“Justin Singh”提供的答案。 貌似思路是对的,但是产生如下错误:
sensitivity <- list()
for (time in names(ranger_preds)) {
prediction <- ranger_preds[which(names(ranger_preds) == time)] > 0.5
real <- cost_test$time >= as.numeric(time)
confusion <- confusionMatrix(as.factor(prediction), as.factor(real), positive = 'TRUE')
sensitivity[as.character(i)] <- confusion$byclass[1]
}
Error in confusionMatrix.default(as.factor(prediction), as.factor(real), :
The data must contain some levels that overlap the reference.
假设ranger_preds
的每个列名都采用数字形式,您可能会得到类似于以下内容的内容:
sensitivity <- list()
for (time in names(ranger_preds)) {
prediction <- ranger_preds[which(names(ranger_preds) == time)] > 0.5
real <- cost_test$time >= as.numeric(time)
confusion <- confusionMatrix(as.factor(prediction), as.factor(real), positive = 'TRUE')
sensitivity[as.character(i)] <- confusion$byclass[1]
}
这个想法是我们创建一个sensitivity
列表而不是创建多个变量,并将一个属性设置为names(range_preds)
中的相应time
,即对于 2005 年,我们将通过调用sensitivity$2005
获得敏感度。
我还没有对此进行测试,因此可能存在错误并且它可能不是最有效的 - 但是,希望它会引导您朝着正确的方向前进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.