Ошибка с уровнями, использующими mlogit в R

#r #levels

#r #уровни

Вопрос:

У меня возникли некоторые проблемы с уровнями… Запускаем следующее:

 library(mlogit)

panel.datasm = data.frame(
    cbind( 
        round(runif(100, min=1, max=6)), 
        rep(1:20,each=5), runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6) , 
        runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6)  ))
names(panel.datasm) = c("choice", "id", "data_1991","data_1992",
  "data_1993", "data2_1991", "data2_1992","data2_1993") 


logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
    varying= 3:5, shape = "wide", sep = "_")
  

Продолжайте получать ошибку Error in Ops.factor(data[[choice]], alt) : level sets of factors are different

Я также пробовал назначать уровни вручную:

 panel.datasm$id= factor(
    panel.datasm$id, 
    levels = sort(as.character(unique(panel.datasm$id)))  )
  

Я перепробовал несколько вещей и не могу понять, что происходит не так. Для сравнения взгляните на :

 data("Electricity", package = "mlogit")
head(Electricity)
Electr <- mlogit.data(Electricity, id = "id", choice = "choice", 
    varying = 3:26, shape = "wide", sep = "")
  

Который, насколько я могу судить, идентичен моему формату данных. Что здесь происходит? Я на грани срыва.

Комментарии:

1. Мне никогда не удавалось заставить работать автоматическую перестройку mlogit . В результате я прибегнул к ручному изменению формы своих данных, чтобы создать требуемый длинный формат. Удачи.

2. PS. Спасибо, что задали этот вопрос. Я попытался понять mlogit вскоре после начала изучения R. Я не смог определить начало или конец кода. Насколько я могу судить, код работает и алгоритмически корректен, но с точки зрения пользователя не особенно надежен. Ваш вопрос побудил меня снова провести исследование mlogit .

3. Возможно, вы также хотите провести различие между data и data2 с varying= c(data=3:5, data2=6:8)

4. Спасибо за всю помощь. Я попробую все это сейчас!

Ответ №1:

Я полагаю, что я отследил проблему. Ваши choice переменные и your alternative variables должны быть одинаковыми.

Если вы измените свой первый столбец, data.frame чтобы в нем были значения между 1991:1993 , это сработает.

 panel.datasm = data.frame(
    cbind( 
        sample(1991:1993, 100, replace=TRUE), 
        rep(1:20,each=5), runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6) , 
        runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6)  ))
names(panel.datasm) = c("choice", "id", "data_1991","data_1992",
    "data_1993", "data2_1991", "data2_1992","data2_1993") 


logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
    varying= 3:5, shape = "wide", sep = "_") 
  

Результаты:

 head(logit.data)
       choice id  alt       data     data2 chid
1.1991  FALSE  1 1991 0.03540498 0.9726110    1
1.1992  FALSE  1 1992 5.85285278 2.7973798    1
1.1993   TRUE  1 1993 5.80795641 3.7360297    1
2.1991   TRUE  1 1991 0.59255235 0.2564928    2
2.1992  FALSE  1 1992 5.81443351 3.0820215    2
2.1993  FALSE  1 1993 2.11699854 5.4161634    2
  

Если вы теперь сравните это с Electricity , разница очевидна. Обратите внимание, что варианты есть 1:4 , и каждая альтернатива варьируется от 1 до 4.

 head(Electricity)
  choice id pf1 pf2 pf3 pf4 cl1 cl2 cl3 cl4 loc1 loc2 loc3 loc4 wk1 wk2 wk3 wk4
1      4  1   7   9   0   0   5   1   0   5    0    1    0    0   1   0   0   1
2      3  1   7   9   0   0   0   5   1   5    0    0    1    0   1   1   0   0
3      4  1   9   7   0   0   5   1   0   0    0    0    0    1   0   1   1   0
4      4  1   0   9   7   0   1   1   0   5    0    0    1    0   1   0   0   1
5      1  1   0   9   0   7   0   1   0   5    1    0    0    0   0   1   0   1
6      4  1   0   9   0   7   0   0   1   5    0    0    1    0   0   0   0   1
  

Комментарии:

1. Спасибо, ребята. Это было полезно. Мой набор данных странный в том, что переменные не меняются в зависимости от выбора. Но это прояснило, что происходит. Я думаю, теперь это сработает!

2. обратите внимание, что аргумент variating в первом примере должен быть 3: 8, а не 3: 5

Ответ №2:

Проблема в том, что уровни, row.names созданные reshape , не уникальны, и это вызывает проблемы. Вот быстрое исправление. Вам нужно добавить chid.var , который был бы уникальным для каждой строки. Для этого я использовал index функцию из zoo . Я полагаю, вы можете использовать и другие способы.

 mlogit.data(panel.datasm, choice = 'choice', id = 'id', shape = 'wide', 
 varying = 3:8, sep = "_", chid.var = 1:NROW(index))

        choice id  alt     data      data2
1.1991  FALSE  1 1991 0.4769187 0.97381645
1.1992  FALSE  1 1992 3.2998748 0.70989021
1.1993  FALSE  1 1993 5.6199917 5.53069555
2.1991  FALSE  1 1991 0.3615670 0.02066214
2.1992  FALSE  1 1992 2.0461820 0.41804600
2.1993  FALSE  1 1993 2.2764992 3.93337758
  

Комментарии:

1. Это преодолевает первое препятствие, но я думаю, что приведет к ложным результатам модели. Обратите внимание, что значение choice теперь всегда FALSE , тогда как оно должно быть TRUE, когда выбор респондента соответствует этой альтернативе (т.Е. строке в data.frame ).

2. PS. Приношу извинения за то, что я удалил свой первый комментарий — это, вероятно, приводит к путанице. Я написал комментарий, затем начал сомневаться, прав ли я. Затем проверил мои предположения и опубликовал новый комментарий. Извините.

Ответ №3:

Ошибка исходит из пакета reshape. Не удается определить элемент времени при преобразовании данных.

Справочное руководство по mlogit?mlogit.data предоставляет решение этой проблемы в опции «alt.levels», указав: «название альтернатив: если null, для широкого фрейма данных они угадываются по именам переменных и переменной выбора (оба должны быть одинаковыми)».

Поскольку вы не указываете имена альтернатив, reshape угадывает и не может их определить. Тогда исправление заключается в том, чтобы вручную указать эти имена. Оставляя данные, как указано в вопросе, вы используете следующее:

 logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
                      varying= 3:8, shape = "wide", sep = "_",
                      alt.levels = c("data_1991","data_1992","data_1993", "data2_1991", "data2_1992", "data2_1993"))
  

* Примечание: Как упоминалось @James, вы должны отличаться от 3: 8, А не 3: 5.