【问题标题】:Derive preidcted values after glm() in order to get PPV, NPV, sensitivity and specificity在 glm() 之后导出预测值以获得 PPV、NPV、敏感性和特异性
【发布时间】:2019-03-04 12:44:46
【问题描述】:

我运行了一个glm() 模型;但现在我想用 PPV、NPV、敏感性和特异性来衡量模型的准确性。但是,我不断得到令人困惑的结果。

我的结果是一个如下所示的因子变量:

table(mydata$outcome)

   0    1 
6824  359

预测变量是具有 1 个分类(性别)的连续变量的组合。

我的代码是:

# To run the logistic model 

    mod <- glm(outcome~predictor1+predictor2+predictor3,data=mydata,family=binomial("logit"))
    summary(mod)

# To run predict() to get the predicted values of the outcome 

    predicted = predict(object =  mod, newdata=mydata, type = "response")

结果如下所示:

head(predicted)
         1          2          3          4          5          6 
0.02568802 0.02979873 0.01920584 0.01077031 0.01279325 0.09725329 

这非常令人惊讶,因为我预计会观察到预测的“1”(案例)与“0”(对照),我可以进一步使用它们来获得模型的准确度度量,或者使用 confusionMatrix(predicted, mydata$outcome) 或使用 ModelMetrics图书馆。

所以我的问题是如何获得 4x4 表(预测与观察)结果,我可以用它来衡量我的 glm() 模型在预测结果时的准确性?如果有任何建议,我将不胜感激,或者如果有更好的方法来获取 PPV、NPV、敏感性和特异性,请告诉我。谢谢你。

【问题讨论】:

    标签: r glm predict


    【解决方案1】:

    您的 glm 模型给出了两种结果的概率。通常,人们希望将“1”分配给概率 >= 的任何事件。 5,否则为 0。你可以用 round() 来做到这一点。在更多“机器学习”类型的情况下,人们可能会考虑除 0.5 之外的不同值。您可以使用 ifelse() fn 来执行此操作。例如,如果您只想将“1”分配给概率为 0.7 的案例,您可以说 vals = ifelse(mydata$outcome >.7,1,0 )。最后,您想要的数据通常称为混淆矩阵。它可以通过各种包计算,但这里有一个来自姊妹站点的不错的解决方案 - R: how to make a confusion matrix for a predictive model?

    【讨论】:

    • 谢谢你。这是非常有帮助的。我听从了你的建议,效果很好。然而,我的结果看起来相当令人沮丧:只预测了 1 个值。我只是不明白我的模型有什么问题。我想我可能在路上做错了什么。我会继续调查。我非常感谢您的帮助。
    • 你做错了什么。我查看了数据的头部并添加了 '.99' head_pred = c(0.02568802, 0.02979873, 0.01920584, 0.01077031 ,0.01279325, 0.09725329 ,.999) round(head_pred) [1] 0 0 0 0 0 0 1
    • 您的前 6 个预测结果为零。还有 ifelse(head_pred >.05,1,0) [1] 0 0 0 0 0 1 1
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2020-08-23
    • 2021-04-01
    相关资源
    最近更新 更多