Как запустить полиномиальную логит-регрессию с индивидуальными и фиксированными по времени эффектами в R - PullRequest
0 голосов
/ 21 января 2019

Короче говоря:

Мне нужно запустить полиномиальную логит-регрессию с индивидуальными и фиксированными по времени эффектами в 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 или другими пакетами).

Знаете ли вы какое-либо решение этой проблемы?

Два предостережения для тех, кто заинтересован в ответе:

  1. Меня интересуют фиксированные эффекты, а не случайные эффекты. Однако, если вы считаете, что нет другого способа воспользоваться продольной структурой моих данных в R (она действительно есть в Stata, но я не хочу ее использовать), пожалуйста, не стесняйтесь поделиться своим кодом.
  2. Я не заинтересован в переходе на Байесовский. Поэтому, если возможно, не предлагайте такой подход.
...