пробит порядковая логистическая регрессия с помощью `MASS :: polr`: как делать прогнозы на новых данных

Я хочу выполнить порядковую регрессию в R, поэтому я хочу использовать функцию polr из пакета MASS. Сначала я создаю такую ​​модель:

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

Теперь я хочу использовать модель для прогнозирования новых случаев. Я думал, что это будет просто:

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

Однако кажется, что предсказание каким-то образом предсказывает обучающий набор, а не новые данные. Когда мой обучающий набор составляет 2000 примеров, а мои новые данные - 700 примеров. Я до сих пор получаю 2000 предсказанных этикеток.

Итак, мой вопрос: как мне использовать polr, чтобы делать прогнозы на основе новых данных?


person dimpol    schedule 20.10.2016    source источник


Ответы (1)


К сожалению, в документации для 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