Prédire après avoir exécuté la fonction mlogit dans R


11

Voici ce que je veux faire, mais il ne semble pas y avoir de predictméthode pour le mlogit. Des idées?

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
Avez-vous lu la vignette d'accompagnement, Estimation des modèles logit multinomiaux dans R: The mlogit Packages ? Il me semble qu'il suffit d'appliquer les coefficients ajustés aux nouvelles données, n'est-ce pas?
chl

@chl c'est ce que je dois faire, oui, mais j'espérais ne pas avoir à réinventer la roue.
Zach

Réponses:


2

Voici une astuce utile: ajoutez les données que vous souhaitez prédire à votre échantillon d'estimation d'origine, mais utilisez la variable de pondération pour définir le poids de ces nouvelles observations à zéro. Estimer le modèle (avec les nouvelles observations pondérées à zéro) et obtenir les prédictions à partir de la sortie "probabilités". De cette façon, vous pouvez contourner la fonction de prédiction, qui est un gâchis.


6

Le package mlogit a une méthode Predict (), au moins dans la version que j'utilise (0.2-3 avec R 2.15.3).

Le code mis en place par @Zach contient une erreur. Les données de "format long" utilisées par mlogit () ont une ligne pour chaque alternative; c'est le format créé par la fonction mlogit.data (). Par conséquent, pour obtenir une prédiction pour le premier cas, vous devez retirer toutes les lignes de ce cas, et il y en a 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)

ce qui donne un bon résultat.


4

Après pas mal d'efforts pour essayer d'utiliser la fonction de prédiction pour la population, je pense que je peux ajouter quelques idées à toutes vos réponses.

La predictfonction de mlogit fonctionne bien, il vous suffit de faire quelques ajustements et de vous assurer que les choses suivantes sont prises en charge:

  1. Le newdata(comme prévu) devrait inclure exactement les mêmes données que l'échantillon utilisé pour l'estimation du modèle. Cela signifie que l'on doit vérifier les propriétés "cachées" des données (comme celles factorqui héritent de niveaux qui n'existent pas - droplevelpeuvent être utiles dans ce cas -, ou non introduites dans les facteurs d'échantillonnage, ou incorrectes, colnameetc.).

  2. Vous devez faire un choix arbitraire dans vos nouvelles données (si elles n'existent pas) quelque chose qui peut être facilement fait en utilisant la samplefonction:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
  3. L'étape suivante requise consiste à transformer à nouveau les données en données mlogit, en utilisant la même fonction que celle utilisée pour les exemples de données, par exemple:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. La dernière étape serait la prédiction réelle à l'aide de la predictfonction.

    resulted<-predict(ml1,newdata=ExpData3)

2

Pour répondre à ma propre question, je suis passé à l'utilisation du package 'glmnet' pour adapter mes logits multinomiaux, ce qui a l'avantage supplémentaire d'utiliser le lasso ou le filet élastique pour régulariser mes variables indépendantes. glmnet semble être un pack beaucoup plus «fini» que mlogit, avec une fonction «prédire».


1

mlogita une fonction de prédiction, mais je l'ai trouvé très difficile à utiliser. J'ai écrit mon propre ensemble de fonctions très laid pour une implémentation que j'ai. Tout le monde est invité à les utiliser ou à les améliorer, stockés sur mon profil github .


0

Je suis presque sûr que cela se fait facilement avec le paquet mlogit donné en utilisant la fonction ajustée puis la fonction de prédiction R standard. Comme l'a souligné chl, bien que je ne l'ai pas encore fait moi-même (du moins pas le prédire), est illustré dans les vignettes de package ici à la page 29.


1
La vignette est d'une simplicité trompeuse; dans la pratique, je ne pouvais pas comprendre comment postuler à de nouvelles données. J'ai donc écrit mon propre code, lié ci-dessous.
gregmacfarlane
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.