2012-02-20 18 views
7

Sto usando il pacchetto mlogit con R.Come devo formattare i miei dati per il pacchetto Rogogit?

Dopo aver importato i miei dati utilizzando:

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

e chiamo:

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

Sto ottenendo il seguente errore:

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’ 

Qualche idea su come risolverlo? Esistono

I miei dati nel seguente formato in un file 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, 

risposta

5

La mia esperienza di mlogit è che non è molto indulgente sui dati che non è esattamente come dovrebbe essere.

Nel tuo caso, noto che il primo rispondente ha 6 alternative, mentre il secondo rispondente ha 7 alternative. Se si formattare i dati per avere un numero uguale di alternative per ogni intervistato il mlogit.data funzione funziona:

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) 

esecuzione mlogit su tutti i dati riproduce l'errore:

> 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' 

Tuttavia, la rimozione numero di riga 13, ossia il 7 alternativa, lavori:

> 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 

Naturalmente, questo non è molto soddisfacente, dal momento che distrugge alcuni dei dati. Una soluzione migliore è quella di costruire i dati in un formato che mlogit() si aspetta, e quindi chiamare mlogit() direttamente:

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 = ".") 

Ora i dati si presenta così:

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 

e si può chiamare mlogit() direttamente:

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

Risultato:

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

Grazie per il suggerimento ... È possibile però passare un insieme di dimensioni multiple di alternative? – JohnP

+2

La risposta è sì e no. Ho dato un'altra occhiata a 'mlogit.data' e il codice presuppone s che le alternative per ogni rispondente contengano il set completo. Questo è in parte il motivo per cui non uso mai 'mlogit.data', ma costruisco i dati lunghi del modulo da solo. La funzione 'mlogit' che si adatta al modello può gestire il tipo di dati che descrivi. – Andrie

+1

Puoi per piacere indicarmi un esempio? – JohnP

-1

JohnP,

Penso che la risposta che stai cercando è a maxabet. Dice:

"Se i lettori cercano di usare R per calcolare MLR che viene introdotto nel capitolo 6, potrebbe verificarsi il seguente messaggio di errore:

Errore in` row.names < -.data.frame ... (alcuni dati in seguito) riga duplicato '.nomi 'non sono ammessi

Questo errore è un problema della versione corrente di R (che è stata rilasciata nell'aprile 2011). L'MLR verrà eseguito solo se il numero di "righe" ("corridori" nel nostro caso) è lo stesso in ogni gara. Quindi uno dei modi è fare alcuni "cavalli finti" in modo che ogni razza abbia 14 corridori. I lettori possono invece attendere R per risolvere questo problema, oppure provare a scaricare una versione precedente (sto usando 2.9.1). "

Quindi penso che potresti usare una versione precedente di R o meglio ancora, riempire i dati esistenti con valori fittizi per completare ogni gara.Una cosa che farei è aggiungere una nuova variabile per" dimensione campo "per ogni Gettare i manichini, ma avere il numero corretto di corridori in una nuova colonna dovrebbe occuparsi di qualsiasi variazione di campo 1.

Ovviamente le risposte che otterrete saranno diverse dal libro che state leggendo, ma sarà un buon inizio per migliorare l'handicap :)

Problemi correlati