Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dplyr-变异下标超出范围_R_Dplyr_R Caret - Fatal编程技术网

Dplyr-变异下标超出范围

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

我试图从两个插入符号模型输出创建一个灵敏度和特异性汇总表,在我的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)

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它只使用标准评估。尽管这些日子使用得很少。