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

时间:2018-02-14 16:08:04

标签: r loops for-loop classification roc

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

  

预测错误(as.numeric(var_name [i]),s_test $ clickthrough):      每次运行中的预测数量必须等于标签数量      每次运行。

当我尝试单独运行预测时,不等于预测的标签数量没有任何问题。任何人都可以帮我修复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包创建的预测类。我认为这可能是问题,但有没有人知道如何从ROCR包中提取数据以适应图形?

lr.pred将是一个“预测”对象,而lr.ROC将是一个具有特定类的“性能”对象。

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

}

1 个答案:

答案 0 :(得分:1)

您在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]