2016-10-20 19 views
2

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

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

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

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

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

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

ответ

3

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

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

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