2012-02-20 19 views
7

estoy usando el paquete mlogit con R.¿Cómo debo formatear mis datos para el paquete R mlogit?

Después de importar mis datos usando:

t <-read.csv('junk.csv',header=TRUE, sep=",", dec=".") 

y llamo:

x <- mlogit.data(t,choice="D",shape="long",id.var="key",alt.var="altkey") 

estoy consiguiendo el error siguiente:

Error in `row.names<-.data.frame`(`*tmp*`, value = c("1.1", "1.2", "1.3", : 
    duplicate 'row.names' are not allowed 
In addition: Warning message: 
non-unique values when setting 'row.names': ‘1.1’, ‘1.2’, ‘1.3’, ‘1.4’, ‘1.5’, ‘1.6’ 

¿Alguna idea de cómo solucionarlo? Existen

Mis datos en el siguiente formato en un archivo csv:

[junk.csv]

key,altkey,A,B,C,D 
201005131,1,2.6,118.17,117,0 
201005131,2,1.4,117.11,115,0 
201005131,3,1.1,117.38,122,1 
201005131,4,24.6,,122,0 
201005131,5,48.6,91.90,122,0 
201005131,6,59.8,,122,0 
201005132,1,20.2,118.23,113,0 
201005132,2,2.5,123.67,120,1 
201005132,3,7.4,116.30,120,0 
201005132,4,2.8,118.86,120,0 
201005132,5,6.9,124.72,120,0 
201005132,6,2.5,123.81,120,0 
201005132,7,8.5,119.23,115, 

Respuesta

5

Mi experiencia de mlogit es que no es muy indulgente sobre datos que no es exactamente como debe ser.

En su caso, veo que el primer encuestado tiene 6 alternativas, mientras que el segundo responde 7 alternativas. Si dar formato a los datos para tener un número igual de alternativas para cada encuestado la mlogit.data función funciona:

dat <- read.table(sep=",",text=" 
key,altkey,A,B,C,D 
201005131,1, 2.6,118.17,117,0 
201005131,2,1.4,117.11,115,0 
201005131,3,1.1,117.38,122,1 
201005131,4,24.6,,122,0 
201005131,5,48.6,91.90,122,0 
201005131,6,59.8,,122,0 
201005132,1,20.2,118.23,113,0 
201005132,2,2.5,123.67,120,1 
201005132,3,7.4,116.30,120,0 
201005132,4,2.8,118.86,120,0 
201005132,5,6.9,124.72,120,0 
201005132,6,2.5,123.81,120,0 
201005132,7,8.5,119.23,115,0 
", header=TRUE) 

Correr mlogit de todos los datos reproduce el error:

> mlogit.data(dat, choice="D", shape="long", id.var="key", alt.var="altkey") 
Error in `row.names<-.data.frame`(`*tmp*`, value = c("1.1", "1.2", "1.3", : 
    duplicate 'row.names' are not allowed 
In addition: Warning message: 
non-unique values when setting 'row.names': '1.1', '1.2', '1.3', '1.4', '1.5', '1.6' 

Sin embargo, la eliminación de número de línea 13, es decir, la séptima alternativa, las obras:

> mlogit.data(dat[-13, ], choice="D", shape="long", id.var="key", alt.var="altkey") 
      key altkey A  B C  D 
1.1 201005131  1 2.6 118.17 117 FALSE 
1.2 201005131  2 1.4 117.11 115 FALSE 
1.3 201005131  3 1.1 117.38 122 TRUE 
1.4 201005131  4 24.6  NA 122 FALSE 
1.5 201005131  5 48.6 91.90 122 FALSE 
1.6 201005131  6 59.8  NA 122 FALSE 
2.1 201005132  1 20.2 118.23 113 FALSE 
2.2 201005132  2 2.5 123.67 120 TRUE 
2.3 201005132  3 7.4 116.30 120 FALSE 
2.4 201005132  4 2.8 118.86 120 FALSE 
2.5 201005132  5 6.9 124.72 120 FALSE 
2.6 201005132  6 2.5 123.81 120 FALSE 

Por supuesto, esto no es muy satisfactorio, ya que destruye algunos de los datos. Una mejor solución es la construcción de los datos en un formato que mlogit() espera, y luego llamar a mlogit() directamente:

dat$key <- factor(as.numeric(as.factor(dat$key))) 
dat$altkey <- as.factor(dat$altkey) 
dat$D <- as.logical(dat$D) 
row.names(dat) <- paste(dat$key, dat$altkey, sep = ".") 

Ahora los datos se parece a esto:

key altkey A  B C  D 
1.1 1  1 2.6 118.17 117 FALSE 
1.2 1  2 1.4 117.11 115 FALSE 
1.3 1  3 1.1 117.38 122 TRUE 
1.4 1  4 24.6  NA 122 FALSE 
1.5 1  5 48.6 91.90 122 FALSE 
1.6 1  6 59.8  NA 122 FALSE 
2.1 2  1 20.2 118.23 113 FALSE 
2.2 2  2 2.5 123.67 120 TRUE 
2.3 2  3 7.4 116.30 120 FALSE 
2.4 2  4 2.8 118.86 120 FALSE 
2.5 2  5 6.9 124.72 120 FALSE 
2.6 2  6 2.5 123.81 120 FALSE 
2.7 2  7 8.5 119.23 115 FALSE 

y se puede llamar mlogit() directamente:

mlogit(D ~ A + B + C, dat, 
     chid.var = "key", 
     alt.var = "altkey", 
     choice = "D", 
     shape = "long") 

Resultado:

Call: 
mlogit(formula = D ~ A + B + C, data = dat, chid.var = "key",  alt.var = "altkey", choice = "D", shape = "long", method = "nr",  print.level = 0) 

Coefficients: 
2:(intercept) 3:(intercept) 4:(intercept) 5:(intercept) 6:(intercept) 
     10.7774   4.8129   5.2257  -17.2522  -7.7364 
7:(intercept)    A    B    C 
     10.0389   1.6010   2.7156   2.9888 
+0

Gracias por la pista ... ¿Es posible pasar un conjunto de alternativas de varios tamaños? – JohnP

+2

La respuesta es sí y no. Volví a mirar 'mlogit.data' y el código asume s que las alternativas para cada encuestado contienen el conjunto completo. Esto es en parte por lo que nunca uso 'mlogit.data', sino que construyo los datos de forma larga yo mismo. La función 'mlogit' que se ajusta al modelo puede tratar con el tipo de datos que describe. – Andrie

+1

¿Podría indicarme un ejemplo? – JohnP

-1

JohnP,

creo que la respuesta que buscas está en maxabet. Dice:

"Si los lectores tratan de utilizar R para calcular MLR que se introduce en el capítulo 6, se puede producir el siguiente mensaje de error:

error en` row.names < -.data.frame ... (algunos datos después) fila duplicada.No se permiten los nombres de

Este error es un problema de la versión actual de R (que lanzó en abril de 2011). El MLR se ejecutará solo si el número de 'filas' ('corredores' en nuestro caso) es el mismo en todas las carreras. Por lo tanto, una de las maneras es hacer algunos 'caballos ficticios' para que cada raza tenga 14 corredores. En lugar de crear corredores falsos, los lectores pueden esperar a que R resuelva este problema, o intentar descargar una versión anterior (estoy usando 2.9.1). "

Así que supongo que podría utilizar una versión anterior de R o aún mejor, completar los datos existentes con valores ficticios para completar cada carrera. Una cosa que haría es agregar una nueva variable para" tamaño de campo "para cada raza. Al tirar muñecos, pero tener el número correcto de corredores en una nueva columna debería ocuparse de cualquier variación de tamaño de campo.

Obviamente, las respuestas que obtenga serán diferentes al libro que está leyendo, pero será una buen comienzo para una mejor desventaja :)

Cuestiones relacionadas