Predecir después de ejecutar la función mlogit en R

11

Esto es lo que quiero hacer, pero parece que no hay ningún predictmétodo para el mlogit. ¿Algunas ideas?

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)
Zach
fuente
44
¿Leyó la viñeta de acompañamiento, Estimación de modelos logit multinomiales en R: Los paquetes mlogit ? Me parece que solo tienes que aplicar los coeficientes ajustados en los nuevos datos, ¿no?
chl
@chl eso es lo que tengo que hacer, sí, pero esperaba no tener que reinventar la rueda.
Zach

Respuestas:

2

Aquí hay un truco útil: agregue los datos que desea predecir a su muestra de estimación original, pero use la variable de pesos para establecer el peso de esas nuevas observaciones en cero. Estime el modelo (con las nuevas observaciones ponderadas a cero) y obtenga las predicciones de la salida de "probabilidades". De esa manera, puede omitir la función de predicción, que es un desastre.

Robert Bray
fuente
6

El paquete mlogit tiene un método predict (), al menos en la versión que estoy usando (0.2-3 con R 2.15.3).

El código presentado por @Zach tiene un error. Los datos de "formato largo" utilizados por mlogit () tienen una fila para cada alternativa; Este es el formato creado por la función mlogit.data (). Por lo tanto, para obtener una predicción para el primer caso, debe extraer todas las filas para ese caso, y hay 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)

Lo que da un buen resultado.

atiretoo - restablecer monica
fuente
4

Después de mucho esfuerzo al tratar de usar la función de predicción para la población, creo que puedo agregar algunas ideas a todas sus respuestas.

La predictfunción de mlogit funciona bien, solo tiene que hacer algunos ajustes y asegurarse de que se cuiden las siguientes cosas:

  1. El newdata(como se esperaba) debe incluir exactamente los mismos datos que la muestra utilizada para la estimación del modelo. Esto significa que uno debe verificar las propiedades "ocultas" de los datos (como una factorque hereda niveles que no existen, droplevelpuede ser útil en este caso, o no se introduce en los factores de la muestra, o un error, colnameetc.).

  2. Debe hacer una elección arbitraria en sus datos nuevos (si no existe), algo que se puede hacer fácilmente con la samplefunción:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
    
  3. El siguiente paso requerido es volver a transformar los datos en datos mlogit, utilizando la misma función que se utiliza para los datos de muestra, por ejemplo:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
  4. El paso final sería la predicción real usando la predictfunción.

    resulted<-predict(ml1,newdata=ExpData3)
Manos C
fuente
2

Para responder a mi propia pregunta, pasé a usar el paquete 'glmnet' para ajustar mis logits multinomiales, que tiene la ventaja adicional de usar el lazo o la red elástica para regularizar mis variables independientes. glmnet parece ser un paquete mucho más 'terminado' que mlogit, completo con una función 'predecir'.

Zach
fuente
1

mlogittiene una función de predicción, pero me resultó muy difícil de usar. Escribí mi propio conjunto de funciones muy feo para una implementación que tengo. Cualquiera puede usarlos o mejorarlos, almacenados en mi perfil de github .

Gregmacfarlane
fuente
0

Estoy bastante seguro de que esto se hace fácilmente con el paquete mlogit dado usando la función ajustada y luego la función de predicción estándar R. Como lo señalé chl, aunque todavía no lo he hecho yo mismo (al menos no lo he predicho), se muestra en las viñetas del paquete aquí en la página 29.

sim
fuente
1
La viñeta es engañosamente simple; en la práctica no pude entender cómo aplicar a nuevos datos. Entonces escribí mi propio código, vinculado a continuación.
gregmacfarlane