Постоянная вычислительная сингулярность в mlogit

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

Сначала немного о моих данных:

Мои данные касаются прогнозирования выбора в контексте спортивного драфта. Каждая команда делает упорядоченный выбор из одного и того же пула игроков с атрибутами команды и игрока. Таким образом, на языке mlogit каждая «команда» - это индивидуум, а каждый «игрок» - альтернатива. В качестве упрощенного примера, скажем, пять команд выбрали игрока.

Pick      Player  PPG  Age Team
1    Ben Simmons 19.2  19  PHI
2 Brandon Ingram 17.3  18  PHI
3   Jaylen Brown 14.6  19  PHI
5      Kris Dunn 16.4  21  PHI
6    Buddy Hield 25.0  22  PHI

Я пытаюсь использовать пакет mlogit. Сначала я использую mlogit.data для переформатирования своих данных.

Choices <- mlogit.data(test,
     choice="picked",
     shape="long",
     id.var="Team",
     alt.var="Player",
     chid.var="Team",
     varying=c(4:5))

Результат выглядит так:

                    picked Pick       Player  PPG  Age Team
PHI.Ben Simmons      TRUE    1    Ben Simmons 19.2  19  PHI
PHI.Brandon Ingram  FALSE    2 Brandon Ingram 17.3  18  PHI
PHI.Jaylen Brown    FALSE    3   Jaylen Brown 14.6  19  PHI
PHI.Kris Dunn       FALSE    5      Kris Dunn 16.4  21  PHI
PHI.Buddy Hield     FALSE    6    Buddy Hield 25.0  22  PHI
LAL.Brandon Ingram   TRUE    2 Brandon Ingram 17.3  18  LAL
LAL.Jaylen Brown    FALSE    3   Jaylen Brown 14.6  19  LAL
LAL.Kris Dunn       FALSE    5      Kris Dunn 16.4  21  LAL
LAL.Buddy Hield     FALSE    6    Buddy Hield 25.0  22  LAL
BOS.Jaylen Brown     TRUE    3   Jaylen Brown 14.6  19  BOS
BOS.Kris Dunn       FALSE    5      Kris Dunn 16.4  21  BOS
BOS.Buddy Hield     FALSE    6    Buddy Hield 25.0  22  BOS
MIN.Kris Dunn        TRUE    5      Kris Dunn 16.4  21  MIN
MIN.Buddy Hield     FALSE    6    Buddy Hield 25.0  22  MIN
NOP.Buddy Hield      TRUE    6    Buddy Hield 25.0  22  NOP

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

Затем я пытаюсь запустить условную логит-регрессию:

mlogit(Choices,picked ~ <regvar>,data=Choices)

Я неоднократно сталкиваюсь со следующей ошибкой:

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

Решение, которое я видел в другом месте, предлагает попытаться устранить необратимость путем удаления сильно коррелированных переменных. Однако это, похоже, не решает мою проблему. Проблема сохраняется с другим точным числом, даже в простых моделях с двумя переменными, таких как пример данных с низкими корреляциями (очевидно, с другим числом). Фактически, это происходит даже с одним регрессором!

Упрощенная версия того, что я пытаюсь сделать:

model<-mlogit(
  picked~PPG+Age,
  data=Choices)

Возможно, это просто проблема толерантности, но, учитывая, что эти переменные не особенно коррелированы, это было бы удивительно. Может показаться, что в этом виновато нечто более тонкое, чем корреляция переменных. Я также проверил и предоставил отдельные индивидуальные / альтернативные конкретные переменные. Например, добавление переменной для команды, такой как "Team_MSA_Size", ничего не меняет:

model<-mlogit(
  picked~PPG+Age|Team_MSA_Size,
  data=Choices)

Есть ли что-то в моей структуре данных или неправильное использование синтаксиса mlogit, что приводит к этому? Как мне это исправить?

Я нашел эту похожую тему, но я нашел у вас возникнут проблемы с отслеживанием без данных, о которых идет речь. Предполагает ли принятый ответ, что каждый вариант всегда должен иметь одинаковые точные альтернативы? Если так, то для меня это будет очень прискорбно, поскольку, очевидно, каждая команда видит свой список из-за того, что игроки удаляются путем выбора. Если проблема в этом, есть ли здесь простое решение, или это относится к сфере разработки кода вашей собственной оценки?

Я с радостью могу предоставить дополнительные данные или другие подробности, если они будут полезны.

РЕДАКТИРОВАТЬ: кто-то запросил данные игрушки. Вот csv с данными игрушки и приведенный ниже код, приводящий к ошибке.

setwd("Filepath")
library(mlogit)
toy_data <- read.csv("toy_data.csv",header = TRUE)
Choices_test<- mlogit.data(toy_data,
                       choice="picked",
                       shape="long",
                       id.var="Team",
                       alt.var="Pick",
                       chid.var="Team")
mlogit(picked~as.factor(Position)+as.factor(Black)+Age+PPG+APG+RPG+Team_WS,
     data=Choices_test)


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

person CRS1834    schedule 14.08.2017    source источник
comment
это кажется более подходящим для перекрестной проверки, поскольку это, скорее всего, статистическая проблема, а не проблема программирования.   -  person MichaelChirico    schedule 14.08.2017
comment
По моему опыту, это результат того, что некоторая переменная теряет вариативность в группе, когда она в достаточной степени обусловлена ​​- пробовали ли вы добавлять по одной переменной за раз, чтобы увидеть, когда она выходит из строя? если можете, изучите групповые вариации этой переменной более подробно.   -  person MichaelChirico    schedule 14.08.2017
comment
@MichaelChirico, если я правильно понимаю ваш вопрос, да, я изучил это. Проблема сохраняется, даже когда я включаю только одну правую переменную. Кажется, не имеет значения, что это за переменная. Универсальность ошибки - вот что заставляет меня думать, что это что-то связано с форматом данных / моим использованием синтаксиса mlogit, а не с необработанными данными.   -  person CRS1834    schedule 14.08.2017
comment
Похоже, у вас много повторяющихся записей. Разве это не предрасполагает вас к сингулярной матрице X?   -  person IRTFM    schedule 14.08.2017
comment
Я думаю, проблема в том, что все ваши варианты выбора уникальны и поэтому выбираются один раз и только один раз, поэтому для каждого уровня зависимой переменной существует только одна единица. Полиномиальный логит подходит, когда у вас есть набор вариантов, каждый из которых выбирается несколько раз при различных условиях.   -  person ulfelder    schedule 14.08.2017
comment
@ 42- да и нет. Там много почти идентичных строк, и если я попробую запустить его только с переменными, зависящими от игрока, будут такие же. Однако есть также атрибуты, специфичные для команды, и атрибуты для матчей между игроками. Включение этого означает, что никакие строки не будут точно дублироваться, по крайней мере, до тех пор, пока команда не выберет второй раз. Проблема сохраняется в подмножестве уникальных команд с этими переменными, поэтому точные дубликаты, похоже, не являются ответом.   -  person CRS1834    schedule 14.08.2017
comment
@ulfelder - именно это меня и интересовало. Есть ли аналогичная модель, для которой это не требуется?   -  person CRS1834    schedule 14.08.2017
comment
Ни одна модель не может учиться на совокупности уникальных результатов, потому что в этом сценарии нет закономерностей. Если вы можете сгруппировать варианты выбора (например, по позиции) или оценить их атрибуты (например, скорость, нападение или защита), то у вас есть то, чему модель может научиться.   -  person ulfelder    schedule 15.08.2017
comment
@ulfelder Я думаю, что один из нас неправильно понимает другого. Вы предполагаете, что я просто питаюсь их именами и результатами? Конечно, это не сработает, согласен! Но это неправда; У меня есть широкий набор переменных в правой части для каждого наблюдения. К ним относятся такие атрибуты игрока, как количество очков за игру, рост, вес и т. Д., Позиции игроков и характеристики командных матчей (то есть потребности каждой команды в позиции игроков). Таким образом, могут возникнуть определенные закономерности, и у меня нет проблем с запуском простой линейной модели по номеру выбора.   -  person CRS1834    schedule 15.08.2017
comment
По сути, результаты уникальны только в том смысле, что каждый игрок выбирается только один раз положительно, но не в том смысле, что он полностью своеобразный. Для меня загадка состоит в том, почему установка условного логита приводит к этой проблеме, когда, казалось бы, похожая установка lm (Pick ~ ‹regvars›, data = Choices) - нет.   -  person CRS1834    schedule 15.08.2017
comment
Подумайте об этом так: что касается вашей модели, выбор каждого игрока полностью предсказывается его атрибутами. Предикторы положительных результатов не меняются, потому что с каждым результатом связан только один набор значений предикторов. В этом случае логистическая регрессия (бинарная или полиномиальная) обычно терпит неудачу. Вы должны обобщить проблему, чтобы использовать здесь полиномиальный логит.   -  person ulfelder    schedule 15.08.2017


Ответы (1)


Если я выполнил условную логистическую регрессию с помощью функции из mlogit pkg, адаптированной к вашим переменным, как я их понимаю:

 Choices <- mlogit.data(data=test, choice="picked",
          chid.var="team",alt.var="pick",shape="long")

Ваш alt.var - "pick", и его нужно упорядочить, однозначно, без связей, поэтому в вашем случае это выглядит как 1: 6.

Если только я не понял ваш вопрос неправильно!

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

Привет еще раз,

Ваш синтаксис:

mlogit(picked~as.factor(Position)+as.factor(Black)+Age+PPG+APG+RPG+Team_WS,
     data=Choices_test)

из mlogit pkg, я давно не смотрел, но он не похож на синтаксис, который я использую для условной логистической регрессии.

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

Если вы уверены, что коллинеарность небольшая, то я предполагаю, что ваш синтаксис для модели настроен неправильно.

PS: ваш код бросает:

In file(file, "rt") :
  cannot open file 'toy_data.csv': No such file or directory

Я думаю, вам нужно заполнить toy_data.csv несколькими строками данных. Если ваши данные конфиденциальны, просто придумайте их (достаточно, чтобы продемонстрировать проблему).

person cousin_pete    schedule 15.08.2017
comment
Насколько я понимаю, это не должно иметь значения, основываясь на документации - номер выбора и имя игрока имеют одинаковую уникальную маркировку альтернатив. Поскольку каждый игрок представляет собой выбор, который команда гипотетически может выбрать, они представляют собой альтернативы. Использование выбора вместо этого означало бы простую перемаркировку, поскольку каждый номер выбора связан с уникальным игроком. Что-то в этом не так? - person CRS1834; 15.08.2017
comment
Кроме того, если я попытаюсь переключить это, это не изменит получаемое мной сообщение об ошибке, но изменит точное число обратных условий на небольшую величину. Это, казалось бы, наводит на мысль, что я, должно быть, ошибаюсь, полагая, что эти два эквивалента. - person CRS1834; 15.08.2017