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

#r #regression #logistic-regression #predict #ordinal

#r #регрессия #логистическая регрессия #прогнозировать #порядковый

Вопрос:

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

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

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

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

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

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

Ответ №1:

К сожалению, для predict.polr этого нет записи в документации, в противном случае вы можете просто прочитать, как правильно использовать predict .

В R только для нескольких функций подгонки примитивной модели, таких как smooth.spline , predict ожидайте вектор для newdata (это разумно, поскольку smooth.spline обрабатывает одномерную регрессию). Как правило, predict ожидается фрейм данных или список, имена которых соответствуют переменным, указанным в формуле модели или как показано в фрейме модели (атрибуты «terms»). Если вы соответствуете модели:

 labels ~ var1   var2
  

затем вы должны построить newdata :

 predict(model, newdata = data.frame(var1 = newVar1, var2 = newVar2))
  

или

 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