Прогнозуйте після запуску функції mlogit в R


11

Ось, що я хочу зробити, але, здається, немає predictметоду для mlogit. Будь-які ідеї?

library(mlogit)
data("Fishing", package = "mlogit")
Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")

Fish_fit<-Fish[-1,]
Fish_test<-Fish[1,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)

4
Чи читали ви супровідну віньєтку, Оцінка багаточленних моделей logit в R: Пакети mlogit ? Мені здається, ви просто повинні застосувати встановлені коефіцієнти до нових даних, чи не так?
chl

@chl це те, що мені потрібно зробити, так, але я сподівався, що мені не доведеться заново вигадувати колесо.
Зак

Відповіді:


2

Ось корисна хитрість. Додайте дані, які ви хочете передбачити, у свій початковий зразок оцінки, але використовуйте змінну ваги, щоб встановити вагу цих нових спостережень до нуля. Оцініть модель (з новими спостереженнями, зваженими до нуля), і отримайте прогнози з результату "ймовірності". Таким чином ви можете обійти функцію передбачення, яка є безладом.


6

У пакеті mlogit є метод прогнозування (), принаймні у версії, яку я використовую (0,2-3 з R 2.15.3).

У коді, викладеному @Zach, є одна помилка. Дані "довгого формату", використовувані mlogit (), мають один рядок для кожної альтернативи; це формат, створений функцією mlogit.data (). Тому для прогнозування першого випадку потрібно витягнути всі рядки для цього випадку, а їх 4:

Fish_fit<-Fish[-(1:4),]
Fish_test<-Fish[1:4,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)

що дає хороший результат.


4

Доклавши чимало зусиль, намагаючись використати функцію передбачення для населення, я думаю, я можу додати декілька розумінь до всіх ваших відповідей.

predictФункція mlogit працює нормально, ви просто повинні внести деякі корективи і переконайтеся , що наступні речі піклуються:

  1. newdata(Як очікувалося) повинні включати в себе одні і ті ж дані, що і зразок , який використовується для оцінки моделі. Це означає, що слід перевірити наявність «прихованих» властивостей даних (наприклад, factorщо успадковує рівні, які не існують - droplevelможе бути корисним у цьому випадку, або не введеним у вибіркові фактори, або неправильним colnameтощо).

  2. Ви повинні зробити довільний вибір у своїх нових даних (якщо таких не існує), що можна легко зробити за допомогою sampleфункції:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
  3. Наступним необхідним кроком є ​​повторне перетворення даних у mlogit дані, використовуючи ту ж функцію, що і для вибіркових даних, наприклад:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. Останнім кроком буде власне передбачення за допомогою predictфункції.

    resulted<-predict(ml1,newdata=ExpData3)

2

Щоб відповісти на моє власне запитання, я перейшов до використання пакету 'glmnet', щоб підходити до своїх багаточленних логітів, що має додаткову перевагу використання ласо або еластичної сітки для регуляризації моїх незалежних змінних. glmnet, здається, набагато більш "готовий" пакується, ніж mlogit, доповнений функцією "передбачення".


1

mlogitмає функцію передбачення, але мені було дуже важко використовувати. Я написав власний дуже некрасивий набір функцій для реалізації, який у мене є. Будь-хто бажає використовувати або вдосконалювати їх, що зберігаються в моєму профілі github .


0

Я впевнений, що це легко зробити із заданим пакетом mlogit, використовуючи вбудовану функцію, а потім стандартну функцію R прогнозування. Як хл зазначив, хоча я не зробив це сам поки (принаймні , не передбачений), є в exampled пакеті віньєток тут на стор 29.


1
Віньєтка оманливо проста; на практиці я не міг зрозуміти, як звернутися до нових даних. Тому я написав власний код, посилання нижче.
gregmacfarlane
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.