Preveja após executar a função mlogit em R


11

Aqui está o que eu quero fazer, mas parece não haver predictmétodo para o mlogit. Alguma ideia?

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
Você leu a vinheta, Estimativa de modelos de logotipos multinomiais em R: The mlogit Packages ? Parece-me que você apenas precisa aplicar os coeficientes ajustados em novos dados, não é?
chl

@chl é isso que preciso fazer, sim, mas esperava não ter que reinventar a roda.
Zach

Respostas:


2

Aqui está um truque útil: adicione os dados que você deseja prever à sua amostra de estimativa original, mas use a variável de pesos para definir o peso dessas novas observações como zero. Estime o modelo (com as novas observações ponderadas para zero) e obtenha as previsões da saída "probabilidades". Dessa forma, você pode ignorar a função de previsão, que é uma bagunça.


6

O pacote mlogit tem um método predict (), pelo menos na versão que estou usando (0.2-3 com R 2.15.3).

O código criado por @Zach tem um erro. Os dados de "formato longo" usados ​​pelo mlogit () têm uma linha para cada alternativa; esse é o formato criado pela função mlogit.data (). Portanto, para obter uma previsão para o primeiro caso, você precisa extrair todas as linhas desse caso e existem 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)

o que dá um bom resultado.


4

Depois de muito esforço na tentativa de usar a função de previsão para a população, acho que posso acrescentar algumas idéias a todas as suas respostas.

A predictfunção do mlogit funciona bem, basta fazer alguns ajustes e garantir que as seguintes ações sejam resolvidas:

  1. O newdata(como esperado) deve incluir exatamente os mesmos dados que a amostra usada para a estimativa do modelo. Isso significa que é preciso verificar se há propriedades "ocultas" dos dados (como uma factorque herda níveis que não existem - droplevelpodem ser úteis nesse caso - ou não foram introduzidas nos fatores da amostra, ou estão incorretas colnameetc.).

  2. Você deve fazer uma escolha arbitrária em seus novos dados (se não existirem) algo que possa ser feito facilmente usando a samplefunção:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
  3. A próxima etapa necessária é transformar novamente os dados em mlogit, usando a mesma função usada para os dados de amostra, por exemplo:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. O passo final seria a previsão real usando a predictfunção

    resulted<-predict(ml1,newdata=ExpData3)

2

Para responder minha própria pergunta, passei a usar o pacote 'glmnet' para ajustar meus logits multinomiais, que tem a vantagem de usar o laço ou a rede elástica para regularizar minhas variáveis ​​independentes. O glmnet parece ser um pacote muito mais "finalizado" que o mlogit, completo com a função "prever".


1

mlogittem uma função de previsão, mas achei muito difícil de usar. Eu escrevi meu próprio conjunto muito feio de funções para uma implementação que tenho. Qualquer pessoa pode usá-los ou melhorá-los, armazenados no meu perfil do github .


0

Tenho certeza de que isso é feito facilmente com o pacote mlogit fornecido, usando a função ajustada e, em seguida, a função de previsão R padrão. Como chl apontou, embora eu ainda não tenha feito isso (pelo menos não o previsto), é examinado nas vinhetas de pacotes aqui na página 29.


1
A vinheta é enganosamente simples; na prática, não conseguia descobrir como aplicar a novos dados. Então, eu escrevi meu próprio código, link abaixo.
Gregmacfarlane
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.