Короче говоря:
Мне нужно запустить полиномиальную логит-регрессию с индивидуальными и фиксированными по времени эффектами в R. Я думал, что мог бы использовать пакеты mlogit
и survival
для этой цели, ноЯ не могу найти способ включить фиксированные эффекты.
Теперь длинная история:
Я нашел много вопросов по этой теме на различных веб-сайтах, связанных со стеком, но ни один из них не смог предоставитьответ.Кроме того, я заметил много недоразумений относительно того, что такое полиномиальная логит-регрессия с фиксированными эффектами (люди используют разные имена), и относительно пакетов R, реализующих эту функцию.Поэтому я думаю, что было бы полезно предоставить некоторую предысторию, прежде чем перейти к сути.В вопросе с несколькими вариантами ответов каждый респондент выбирает один вариант.Респондентам задают один и тот же вопрос каждый год.Не существует априори относительно степени, в которой выбор в момент времени t зависит от выбора в момент времени t-1.Теперь представьте, что панель данных записывает эти варианты.Данные выглядят так:
set.seed(123)
# number of observations
n <- 100
# number of possible choice
possible_choice <- letters[1:4]
# number of years
years <- 3
# individual characteristics
x1 <- runif(n * 3, 5.0, 70.5)
x2 <- sample(1:n^2, n * 3, replace = F)
# actual choice at time 1
actual_choice_year_1 <- possible_choice[sample(1:4, n, replace = T, prob = rep(1/4, 4))]
actual_choice_year_2 <- possible_choice[sample(1:4, n, replace = T, prob = c(0.4, 0.3, 0.2, 0.1))]
actual_choice_year_3 <- possible_choice[sample(1:4, n, replace = T, prob = c(0.2, 0.5, 0.2, 0.1))]
# create long dataset
df <- data.frame(choice = c(actual_choice_year_1, actual_choice_year_2, actual_choice_year_3),
x1 = x1, x2 = x2,
individual_fixed_effect = as.character(rep(1:n, years)),
time_fixed_effect = as.character(rep(1:years, each = n)),
stringsAsFactors = F)
Я новичок в такого рода анализе.Но если я правильно понимаю, если я хочу оценить влияние характеристик респондентов на их выбор, я могу использовать полиномиальную логит-регрессию.
Чтобы воспользоваться преимуществами продольной структуры данных, я хочувключить в мою спецификацию индивидуальные и фиксированные по времени эффекты.
Насколько мне известно, полиномиальная логит-регрессия с фиксированными эффектами была впервые предложена Чемберленом (1980, Обзор экономических исследований 47: 225-238).Недавно пользователям Stata были предоставлены процедуры для реализации этой модели (femlogit).
В виньетке пакета femlogit автор ссылается на функцию R clogit
в пакете survival
.
Согласно странице справки, clogit
требует переупорядочения данных в другом формате:
library(mlogit)
# create wide dataset
data_mlogit <- mlogit.data(df, id.var = "individual_fixed_effect",
group.var = "time_fixed_effect",
choice = "choice",
shape = "wide")
Теперь, если я правильно понимаю, как работает clogit
, фиксированные эффекты могут бытьпрошел через функцию strata
(дополнительные сведения см. в этом руководстве ).Однако, я боюсь, что мне не ясно, как использовать эту функцию, так как никакие значения коэффициентов не возвращаются для отдельных характеристических переменных (т.е. я получаю только NAs
).
library(survival)
fit <- clogit(formula("choice ~ alt + x1 + x2 + strata(individual_fixed_effect, time_fixed_effect)"), as.data.frame(data_mlogit))
summary(fit)
Поскольку яне смог найти причину для этого (должно быть что-то, чего мне не хватает в способе оценки этих функций), я искал решение с использованием других пакетов в R: например, glmnet
, VGAM
, nnet
, globaltest
и mlogit
.
Только последние, кажется, в состоянии явно иметь дело со структурами панелей, используя соответствующую стратегию оценки.По этой причине я решил попробовать.Тем не менее, я смог запустить регрессию полиномиального логита без фиксированных эффектов.
# state formula
formula_mlogit <- formula("choice ~ 1| x1 + x2")
# run multinomial regression
fit <- mlogit(formula_mlogit, data_mlogit)
summary(fit)
Если я правильно понимаю, как работает mlogit
, вот что я сделал.
ИспользуяФункция mlogit.data
, я создал набор данных, совместимый с функцией mlogit
.Здесь я также указал идентификатор каждого человека (id.var = individual_fixed_effect
) и группу, к которой он принадлежит (group.var = "time_fixed_effect"
).В моем случае группа представляет наблюдения, зарегистрированные в том же году.
Моя формула указывает, что нет никаких переменных, связанных с конкретным выбором, и которые случайным образом распределяются между отдельными лицами (то есть переменными перед |
).В отличие от этого, выбор мотивируется только индивидуальными характеристиками (например, x1
и x2
).
С помощью функции mlogit
указывается, что можно использовать аргумент panel
.использовать методы панели.Чтобы установить panel = TRUE
, я здесь.
Проблема в том, что panel
можно установить на TRUE
, только если другой аргумент mlogit
, то есть rpar
, не NULL
.
Аргумент rpar
используется для указания распределения случайных величин: то есть переменных до |
.ThПроблема в том, что поскольку в моем случае этих переменных не существует, я не могу использовать аргумент rpar
и затем установить panel = TRUE
.
Интересный вопрос, связанный с этим: здесь . Было дано несколько предложений, и один, кажется, идет в моем направлении. К сожалению, нет примеров, которые я могу воспроизвести, и я не понимаю, как следовать этой стратегии, чтобы решить мою проблему.
Более того, я не особо заинтересован в использовании mlogit
, для меня подойдет любой эффективный способ выполнения этой задачи (например, я согласен с survival
или другими пакетами).
Знаете ли вы какое-либо решение этой проблемы?
Два предостережения для тех, кто заинтересован в ответе:
- Меня интересуют фиксированные эффекты, а не случайные эффекты. Однако, если вы считаете, что нет другого способа воспользоваться продольной структурой моих данных в R (она действительно есть в Stata, но я не хочу ее использовать), пожалуйста, не стесняйтесь поделиться своим кодом.
- Я не заинтересован в переходе на Байесовский. Поэтому, если возможно, не предлагайте такой подход.