Como configurar e estimar um modelo de logit multinomial em R?

20

Eu executei um modelo de logit multinomial no JMP e obtive resultados que incluíam o AIC e os valores de p do qui-quadrado para cada estimativa de parâmetro. O modelo tem um resultado categórico e 7 variáveis ​​explicativas categóricas.

Depois, encaixeimultinom o que eu pensava que construiria o mesmo modelo no R, usando a função no pacote nnet .

O código era basicamente:

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

No entanto, os dois dão resultados diferentes. Com o JMP, o AIC é 2923.21 e com nnet::multinomo AIC é 3116.588.

Então, minha primeira pergunta é: um dos modelos está errado?

A segunda coisa é que o JMP fornece valores de p qui-quadrado para cada estimativa de parâmetro, o que eu preciso. A execução do resumo no multinom fit1não - apenas fornece as estimativas, AIC e Deviance.

Minha segunda pergunta é assim: existe uma maneira de obter os valores-p para o modelo e as estimativas ao usar nnet::multinom?

Eu sei que o mlogit é outro pacote R para isso e parece que sua saída inclui os valores-p; no entanto, não consegui executar mlogitusando meus dados. Acho que os dados foram formatados corretamente, mas diziam que tinha uma fórmula inválida. Usei a mesma fórmula que usei multinom, mas parece que requer um formato diferente usando um pipe e não entendo como isso funciona.

Obrigado.

Paulo
fonte
2
Você pode definir o argumento Hess = TRUE para recuperar o Hessian do multinom e, em seguida, calcular os valores de p manualmente. Mas sugiro que você use a biblioteca mlogit (a nnet pode ter problemas de convergência quando as covariáveis ​​não são dimensionadas corretamente). As vinhetas do mlogit são muito boas e devem ajudá-lo a configurar seus dados corretamente. As vinhetas podem ser encontrados no local de costume: cran.r-project.org/web/packages/mlogit
Jason Morgan

Respostas:

9

Tenho certeza de que você já encontrou suas soluções, pois este post é muito antigo, mas para aqueles de nós que ainda procuram soluções - eu achei http://youtu.be/-Cp_KP9mq94 uma ótima fonte de instruções sobre como execute um modelo de regressão logística multinomial em R usando o pacote mlogit. Se você for ao site da academia de economia, ela tem todos os scripts, dados para R e SAS e STATA, eu acho, ou o SPSS, um deles.

O que explica como / por que e o que fazer para transformar seus dados no formato "longo" vs "amplo". Provavelmente você tem um formato amplo, que requer transformação.

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

Kerry
fonte
3

Em geral, as diferenças nos valores da AIC entre duas partes diferentes de software não são totalmente surpreendentes. O cálculo das probabilidades geralmente envolve uma constante que é a mesma entre diferentes modelos dos mesmos dados. Diferentes desenvolvedores podem fazer escolhas diferentes sobre o que deixar dentro ou fora dessa constante. Quando você deve se preocupar é quando as diferenças nos valores da AIC entre dois modelos diferem. Na verdade, acabei de notar um argumento que multinom()permite alterar como as linhas com valores X idênticos são recolhidas e que isso afeta a linha de base do desvio e, portanto, a AIC. Você pode tentar diferentes valores do argumento summ e ver se isso faz os desvios concordarem. Não sabemos o que o JMP está fazendo! :)

Se os coeficientes estimados e os erros padrão forem os mesmos, você estará bem. Se os coeficientes não forem os mesmos, não esqueça que o JMP pode escolher um resultado de linha de base diferente para calcular os coeficientes. multinom()faz escolhas diferentes de mlogit(), por exemplo.

Obter valores de p a partir do resultado summary () de multinom () é bastante fácil. Não consigo reproduzir seus modelos, então aqui está o exemplo da página de ajuda em 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)

Concordo que descobrir o pacote mlogit é um desafio! Leia as vinhetas com cuidado. Eles ajudam.

atiretoo
fonte
Como eu usaria as outras variáveis ​​(genéricas) do Fishingconjunto de dados com multinom?
Gregmacfarlane
@gmacfarlane Basta adicionar as variáveis que deseja a fórmula na multinom (modo ~ renda + price.beach, ...
atiretoo
@atiretoo Eu estava procurando uma maneira de obter meus amigos, então obrigado! mas apenas para esclarecimentos - de onde vêm os 6 com o df? como o que devo contar para obter meu df? Eu tenho uma variável contínua e uma variável categórica (4 categorias) no meu modelo. Então isso seria um df de 5? Além disso, a pesca é o conjunto completo de dados, certo? Qual é o tamanho da amostra, grau de liberdade.
Krypton
@atiretoo Peço desculpas, acabei de descobrir que, se estiver usando o pacote nnet para executar a regressão do logit - ele realmente calcula o df efetivo e é armazenado no objeto nnet. Então, eu posso extrair o df do modelo e usá-lo. Não verifiquei se o objeto mlogit terá as mesmas informações.
Krypton
@Kerry feliz que você encontrou.
Atiretoo 17/07/2014
1

Você também pode tentar executar um logit multinomial usando o pacote glmnet. Não sei ao certo como forçá-lo a manter todas as variáveis, mas tenho certeza de que é possível.

Zach
fonte