Как решить ошибку mlogit в файле resolve.default (H, g [! Fixed]): система является единственной в вычислительном отношении: обратное число условия = 3.03549e-18?

У меня есть данные в широком формате, я звоню mlogit.data И я попытался реализовать смешанную модель логита с использованием пакета mlogit, у меня есть одна горячая кодировка категориальных столбцов (цвет, размер_группы). Это вызывает ошибку ниже?

числовые признаки в model_data преобразуются в log1p.

Complete.choice <- mlogit.data(model_data, choice = "y", 
                                 varying = 2:79, shape = "wide", sep = "__", id = "customer_id")
formula <- as.formula("y ~ price + weight + length + height + width + color_white + 
                    color_red + color_black + size_group_1 + size_group_3 + size_group_5 + 
                     size_group_4 + size_group_2 | -1")

# rpar
 features <- c("price","weight","length","height","width","color_white",
              "color_red","color_black" ,"size_group_1",
              "size_group_3","size_group_5","size_group_4","size_group_2" )
random_parameter <- rep("n", 1:length(features))
names(random_parameter) <- features

sample.mxl <- mlogit(formula, Complete.choice , rpar = random_parameter, 
                       R = 40, halton = NA, panel = TRUE, seed = 123, print.level = 0)

Error in solve.default(H, g[!fixed]) : 
  system is computationally singular: reciprocal condition number = 3.23485e-18

person Yashwanth    schedule 29.05.2020    source источник
comment
Поделитесь воспроизводимым примером, поэтому предоставьте несколько образцов данных .   -  person Martin Gal    schedule 29.05.2020


Ответы (1)


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

Это может произойти по нескольким причинам:

  1. У вас недостаточно вариаций в ваших данных, чтобы идентифицировать модель. Вы пытаетесь оценить один очень сложный объект, который потребует много от ваших данных (вариаций и наблюдений).
  2. Модель завышена (вы сделали правильную нормализацию?)
  3. Вы оцениваете 13 случайных параметров, что требует много от ваших данных. Я бы начал с одного случайного параметра и постепенно увеличивал бы его, чтобы увидеть, когда ваша модель не работает. Кроме того, с более чем 4-5 случайными параметрами вы не должны использовать отрисовки Halton, но вам потребуется некоторая процедура скремблирования. Я бы порекомендовал взломанные дро Соболя, тиражи MLHS или взломанные дро Халтона.
  4. Вы используете только R=40. Это очень низкий показатель. Это даст плохую аппроксимацию многомерного интеграла, который представляет собой вероятность смешанного логита. Количество необходимых розыгрышей увеличивается в зависимости от сложности модели, доступных альтернатив и т. Д. Многие люди думают, что 500–1000 - это хорошо, в то время как другие склонны использовать 5000 или выше. Я начинаю с 1000 и постепенно увеличиваю до стабилизации моих параметров. Слишком мало розыгрышей также может вызвать ошибку, которую вы видите.

Невозможно диагностировать причину, не проверяя фактические данные, но это, по крайней мере, некоторые подсказки, с которых можно начать.

person edsandorf    schedule 29.05.2020
comment
Спасибо за объяснение. Как добавить категориальные функции в модель mlogit? Нужен ли мне One Hot encode? - person Yashwanth; 29.05.2020
comment
Я не слишком знаком с пакетом mlogit, но вы, вероятно, можете включить их в качестве факторных переменных в формулу модели. Я бы сказал, что самым безопасным является их фиктивный код, потому что это дает вам полный контроль над тем, какая категория исключена для идентификации. - person edsandorf; 29.05.2020
comment
Например, вы можете оценить только альтернативные конкретные константы J-1, или, если у вас есть категориальная переменная, которую вы превратили в фиктивные, вам нужно опустить одну категорию / фиктивную переменную или, говоря иначе, нормализовать / исправить один параметр до нуля. Если вы этого не сделаете, у вас будет идеальная мультиколлинеарность. - person edsandorf; 31.05.2020