遗憾的是,predict.polr 没有文档条目,否则您可以简单地阅读该文档以了解如何正确使用 predict。
在 R 中,只有少数原始模型拟合函数,如 smooth.spline、predict 需要一个新数据向量(这是合理的,因为 smooth.spline 处理单变量回归)。通常,predict 需要一个数据框或列表,其名称与模型公式中指定的变量或模型框架中所示的变量匹配(“术语”属性)。如果您适合模型:
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