模拟多个图形的循环中的R错误

R error in a loop simulating multiple graphs

我正在尝试构建一个循环来绘制 10 个 ROC 并使用 R 库 ROCR 存储 10 个模型的 AUC 分数。我创建的循环产生错误:

Error in prediction(as.numeric(var_name[i]), s_test$clickthrough) : Number of predictions in each run must be equal to the number of labels for each run.

当我尝试 运行 单独预测时,标签数量不等于预测并没有错。谁能帮我解决for循环引起的错误?

个人预测(效果很好):

lr.pred<- prediction(as.numeric(lda_predp),
                  s_test$clickthrough)
AUC1 <- performance(lr.pred,"auc")@y.values[[1]]
lr.ROC1 <- performance(lr.pred,"tpr","fpr")
plot(lr.ROC1, main= "LDA")

循环出现问题:

par(mfrow=c(2,5))

var_name = c("nb_predp","lda_predp","qda_predp","lg_prob","lda_forwardp","lda_lassop",
         "lda_pred_int_p","lda_pred_t_p","lda_pred_v_p","lda_pred_c_p")


    for (i in 1:length(var_name)){

      lr.pred[i] <- prediction(as.numeric(var_name[i]),
                  s_test$clickthrough)

      AUC[i] <- performance(lr.pred[i],"auc")@y.values[[1]]
      lr.ROC[i] <- performance(lr.pred[i],"tpr","fpr")
      plot(lr.ROC[i], main= var_name[i])

    }

我检查了 lr.pred 的格式,原来它不是向量,而是 ROCR 包创建的预测 class。我认为这可能是问题所在,但有谁知道如何从 ROCR 包中提取数据以适合图表?

已修订 lr.pred 将是一个 "prediction" 对象,lr.ROC 将是一个具有特定 class.

的 "performance" 对象
 lr.pred = list()

 var_name = 
 c("nb_predp","lda_predp","qda_predp","lg_prob","lda_forwardp","lda_lassop", 
  "lda_pred_int_p","lda_pred_t_p","lda_pred_v_p","lda_pred_c_p")

 for (i in 1:length(var_name)){
 lr.pred[[i]] <- prediction(var_name[i], s_test$clickthrough)

 AUC[i] <- performance(lr.pred[i],"auc")@y.values[[1]]
 lr.ROC[i] <- performance(lr.pred[i],"tpr","fpr") 
 plot(lr.ROC[i], main= var_name[i])

}

您在 prediction() 调用中传递了一个字符串,而不是命名对象。

  • 在你的工作个人非循环运行你调用:prediction(as.numeric(lda_predp)...)

  • 在你的循环中,它类似于传递一个带引号的字符串: prediction(as.numeric("lda_predp")...)

要解决,请将 var_name 分配给命名对象(即,无字符串)并按原样 运行 for 循环:

var_name = c(nb_pred1, lda_pred1, qda_pred1, lg_prob, lda_pred_1_p, lda_pred_2_p,
             lda_pred_int_p, lda_pred_t_p, lda_pred_v_p, lda_pred_c_p)

或使用get()内部循环通过字符串引用环境对象:

var_name = c("nb_pred1", "lda_pred1", "qda_pred1", "lg_prob", "lda_pred_1_p", "lda_pred_2_p",
             "lda_pred_int_p", "lda_pred_t_p", "lda_pred_v_p", "lda_pred_c_p")

lr.pred <- vector(); AUC <- vector(); lr.ROC <- vector()

for (i in 1:length(var_name)){
     lr.pred[i] <- prediction(as.numeric(get(varname[i]), s_test$clickthrough)
     ...
}

但您可能想要 运行 后者,因为您将 main 分配给了一个字符串:main=var_name[i].