Полное разделение — как наложить «нулевое среднее нормальное значение на фиксированные эффекты» в bglmer

#r #mixed-models

#r #смешанные модели

Вопрос:

Моя glmer модель, которая содержит два предиктора и термин взаимодействия, страдает от полного разделения. Следуя рекомендациям Бена Болкера здесь и здесь, я затем подгоняю модель bglmer , накладывая нулевые средние значения нормы на фиксированные эффекты. Мой код выглядит следующим образом:

 bglmer(Binary_outcome ~ (1|Subject)   Factor1   Factor2   Factor1:Factor2, 
       mydata, 
       control=glmerControl(optimizer="bobyqa"), 
       family = binomial, 
       fixef.prior = normal(sd = c(3, 3, 3)))
  

И Factor1, и Factor2 являются факторными переменными с четырьмя уровнями каждая. Для моего кода я следовал примеру здесь. Насколько я понимаю, теперь я устанавливаю нормальные значения нулевого значения с SD, равным 3, на все элементы моей структуры фиксированных эффектов.

Код, похоже, сработал, но я совершенно не уверен, действительно ли то, что я сделал, правильно. Является ли 3 SD общей рекомендацией для полного разделения? И как бы я указал fixef.priors , что это относится только к термину взаимодействия? (Полное разделение относится к конкретной комбинации Factor1 и Factor2 , а не Factor1 или Factor2 в целом). Или я должен в любом случае устанавливать значения фиксированного эффекта для всех трех элементов, если речь идет о взаимодействии?

Ответ №1:

Если сомневаетесь, экспериментируйте. tl;dr вероятно, можно штрафовать все, но вы можете, если хотите, штрафовать взаимодействия и не штрафовать основные эффекты (или почти; вы должны указать конечный sd, но он может быть очень большим). sd = 3 является разумным; sd = 2.5 по умолчанию для параметров, отличных от перехвата. Если вы не подбираете прогностическую модель и не хотите утруждать себя перекрестной проверкой, чтобы выбрать оптимальную силу наказания, на самом деле нет автоматического способа принятия решения; вам просто нужно выбрать sd, который делает все ваши параметры «разумными», не слишком приближая ваши четко определенные параметры к нулю.

Я смоделировал данные, немного похожие на ваши (2 фактора по 4 уровня каждый, двоичный ответ, один случайный термин перехвата) и попробовал разные сценарии наказания. Я настроил истинные параметры так, чтобы большинство параметров были разумными (бета = 1), но был один большой основной эффект и один большой параметр взаимодействия (бета = 12).

  • нет наказания ( glmer )
  • наказание с sd=3
  • штраф за все термины с sd=1
  • очень слабое наказание за основные условия эффекта ( sd=1e4 ) и среднее наказание за взаимодействия ( sd=2 ) [«смешанный»]

От help("bmerDist-class") :

При указании стандартных отклонений вектор длиной меньше числа фиксированных эффектов будет иметь повторяющийся хвост, в то время как предполагается, что первый элемент применяется только к термину перехвата. Таким образом, по умолчанию ‘c (10, 2.5)’, перехват получает стандартное отклонение 10, а различным наклонам присваивается стандартное отклонение 2.5

введите описание изображения здесь

 library(lme4)
library(blme)
library(broom.mixed)
library(dotwhisker)
library(colorspace)

dd <- expand.grid(Subject=factor(1:10),
                  Factor1=letters[1:4],
                  Factor2=LETTERS[1:4],
                  rep=1:20
                  )
bvec <- rep(1,16)
bvec[c(2,10)] <- 12
form <- response ~ (1|Subject)   Factor1   Factor2   Factor1:Factor2
set.seed(101)
dd$response <- simulate(form[-2],
         newdata=dd,
         newparams=list(beta=bvec, theta=1),
         family=binomial,
         weights=rep(1,nrow(dd)))[[1]]

b0 <- glmer(form, 
            dd,
            family = binomial)
bfun <- function(sd) {
   bglmer(form, dd, family = binomial, fixef.prior = normal(sd = sd))
}
b1 <- bfun(3)
b2 <- bfun(1)
## eight intercept   main effects first, then eight interaction parameters
b3 <- bfun(rep(c(1e4,2),c(8,8))

theme_set(theme_bw())
dwplot(list(unpenalized=b0,sd3=b1,sd1=b2,mixed=b3),effect="fixed")  
    coord_cartesian(xlim=c(-5,5)) 
    geom_vline(xintercept=c(0,1),lty=2,colour="darkgray")  
    scale_colour_discrete_qualitative(guide=guide_legend(reverse=TRUE))
  

Комментарии:

1. Большое вам спасибо, это было очень полезно! Я перепробовал все 3 версии, и каждая из них сделала соответствующий параметр разумным.

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

3. Готово — извините, я все еще новичок в этой системе!