来自插入符号的混淆矩阵和R中的Epi封装的ROC的不同结果

时间:2017-09-13 15:34:10

标签: r

我试图通过逻辑回归进行分类。为了评估模型,我使用了confusionMatrix和ROC。问题是两个包的结果不同。我想弄清楚哪一个是对还是错。

  1. 我的数据如下: data name = newoversample,包含29个变量和4802个观测值。 “q89”是预测变量。

  2. 我的尝试:

  3. (1)来自'caret'库的混淆矩阵

        glm.fit = glm(q89 ~ ., newoversample, family = binomial)
        summary(glm.fit)
        glm.probs=predict(glm.fit,type="response")
        glm.pred=rep(0,4802)
        glm.pred[glm.probs>.5]="1"
        library(caret)
        confusionMatrix(data=glm.pred, reference=newoversample$q89)
    

    结果是:

        Confusion Matrix and Statistics
    
                  Reference
        Prediction    0    1
                 0 2018  437
                 1  383 1964
    
               Accuracy : 0.8292          
                 95% CI : (0.8183, 0.8398)
            No Information Rate : 0.5             
            P-Value [Acc > NIR] : < 2e-16         
    
                  Kappa : 0.6585          
         Mcnemar's Test P-Value : 0.06419         
    
            Sensitivity : 0.8405          
            Specificity : 0.8180          
         Pos Pred Value : 0.8220          
         Neg Pred Value : 0.8368          
             Prevalence : 0.5000          
         Detection Rate : 0.4202          
           Detection Prevalence : 0.5112          
              Balanced Accuracy : 0.8292          
    
               'Positive' Class : 0 
    

    (2)来自'Epi'库的ROC曲线

        library(Epi)
        rocresult <- ROC(form = q89 ~ ., data = newoversample, MI = FALSE, main = "over")
        rocresult
    

    结果是: roc curve

    如您所见,此处灵敏度为91,特异性为78,这与(1)混淆矩阵的结果不同。

    我无法弄清楚为什么结果不同以及哪一个是正确的。

    +) 如果第二种方法(ROC曲线)错误,请告诉我如何从第一种方法计算auc或绘制roc曲线。

    请帮助我!

    谢谢你

2 个答案:

答案 0 :(得分:0)

您应绘制使用glm

构建的相同模型的ROC曲线
library(ROCR)
pred <- prediction(predict(glm.fit), newoversample$q89)
perf <- performance(pred,"tpr","fpr")
plot(perf)

希望这有帮助!

答案 1 :(得分:0)

我认为混淆矩阵似乎很好。考虑到您没有定义“正类”的事实,因此默认情况下将其设置为0。

问题出在ROC图上。您仍然可以将Epi::ROC用于roc曲线,但是应该使用Epi::ROC(test = newoversample$q89, stat = glm.pred, MI = FALSE, main = "over") 这样,灵敏度和特异性应该与基质没有太大差异。

当您使用ROC(form = q89 ~ ., data = newoversample, MI = FALSE, main = "over")时,这意味着您将逻辑回归传递到form参数,该参数与glm模型不同。并且在这种情况下,您应该为test函数(check here for more detail on Epi::ROC)提供statROC参数的值。