Prognozuj po uruchomieniu funkcji mlogit w R.


11

Oto, co chcę zrobić, ale wydaje się, że nie ma predictmetody dla mlogit. Jakieś pomysły?

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
Czy czytałeś towarzyszącą winietę, Szacowanie wielomianowych modeli logit w R: The mlogit Packages ? Wydaje mi się, że po prostu musisz zastosować dopasowane współczynniki do nowych danych, prawda?
chl

@chl to właśnie muszę zrobić, tak, ale miałem nadzieję, że nie będę musiał ponownie wymyślać koła.
Zach

Odpowiedzi:


2

Oto przydatna sztuczka: dodaj dane, które chcesz przewidzieć, do oryginalnej próbki szacunkowej, ale użyj zmiennej wagi, aby ustawić wagę tych nowych obserwacji na zero. Oszacuj model (z nowymi obserwacjami ważonymi do zera) i uzyskaj prognozy z danych wyjściowych „prawdopodobieństwa”. W ten sposób można ominąć funkcję przewidywania, która jest bałaganem.


6

Pakiet mlogit ma metodę predykcji (), przynajmniej w wersji, której używam (0.2-3 z R 2.15.3).

Kod wystawiony przez @Zach zawiera jeden błąd. Dane „długiego formatu” używane przez mlogit () mają jeden wiersz dla każdej alternatywy; jest to format utworzony przez funkcję mlogit.data (). Dlatego, aby uzyskać prognozę dla pierwszego przypadku, musisz wyciągnąć wszystkie wiersze dla tego przypadku, a są 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)

co daje dobry wynik.


4

Po dość dużym wysiłku w próbie użycia funkcji przewidywania dla populacji, myślę, że mogę dodać kilka spostrzeżeń do wszystkich twoich odpowiedzi.

predictFunkcją mlogit działa dobrze, po prostu trzeba dokonać pewnych korekt i mieć pewność, że następujące rzeczy są pod opieką:

  1. newdata( Zgodnie z oczekiwaniami) powinny zawierać dokładnie te same dane, co próbka użyta do oszacowania modelu. Oznacza to, że należy sprawdzić „ukryte” właściwości danych (takie jak factordziedziczące poziomy, które nie istnieją - droplevelmogą być przydatne w tym przypadku - lub nie zostaną wprowadzone w przykładowych czynnikach, lub błędne colnameitp.).

  2. Musisz dokonać dowolnego wyboru w nowych danych (jeśli nie istnieje), co można łatwo zrobić za pomocą samplefunkcji:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
  3. Kolejnym wymaganym krokiem jest ponowne przekształcenie danych w dane mlogit, przy użyciu tej samej funkcji, co w przypadku danych przykładowych, na przykład:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. Ostatnim krokiem byłoby rzeczywiste przewidywanie za pomocą predictfunkcji.

    resulted<-predict(ml1,newdata=ExpData3)

2

Aby odpowiedzieć na moje pytanie, przeszedłem do używania pakietu „glmnet” w celu dopasowania moich logów wielomianowych, co ma tę dodatkową zaletę, że używa lasso lub elastycznej sieci do regularyzacji moich zmiennych niezależnych. glmnet wydaje się być znacznie bardziej „gotowym” pakietem niż mlogit, wraz z funkcją „przewidywania”.


1

mlogitma funkcję przewidywania, ale korzystanie z niej jest bardzo trudne. Napisałem własny bardzo brzydki zestaw funkcji dla mojej implementacji. Każdy może używać lub ulepszać je, zapisane na moim profilu github .


0

Jestem prawie pewien, że można to łatwo zrobić z danym pakietem mlogit, używając dopasowanej funkcji, a następnie standardowej funkcji przewidywania R. Jak chl wskazał, chociaż nie zrobił się jeszcze (przynajmniej nie przewidują) jest przykładowa w winiet pakietowych tutaj na stronie 29.


1
Winieta jest zwodniczo prosta; w praktyce nie mogłem wymyślić, jak zastosować nowe dane. Napisałem więc własny kod, do którego link poniżej.
gregmacfarlane
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.