2012-02-20 8 views
7

używam pakiet mlogit R.Jak sformatować moje dane dla pakietu R mlogit?

Po zaimportowaniu moje dane przy użyciu:

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

i zadzwonić:

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

otrzymuję następujący błąd:

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’ 

Wszelkie pomysły, jak to naprawić? istnieje

moje dane w następującym formacie w pliku 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, 

Odpowiedz

5

mlogit Moje doświadczenie jest to, że nie jest bardzo wyrozumiały o danych, które nie jest dokładnie tak jak powinno być.

W twoim przypadku zauważam, że pierwszy respondent ma 6 alternatyw, podczas gdy drugi respondent ma 7 alternatyw. Jeśli formatowanie danych mają równą liczbę alternatyw dla każdego respondenta mlogit.data funkcja działa:

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) 

Running mlogit na wszystkie dane powiela błąd:

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

Jednak usunięcie numer wiersza 13, czyli 7 alternatywy, działa:

> 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 

Oczywiście nie jest to zbyt satysfakcjonujące, ponieważ niszczy niektóre dane. Lepszym rozwiązaniem jest zbudowanie dane w formacie, który mlogit() oczekuje, a następnie zadzwonić mlogit() bezpośrednio:

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

Teraz danych wygląda następująco:

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 

I można nazwać mlogit() bezpośrednio:

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

Wynik:

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

Dzięki za podpowiedź ... Czy możliwe jest przekazanie zestawu wielorakich alternatyw? – JohnP

+2

Odpowiedź brzmi "tak" i "nie." Przyjrzałem się "mlogit.data" i kod zakłada s że alternatywy dla każdego respondenta zawierają pełny zestaw. Jest to częściowo spowodowane tym, że nigdy nie używam 'mlogit.data', ale sam konstruuję długie dane. Funkcja 'mlogit' pasująca do modelu może poradzić sobie z typem danych, które opisujesz. – Andrie

+1

Czy możesz wskazać mi przykład? – JohnP

-1

JohnP,

Myślę, że odpowiedź szukasz jest maxabet. Mówi:

„Jeśli czytelnik spróbuje użyć do obliczenia MLR R, który jest wprowadzany w rozdziale 6, następujący komunikat o błędzie może wystąpić:

błąd w` row.names < -.data.frame ... (niektóre dane później) duplikat 'wiersza.nazwy "są niedozwolone"

Ten błąd jest związany z bieżącą wersją R (wydaną w kwietniu 2011 r.). MLR będzie działał tylko wtedy, gdy liczba "rzędów" ("biegaczy" w naszym przypadku) będzie taka sama w każdym wyścigu. Dlatego jednym ze sposobów jest robienie "fikcyjnych koni", aby każda rasa miała 14 biegaczy. Zamiast tworzyć dummy, czytelnicy mogą albo poczekać, aż R rozwiąże ten problem, albo spróbować pobrać wcześniejszą wersję (używam wersji 2.9.1). "

Sądzę, że możesz użyć starszej wersji R lub jeszcze lepszej, wypełnij istniejące dane wartościami pozorowanymi, aby ukończyć każdy wyścig. Jedną rzeczą, którą mógłbym zrobić, to dodać nową zmienną dla" rozmiaru pola "dla każdego Wrzucając manekiny, ale mając odpowiednią liczbę biegaczy w nowej kolumnie, należy zadbać o wariancję wielkości pola.

Oczywiście odpowiedzi, które otrzymasz będą inne od czytanej książki, ale będzie to dobry start na lepsze upośledzenie :)

Powiązane problemy