К сожалению, в документации для predict.polr
нет записи, иначе вы можете просто прочитать ее, чтобы узнать, как правильно использовать predict
.
В R только для некоторых функций подгонки примитивных моделей, таких как smooth.spline
, predict
, ожидается вектор для новых данных (это разумно, поскольку smooth.spline
обрабатывает одномерную регрессию). Как правило, predict
ожидает фрейм данных или список, имена которых соответствуют переменным, указанным в формуле модели или как показано во фрейме модели (атрибуты «условия»). Если вам подходит модель:
labels ~ var1 + var2
тогда вы должны построить newdata
:
predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))
or
predict(model, newdata = list(var1 = newVar1, var2 = newVar2))
Обратите внимание: это newdata
, а не data
для predict
.
Поскольку документации нет, было бы неплохо, если бы мы посмотрели на:
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
person
Zheyuan Li
schedule
20.10.2016