Почему ошибка сингулярности в модели случайных параметров DCE — mlogit — возникает из-за отказа/отказа от покупки?

Я работаю над экспериментом с дискретным выбором со следующими характеристиками: 3 альтернативы, включая 1 отказ. Каждая из двух альтернатив имеет 3 атрибута, каждый из которых имеет 3 уровня факторов. Каждому респонденту предлагается выполнить 6 заданий на выбор. Все 3 параметра (альтернативы) были закодированы по типу эффектов.

Я хотел бы создать модель компонентов ошибки со случайным параметром без покупки/отказа в качестве перехвата. Однако это дает сингулярную ошибку при использовании пакета «mlogit». Кто-нибудь может дать совет, как с этим бороться?

Создание модели со случайными параметрами:

rpm1 <- mlogit(choice ~ 0 + Prot + Carb + Price, data=ce,
               rpar = c(Prot = "n", Carb = "n", Price = "n"), panel = TRUE,
               correlation = TRUE, R = 10, Halton = TRUE)

Пример данных (в длинном формате):

    id ques choice alti     Prot Carb Price NoBuy
1  26    1  FALSE    1     Meat    B    20     0
2  26    1  FALSE    2      Veg    A    20     0
3  26    1   TRUE    3 NoBurger    0     0     1
4  26    2  FALSE    1     Meat    C    10     0
5  26    2  FALSE    2  Poultry    A    10     0
6  26    2   TRUE    3 NoBurger    0     0     1
7  26    3  FALSE    1  Poultry    C     5     0
8  26    3   TRUE    2     Meat    B    20     0
9  26    3  FALSE    3 NoBurger    0     0     1
10 26    4  FALSE    1  Poultry    A    20     0
11 26    4  FALSE    2      Veg    B     5     0
12 26    4   TRUE    3 NoBurger    0     0     1
13 26    5  FALSE    1      Veg    B    10     0
14 26    5  FALSE    2     Meat    C    10     0
15 26    5   TRUE    3 NoBurger    0     0     1
16 26    6  FALSE    1      Veg    A     5     0
17 26    6  FALSE    2  Poultry    B     5     0
18 26    6   TRUE    3 NoBurger    0     0     1
19 30    1   TRUE    1     Meat    B    20     0
20 30    1  FALSE    2      Veg    A    20     0

person Ieben    schedule 30.11.2019    source источник


Ответы (2)


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

Ошибка сингулярности означает, что ваша матрица Гессе не может быть инвертирована, то есть вы не можете получить свои стандартные ошибки. Скорее всего, это вызвано тем, что ваша модель слишком конкретизирована или у вас недостаточно вариаций в ваших данных.

Вы можете попробовать этот модельный вызов:

rpm1 <- mlogit(choice ~ Price + Prot + Carb + NoBuy |-1, data=ce,
               rpar = c(Prot = "n", Carb = "n", Price = "n"), panel = TRUE,
               correlation = TRUE, R = 10, Halton = TRUE)

Я добавил NoBuy в вашу служебную функцию, и она будет вычисляться и работать как перехват. Я также добавил |-1, который удалит любые другие перехваты. Вы можете только оценить максимум J-1, где J равно количеству альтернатив. Если вы попытаетесь оценить все J, ваша модель потерпит неудачу.

Несколько других вещей, чтобы отметить. Количество розыгрышей очень и очень мало. Вам будет сложно добиться сходимости модели, и ваши результаты не будут иметь большого значения. correlation = TRUE — это полностью определенный смешанный логит, в котором оцениваются все недиагональные элементы нижней матрицы Холецкого. Это очень сложная модель, и ее может быть трудно оценить, если у вас недостаточно данных. Наконец, я бы тщательно подумал об использовании нормально распределенного ценового параметра, учитывая, что вы не можете оценить показатели благосостояния на основе такой модели.

person edsandorf    schedule 30.11.2019
comment
Я попробовал вашу рекомендацию добавить +NoBuy | -1, но все равно получаю ошибку сингулярности. Возможно ли, что гессиан не может быть инвертирован в результате корреляции между несколькими параметрами? Поскольку я получаю эту ошибку сингулярности, когда аргумент correlation = TRUE включен или опущен. Если да, можно ли внести какие-либо улучшения в кодирование для устранения корреляций? Что касается количества розыгрышей, я с вами согласен. Это было просто, чтобы получить быструю оценку, чтобы увидеть, работает ли спецификация модели и т. Д. То же самое и с распределением цен, оно действительно не должно распределяться нормально. - person Ieben; 01.12.2019
comment
Сходится ли ваша модель MNL с этой спецификацией? Вы всегда должны тестировать свои модели с полным числом розыгрышей. Вы пытаетесь аппроксимировать многомерный интеграл, который представляет собой смешанную логит-вероятность. Использование только 10 розыгрышей даст вам очень плохое приближение. - person edsandorf; 02.12.2019
comment
Да, моя модель MNL сходится. Он указывается следующим образом: mnl1 <- mlogit(choice ~ 0 + Prot + Carb + Price + NoBuy, data=ce) . - person Ieben; 03.12.2019
comment
Итак, мы знаем, что спецификация будет сходиться. Чтобы продолжить тестирование, я бы сделал следующее: 1) использовал синтаксис mlogit, чтобы убедиться, что констант там нет, то есть choice ~ Price + Prot + Carb + NoBuy | - 1. 2) Пусть Price будет первым в вашей служебной функции. Это улучшает стабильность, особенно когда у вас есть correlation = TRUE. 3) Начните с correlation = FALSE и только одной случайной переменной, используя больше розыгрышей, например. R = 1000. 4) Если шаг 3 выполнен успешно, добавьте еще одну случайную величину. Это должно позволить вам определить, когда ваша модель дает сбой. - person edsandorf; 03.12.2019

Я считаю, что столкнулся с той же проблемой, что и здесь: Включение отказа в качестве альтернативной конкретной константы в R Mlogit

Когда я кодирую свою фиктивную переменную для NoBuy, как в примере, я все еще получаю проблему, связанную с сингулярностью. Фиктивное значение для отказа NoBuy равно 1, если выбран этот вариант, и принимает значение -1, если выбран вариант A или B. (Если я назначу значение 0 манекену отказа, когда выбран вариант A или B, как в кадре данных выше, я получаю ту же проблему.) А именно, Warning message: In sqrt(diag(vcov(object))) : NaNs produced

Правильна ли кодировка типов эффектов для атрибутов и фиктивного элемента NoBuy?

Вот пример моего кодирования эффектов (всегда с использованием уровня атрибута отказа в качестве ссылки):

contrasts(ce_long$Prot) Meat Poultry Veg Meat 1 0 0 Poultry 0 1 0 Veg 0 0 1 NoBurger -1 -1 -1

contrasts(ce_long$Carb) A B C A 1 0 0 B 0 1 0 C 0 0 1 0 -1 -1 -1

contrasts(ce_long$Price) 10 20 5 10 1 0 0 20 0 1 0 5 0 0 1 0 -1 -1 -1

person Ieben    schedule 03.12.2019