作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 R 中进行序数回归,因此我想使用 MASS
包中的 polr
函数。首先,我创建一个这样的模型:
model <- polr(labels ~ var1 + var2, Hess = TRUE)
现在我想使用该模型来预测新病例。我认为这只是:
pred <- predict(model, data = c(newVar1, newVar2))
然而,预测似乎是在某种程度上预测训练集,而不是新数据。当我的训练集是 2000 个示例,而我的新数据是 700 个示例时。我仍然得到 2000 个预测标签。
所以我的问题是:如何使用 polr
对新数据进行预测?
最佳答案
遗憾的是,没有 predict.polr
的文档条目,否则您可以简单地阅读它以了解如何正确使用 predict
。
在 R 中,仅对于一些原始模型拟合函数,例如 smooth.spline
、predict
期望新数据的向量(这是合理的,因为 smooth.spline
处理单变量回归)。一般来说,predict
需要一个数据框或列表,其名称与模型公式中指定的变量或模型框架中显示的变量(“term”属性)相匹配。如果您适合某个型号:
labels ~ var1 + var2
那么你应该构造newdata
:
predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))
或
predict(model, newdata = list(var1 = newVar1, var2 = newVar2))
注意,它是newdata
,而不是predict
的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
关于r - 概率序数逻辑回归 `MASS::polr` : How to make prediction on new data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40155755/
我是一名优秀的程序员,十分优秀!