【问题标题】:probit ordinal logistic regression with `MASS::polr`: How to make prediction on new data使用“MASS::polr”进行概率序逻辑回归:如何对新数据进行预测
【发布时间】:2017-03-02 12:45:58
【问题描述】:

我想在 R 中进行序数回归,所以我想使用 MASS 包中的 polr 函数。首先我创建一个这样的模型:

model <- polr(labels ~ var1 + var2, Hess = TRUE)  

现在我想使用该模型来预测新病例。我以为那只是:

pred <- predict(model, data = c(newVar1, newVar2))  

但是,predict 似乎以某种方式预测训练集,而不是新数据。当我的训练集是 2000 个示例,而我的新数据是 700 个示例时。我仍然得到 2000 个预测标签。

所以我的问题是:如何使用polr 对新数据进行预测?

【问题讨论】:

    标签: r regression logistic-regression predict ordinal


    【解决方案1】:

    遗憾的是,predict.polr 没有文档条目,否则您可以简单地阅读该文档以了解如何正确使用 predict

    在 R 中,只有少数原始模型拟合函数,如 smooth.splinepredict 需要一个新数据向量(这是合理的,因为 smooth.spline 处理单变量回归)。通常,predict 需要一个数据框或列表,其名称与模型公式中指定的变量或模型框架中所示的变量匹配(“术语”属性)。如果您适合模型:

    labels ~ var1 + var2
    

    那么你应该构造newdata:

    predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))
    

    predict(model, newdata = list(var1 = newVar1, var2 = newVar2))
    

    注意,predictnewdata,而不是 data


    由于没有文档,我们可以看看:

    args(MASS:::predict.polr)
    #function (object, newdata, type = c("class", "probs"), ...) 
    

    你甚至可以查看源代码(不长):

    MASS:::predict.polr
    

    你会在源代码中看到:

    newdata <- as.data.frame(newdata)
    m <- model.frame(Terms, newdata, na.action = function(x) x, 
           xlev = object$xlevels)
    

    这解释了为什么newdata 应该作为数据框传递,以及为什么变量名称必须与Terms 中的内容匹配。


    这是一个可重现的例子:

    library(MASS)
    house.plr <- polr(Sat ~ Infl + Type + Cont, weights = Freq, data = housing)
    
    ## check model terms inside model frame
    attr(terms(house.plr$model), "term.labels")
    # [1] "Infl" "Type" "Cont"
    

    在进行预测时,这些将不起作用:

    ## `data` ignored as no such argument
    predict(house.plr, data = data.frame("Low", "Tower", "Low"))
    ## no_match in names 
    predict(house.plr, newdata = data.frame("Low", "Tower", "Low"))
    

    这行得通:

    predict(house.plr, newdata = data.frame(Infl = "Low", Type = "Tower", Cont = "Low"))
    
    #[1] Low
    #Levels: Low Medium High
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 2018-01-14
      • 2016-03-08
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多