#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.