r-如何创建循环(当级别与引用不重叠时)



我在R中写了一些代码。这段代码获取一些数据,并将其拆分为训练集和测试集。然后,我把一个";生存随机森林";训练集中的模型。之后,我使用该模型来预测测试集中的观测结果。

由于我正在处理的问题类型("生存分析"(;"唯一时间";(在文件"unique.death.time"中(。对于为每个唯一时间制作的每个混淆矩阵,我感兴趣的是对应的";灵敏度";值(例如sensitivity_1001、sensitivity_2005等(。我正在尝试获得所有这些灵敏度值:我想用它们绘制一个图(与唯一死亡时间(,并确定平均灵敏度值。

为了做到这一点,我需要重复计算"0"中每个时间点的灵敏度;独一无二。死亡。时代";。我试着手动做这件事,但花了很长时间。

有人能告诉我如何用";循环";?

我已经在下面发布了我的代码:

#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)

在这里,另一位用户(Justin Singh(在上一篇文章中(R:如何重复"循环"函数的结果?(建议如何创建循环:

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.

有人知道怎么解决这个问题吗?感谢

prediction和/或real中的某些值中只有一个唯一值。确保因素的级别相同。

sapply(names(ranger_preds), function(x) {
prediction <- factor(ranger_preds[[x]] > 0.5, levels = c(TRUE, FALSE)) 
real <- factor(cost_test$time >= as.numeric(x), levels = c(TRUE, FALSE))
confusion <- caret::confusionMatrix(prediction, real, positive = 'TRUE')
confusion$byClass[1]
}, USE.NAMES = FALSE) -> result
result

相关内容

  • 没有找到相关文章

最新更新