Dplyr-变异下标超出范围
我试图从两个插入符号模型输出创建一个灵敏度和特异性汇总表,在我的for循环中,它在从名为“包含值的模型”的列表中查找值时抛出下标越界错误?这是一个完全可复制的示例。Dplyr是版本0.7.0。谢谢Dplyr-变异下标超出范围,r,dplyr,r-caret,R,Dplyr,R Caret,我试图从两个插入符号模型输出创建一个灵敏度和特异性汇总表,在我的for循环中,它在从名为“包含值的模型”的列表中查找值时抛出下标越界错误?这是一个完全可复制的示例。Dplyr是版本0.7.0。谢谢 heart <- read.table("http://www-stat.stanford.edu/~tibs/ElemStatLearn/datasets/SAheart.data", sep=",",head=T,row.names=1) library(car) hear
heart <- read.table("http://www-stat.stanford.edu/~tibs/ElemStatLearn/datasets/SAheart.data",
sep=",",head=T,row.names=1)
library(car)
heart$chd <- factor(car::recode(heart$chd, "c(1)='Yes';
else='No'"), levels = c('Yes', 'No'))
library(caret)
set.seed(42)
index <- createDataPartition(heart$chd, p = 0.7, list = FALSE)
train_data <- heart[index, ]
test_data <- heart[-index, ]
set.seed(42)
model_rf <- caret::train(chd ~ .,
data = train_data,
method = "rf",
trControl = trainControl(method = "repeatedcv",
number = 10,
repeats = 10,
verboseIter = FALSE))
final <- data.frame(actual = test_data$chd,
predict(model_rf, newdata = test_data, type = "prob"))
final$predict <- factor(ifelse(final$Yes > 0.5, "Yes", "No"), levels = c('Yes', 'No'))
cm_original <- confusionMatrix(final$predict, test_data$chd)
# down sampling
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 10,
verboseIter = FALSE,
sampling = "down")
set.seed(42)
model_rf_under <- caret::train(chd ~ .,
data = train_data,
method = "rf",
trControl = ctrl)
final_under <- data.frame(actual = test_data$chd,
predict(model_rf_under, newdata = test_data, type = "prob"))
final_under$predict <- factor(ifelse(final_under$Yes > 0.5, "Yes", "No"), levels = c('Yes', 'No'))
cm_down <- confusionMatrix(final_under$predict, test_data$chd)
models <- list(original = model_rf,
under = model_rf_under
)
library(dplyr)
comparison <- data.frame(model = names(models),
Sensitivity = rep(NA, length(models)),
Specificity = rep(NA, length(models))
)
for (name in names(models)) {
model <- get(paste0("cm_", name))
comparison[comparison$model == name, ] <- filter(comparison, model ==
name) %>% mutate( Sensitivity = model[['byClass']][['Sensitivity']],
Specificity = model[['byClass']][['Specificity']] )
}
comparison
heart延迟回答此问题,以防有人遇到此问题
我遇到了类似的问题。尽管管道后发生了突变
,但仍存在错误
或者,我使用了mutate\uz()
,解决了这个问题
filter(comparision, model == name) %>%
mutate_(Sensitivity = model[["byClass"]][['Sensitivity']],
Specificity = model[["byClass"]][['Specificity']])
我得到一个不同的错误,你的错误发生在哪里?修复了一点代码,在for循环中丢失了%>%旁边的mutate。错误发生在调用比较的最后一行之前。mutate_impl(.data,dots)中出错:计算错误:下标超出范围。您没有手动将概率转换为具有type=“prob”
的类的权限。只需使用predict
而不使用该选项。您最好使用重采样结果来比较模型,而不是使用测试集。请参见重新采样
。谢谢。“突变”和“突变”之间的主要区别是什么?@Drendar它只使用标准评估。尽管这些日子使用得很少。