Установить приоры для нескольких предикторов в rstanarm?

Я немного запутался в том, как установить априоры для нескольких предикторов для следующей модели:

require(rstanarm)

wi_prior <- normal(0, sd(train$attendance))
SEED     <- 101

fmla <- attendance ~ (1 + W + W1 + W2 + W3 + DivWin1 + DivWin2 + DivWin3 + 
                      WSWin1 | franchID)

baylm <- stan_glmer(fmla, 
                    data = train, 
                    family = "gaussian", 
                    algorithm = "sampling",
                    adapt_delta = .95,
                    prior_intercept = wi_prior, seed = SEED)

Вот первое наблюдение в поезде, по запросу.

train <- structure(list(franchID = structure(25L, .Label = c("ANA", "ARI", 
                                                             "ATL", "BAL", "BOS", "CHC", "CHW", "CIN", "CLE", "COL", "DET", 
                                                             "FLA", "HOU", "KCR", "LAD", "MIL", "MIN", "NYM", "NYY", "OAK", 
                                                             "PHI", "PIT", "SDP", "SEA", "SFG", "STL", "TBD", "TEX", "TOR", 
                                                             "WSN"), class = "factor"), yearID = 1999L, name = "San Francisco Giants", 
                        park = "3Com Park", attendance = 2078399L, W = 86L, W1 = 89L, 
                        W2 = 90L, W3 = 68L, WCWin1 = FALSE, WCWin2 = FALSE, WCWin3 = FALSE, 
                        DivWin1 = FALSE, DivWin2 = TRUE, DivWin3 = FALSE, LgWin1 = FALSE, 
                        LgWin2 = FALSE, LgWin3 = FALSE, WSWin1 = FALSE, WSWin2 = FALSE, 
                        WSWin3 = FALSE), .Names = c("franchID", "yearID", "name", 
                                                    "park", "attendance", "W", "W1", "W2", "W3", "WCWin1", "WCWin2", 
                                                    "WCWin3", "DivWin1", "DivWin2", "DivWin3", "LgWin1", "LgWin2", 
                                                    "LgWin3", "WSWin1", "WSWin2", "WSWin3"), row.names = c(NA, -1L
                                                    ), class = "data.frame")

1 ответ

Решение

Вы можете указать априор для коэффициентов на K предикторах, передав вектор длины K одному из поддерживаемых распределений для априоров. Например, если K = 4, вы можете сделать

wi_prior2 <- normal(location = c(0, 1, -2, 5))

Вы также можете передать вектор весов и / или другую семью, чем normal, Затем вы бы позвонили stan_glmer с prior = wi_prior2, Если вы делаете

wi_prior2 <- normal(location = 0)

тогда один и тот же априор будет использоваться для всех K общих коэффициентов.

Тем не менее, в вашем случае я подозреваю, что fmla ошибся Обычно вы также хотите включить большинство, если не все, из этих предикторов вне выражения в скобках в стиле lme4, чтобы обеспечить общие эффекты на всех уровнях. franchID, Таким образом, fmla станет

fmla <- attendance ~ W + W1 + W2 + W3 + DivWin1 + DivWin2 + DivWin3 + 
        WSWin1 + (1 + W + W1 + W2 + W3 + DivWin1 + DivWin2 + DivWin3 + 
                  WSWin1 | franchID)

Если вы включаете только часть в скобки, то вы предполагаете, что коэффициенты по этим переменным в совокупности равны нулю и отклоняются от нуля только в подгруппах, определяемых уровнями franchID, Таким образом, не было бы возможности ставить предварительные распределения по их коэффициентам.

Предшествующее для групповых отклонений от общих коэффициентов условно многовариантное нормальное со средним нулем вектора и несколько сложной, но неизвестной ковариационной структурой. Это объясняется более подробно в help(priors, package = "rstanarm"),

Другие вопросы по тегам