Comment mettre en place et estimer un modèle logit multinomial dans R?


20

J'ai exécuté un modèle logit multinomial dans JMP et obtenu des résultats qui comprenaient l'AIC ainsi que les valeurs de p chi carré pour chaque estimation de paramètre. Le modèle a un résultat catégorique et 7 variables explicatives catégoriques.

J'ai ensuite adapté ce que je pensais construire le même modèle dans R, en utilisant la multinomfonction dans le package nnet .

Le code était essentiellement:

fit1 <- multinom(y ~ x1+x2+...xn,data=mydata);
summary(fit1);

Cependant, les deux donnent des résultats différents. Avec JMP, l'AIC est 2923,21, et avec nnet::multinoml'AIC est 3116,588.

Ma première question est donc la suivante: l'un des modèles est-il faux?

La deuxième chose est que JMP donne des valeurs de p chi carré pour chaque estimation de paramètre, dont j'ai besoin. Le résumé de fonctionnement sur le multinom fit1ne le fait pas - il donne simplement les estimations, AIC et Deviance.

Ma deuxième question est donc la suivante: existe-t-il un moyen d'obtenir les valeurs de p pour le modèle et les estimations lors de l'utilisation nnet::multinom?

Je sais que mlogit est un autre package R pour cela et il semble que sa sortie inclut les valeurs p; cependant, je n'ai pas pu exécuter en mlogitutilisant mes données. Je pense que les données avaient été correctement formatées, mais cela indiquait que j'avais une formule non valide. J'ai utilisé la même formule que celle que j'ai utilisée multinom, mais il semble que cela nécessite un format différent à l'aide d'un tuyau et je ne comprends pas comment cela fonctionne.

Merci.


2
Vous pouvez définir l'argument Hess = TRUE pour récupérer le Hessian de multinom, puis calculer les valeurs p manuellement. Mais je vous suggère d'utiliser la bibliothèque mlogit (nnet peut avoir des problèmes de convergence lorsque les covariables ne sont pas mises à l'échelle correctement). Les vignettes pour mlogit sont plutôt bonnes et devraient vous aider à configurer correctement vos données. Les vignettes peuvent être trouvées à l'endroit habituel: cran.r-project.org/web/packages/mlogit
Jason Morgan

Réponses:


9

Je suis sûr que vous avez déjà trouvé vos solutions car cet article est très ancien, mais pour ceux d'entre nous qui recherchent toujours des solutions - j'ai trouvé que http://youtu.be/-Cp_KP9mq94 est une excellente source d'instructions sur la façon de exécuter un modèle de régression logistique multinomial dans R en utilisant le package mlogit. Si vous allez sur le site de l'académie d'écononométrie, elle a tous les scripts, les données pour R et SAS et STATA, je pense ou SPSS, l'un d'eux.

Quel type explique comment / pourquoi et quoi faire pour transformer vos données au format "long" vs "large". Vous avez très probablement un format large, qui nécessite une transformation.

https://sites.google.com/site/econometricsacademy/econometrics-models/multinomial-probit-and-logit-models


3

En général, les différences de valeurs AIC entre deux logiciels différents ne sont pas entièrement surprenantes. Le calcul des probabilités implique souvent une constante qui est la même entre différents modèles des mêmes données. Différents développeurs peuvent faire des choix différents sur ce qu'il faut laisser dans ou hors de cette constante. Lorsque vous devez vous inquiéter, c'est lorsque les différences de valeurs AIC entre deux modèles diffèrent. En fait, je viens de remarquer un argument pour multinom()vous permettre de modifier la façon dont les lignes avec des valeurs X identiques sont réduites, et que cela affecte la ligne de base de la déviance, et donc l'AIC. Vous pouvez essayer différentes valeurs de l'argument summ et voir si cela rend les divergences d'accord. Nous ne savons pas ce que fait JMP! :)

Si les coefficients estimés et les erreurs standard sont les mêmes, alors vous êtes bon. Si les coefficients ne sont pas les mêmes, n'oubliez pas que JMP peut choisir un résultat de base différent pour calculer les coefficients. multinom()fait des choix différents mlogit(), par exemple.

Obtenir des valeurs de p à partir du résultat summary () de multinom () est assez facile. Je ne peux pas reproduire vos modèles, alors voici l'exemple de la page d'aide sur multinom ():

library("nnet")
data("Fishing", package = "mlogit")
fishing.mu <- multinom(mode ~ income, data = Fishing)
sum.fishing <- summary(fishing.mu) # gives a table of outcomes by covariates for coef and SE
str(sum.fishing)
# now get the p values by first getting the t values
pt(abs(sum.fishing$coefficients / sum.fishing$standard.errors),
  df=nrow(Fishing)-6,lower=FALSE)

Je suis d'accord que trouver le paquet mlogit est un peu un défi! Lisez attentivement les vignettes. Ils aident.


Comment utiliser les autres variables (génériques) de l' Fishingensemble de données avec multinom?
gregmacfarlane

@gmacfarlane Ajoutez simplement les variables que vous voulez à la formule en multinom (mode ~ revenue + price.beach, ...
atiretoo

@atiretoo Je cherchais un moyen d'obtenir mes pvals donc merci! mais juste pour clarification - d'où vient le 6 avec le df? comme quoi dois-je compter pour obtenir mon df? J'ai une variable continue et une variable catégorielle (4 catégories) dans mon modèle. Serait-ce donc un df de 5? De plus, la pêche est-elle l'ensemble des données correct? Qui est la taille de l'échantillon-degré de liberté.
Kerry

@atiretoo Je m'excuse, je viens de découvrir que si vous utilisez le package nnet pour exécuter la régression logit - il calcule en fait le df effectif et il est stocké dans l'objet nnet. Donc, je peux extraire le df du modèle et l'utiliser. Je n'ai pas vérifié si l'objet mlogit aura les mêmes informations.
Kerry

@Kerry heureux de l'avoir trouvé.
atiretoo

1

Vous pouvez également essayer d'exécuter un logit multinomial à l'aide du package glmnet. Je ne sais pas comment le forcer à conserver toutes les variables, mais je suis sûr que c'est possible.

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.