Prevedi dopo aver eseguito la funzione mlogit in R


11

Ecco cosa voglio fare, ma non sembra esserci alcun predictmetodo per il mlogit. Qualche idea?

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
Hai letto la vignetta di accompagnamento, Stima dei modelli logit multinomiali in R: The mlogit Packages ? Mi sembra che devi solo applicare i coefficienti adattati su nuovi dati, no?
chl

@chl è quello che devo fare, sì, ma speravo di non dover reinventare la ruota.
Zach,

Risposte:


2

Ecco un trucco utile: aggiungi i dati che desideri prevedere al campione di stima originale, ma usa la variabile dei pesi per impostare il peso di quelle nuove osservazioni su zero. Stimare il modello (con le nuove osservazioni ponderate su zero) e ottenere le previsioni dall'output "probabilità". In questo modo puoi bypassare la funzione di previsione, che è un casino.


6

Il pacchetto mlogit ha un metodo predict (), almeno nella versione che sto usando (0.2-3 con R 2.15.3).

Il codice inserito da @Zach contiene un errore. I dati "long format" usati da mlogit () hanno una riga per ogni alternativa; questo è il formato creato dalla funzione mlogit.data (). Pertanto per ottenere una previsione per il primo caso è necessario estrarre tutte le righe per quel caso, e ce ne sono 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)

che dà un buon risultato.


4

Dopo molti sforzi nel tentativo di utilizzare la funzione di previsione per la popolazione, penso di poter aggiungere alcune intuizioni a tutte le tue risposte.

La predictfunzione di mlogit funziona bene, devi solo apportare alcune modifiche ed essere sicuro che le seguenti cose siano prese in considerazione:

  1. L' newdata(come previsto) dovrebbe includere esattamente gli stessi dati del campione utilizzato per la stima del modello. Ciò significa che si dovrebbe verificare la presenza di proprietà "nascoste" dei dati (come una factorche eredita livelli che non esistono - droplevelpuò essere utile in questo caso - o non introdotta nei fattori di esempio, o un errore colnameecc.).

  2. Devi fare una scelta arbitraria nei tuoi nuovi dati (se non esiste) qualcosa che può essere facilmente fatto usando la samplefunzione:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
    
  3. Il prossimo passaggio richiesto è trasformare nuovamente i dati in dati mlogit, utilizzando la stessa funzione utilizzata per i dati di esempio, ad esempio:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. Il passaggio finale sarebbe la previsione effettiva utilizzando la predictfunzione.

    resulted<-predict(ml1,newdata=ExpData3)

2

Per rispondere alla mia domanda, sono passato all'utilizzo del pacchetto 'glmnet' per adattarmi ai miei log multinomiali, che ha l'ulteriore vantaggio di usare il lazo o la rete elastica per regolarizzare le mie variabili indipendenti. glmnet sembra essere un pacchetto molto più "finito" di mlogit, completo di una funzione "predire".


1

mlogitha una funzione di previsione, ma ho trovato molto difficile da usare. Ho scritto il mio brutto set di funzioni per un'implementazione che ho. Chiunque può usarli o migliorarli, memorizzati sul mio profilo github .


0

Sono abbastanza sicuro che questo sia fatto facilmente con il pacchetto mlogit dato usando la funzione montata e quindi la funzione di previsione R standard. Come ha sottolineato chl, anche se non l'ho ancora fatto da solo (almeno non il pronostico), è riportato nelle vignette del pacchetto qui a pag 29.


1
La vignetta è ingannevolmente semplice; in pratica non sono riuscito a capire come applicare a nuovi dati. Quindi ho scritto il mio codice, collegato di seguito.
gregmacfarlane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.