使用"MASS :: polr"进行概率序数逻辑回归:如何对新数据进行预测

dim*_*pol 3 regression r ordinal predict logistic-regression

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

model <- polr(labels ~ var1 + var2, Hess = TRUE)  
Run Code Online (Sandbox Code Playgroud)

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

pred <- predict(model, data = c(newVar1, newVar2))  
Run Code Online (Sandbox Code Playgroud)

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

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

李哲源*_*李哲源 5

可悲的是,没有文档条目predict.polr,否则你可以简单地阅读如何predict正确使用.

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

labels ~ var1 + var2
Run Code Online (Sandbox Code Playgroud)

然后你应该构建newdata:

predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))
Run Code Online (Sandbox Code Playgroud)

要么

predict(model, newdata = list(var1 = newVar1, var2 = newVar2))
Run Code Online (Sandbox Code Playgroud)

请注意,这是newdata不是datapredict.


由于没有文档,如果我们看一下可能会很好:

args(MASS:::predict.polr)
#function (object, newdata, type = c("class", "probs"), ...) 
Run Code Online (Sandbox Code Playgroud)

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

MASS:::predict.polr
Run Code Online (Sandbox Code Playgroud)

您将在源代码中看到:

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

这解释了为什么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"
Run Code Online (Sandbox Code Playgroud)

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

## `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"))
Run Code Online (Sandbox Code Playgroud)

这有效:

predict(house.plr, newdata = data.frame(Infl = "Low", Type = "Tower", Cont = "Low"))

#[1] Low
#Levels: Low Medium High
Run Code Online (Sandbox Code Playgroud)