Как мне отформатировать мои данные для пакета R mlogit? - PullRequest
7 голосов
/ 20 февраля 2012

Я использую пакет mlogit с R.

После импорта моих данных, используя:

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

и звоните:

x <- mlogit.data(t,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’

Есть идеи как это исправить?

Мои данные существуют в следующем формате в 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,

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012

Мой опыт работы с mlogit заключается в том, что он не слишком прост, что данные не точно такими, какими они должны быть.

В вашем случае я заметил, что у первого респондента есть 6 вариантов, а у второго респондента - 7 вариантов. Если вы отформатируете свои данные, чтобы у каждого респондента было одинаковое количество альтернатив, сработает функция mlogit.data:

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)

Запуск mlogit на всех данных воспроизводит ошибку:

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

Однако удаление строки № 13, то есть 7-й альтернативы, работает:

> 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

Конечно, это не очень удовлетворительно, поскольку уничтожает некоторые данные. Лучшее решение - построить данные в формате, ожидаемом mlogit(), а затем вызвать mlogit() напрямую:

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

Теперь данные выглядят так:

    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

И вы можете позвонить mlogit() напрямую:

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

Результат:

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 голосов
/ 01 мая 2012

JohnP,

Я думаю, что вы ищете ответ на maxabet .В нем говорится:

"Если читатели пытаются использовать R для вычисления MLR, что представлено в главе 6, может появиться следующее сообщение об ошибке:

Ошибка в` row.names <-. Data.frame ... (некоторые данные впоследствии) дубликаты 'row.names' не допускаются </p>

Эта ошибка является проблемой текущей версии R (выпущенной в апреле 2011 г.). MLR будет работать только если число«строк» ​​(в нашем случае «бегунов») одинаков в каждой гонке, поэтому одним из способов является создание «фиктивных лошадей», чтобы в каждой гонке было по 14 бегунов. Вместо того, чтобы делать фиктивных бегунов, читатели могут либо ждатьR, чтобы решить эту проблему, или попробуйте как-нибудь скачать более раннюю версию (я использую 2.9.1). "

Так что я думаю, что вы могли бы использовать более старую версию R или еще лучше, заполнить существующие данныес фиктивными значениями для завершения каждой гонки.Одна вещь, которую я хотел бы сделать, это добавить новую переменную для «размера поля» для каждой расы.При добавлении манекенов, но при наличии правильного количества бегунов в новом столбце следует учитывать любые отклонения размера поля.

Очевидно, что ответы, которые вы получите, будут отличаться от книги, которую вы читаете, но это будет хорошим началом для улучшения гандикапа:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...