`MASS::polr`的probit序列回归:如何对新数据进行预测

3

我想在R中进行序数回归,因此我想使用来自MASS包的polr函数。首先,我创建了如下模型:

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

现在,我想使用模型来预测新病例。我认为这很简单:

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

然而,似乎predict函数是在训练集上进行预测,而不是新数据上。当我的训练集有2000个样本,而新数据只有700个样本时,我仍然得到了2000个预测标签。

因此,我的问题是:如何使用polr函数对新数据进行预测?

1个回答

5

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

在R中,仅针对少数原始的模型拟合函数(例如smooth.spline),predict会期望新数据为向量(这是合理的,因为smooth.spline处理单变量回归)。通常情况下,predict期望一个数据框或列表,其中的变量名与模型公式中指定的变量名称匹配,或者与模型框架中显示的名称相同(即“terms”属性)。如果您拟合了一个模型:

labels ~ var1 + var2

那么您应该构建“ newdata”:
predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))

或者

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

注意,对于predict使用的是newdata而不是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接