R中"rstanarm"包中分类变量的独特截距方法

Unique intercepts approach for categorical variables in "rstanarm" package in R

背景: McElearth (2016) 在他的 rethinking book 第 158-159 页中,使用索引变量而不是虚拟编码对名为 "clade" 的 3 类变量进行预测 "kcal.per.g"(线性回归)。

问题: 我想知道我们是否可以在 "rstanarm" 中应用相同的方法?我在下面为可能的演示提供了数据和 R 代码。

library("rethinking") # A github package not on CRAN
data(milk)
d <- milk
d$clade_id <- coerce_index(d$clade) # Index variable maker
#[1] 4 4 4 4 4 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 # index variable

# Model Specification:
fit1 <- map(
alist(
kcal.per.g ~ dnorm( mu , sigma ) ,
mu <- a[clade_id] ,
a[clade_id] ~ dnorm( 0.6 , 10 ) ,
sigma ~ dunif( 0 , 10 )
 ) ,
data = d )

使用 rstanarm 包最类似的方法是

library(rstanarm)
fit1 <- stan_glmer(kcal.per.g ~ 1 + (1 | clade_id), data = milk,
                   prior_intercept = normal(0.6, 1, autoscale = FALSE), 
                   prior_aux = exponential(rate = 1/5, autoscale = FALSE),
                   prior_covariance = decov(shape = 10, scale = 1))

但是,由于以下原因,这并不完全相同:

  1. sigma 上的有界统一先验没有实现,因为它们不是一个好主意,所以我使用期望为 5 的指数分布来代替
  2. 固定 a 的标准偏差也没有实现,所以我使用了期望为 10
  3. 的伽马分布
  4. rstanarm(和lme4)中的分层模型被参数化为与通用参数有偏差,因此不是使用 0.6 的期望值a,我对全局截距使用了 0.6 的期望,a 上的先验是正常的,期望为零。这意味着您需要调用 coef(fit1) 而不是 ranef(fit1) 来查看 "intercepts",因为它们在原始模型中被参数化。