在混合效应模型 (R brms) 中定义随机效应和随机效应方差的先验
Defining prior for both random effects and random effects variance in mixed effect model (R brms)
我想拟合 GLMM 泊松模型计数。我有 121 个科目 (subject
),我观察到每个科目有 8 个泊松计数 (count
):它们对应于 2 种类型的事件 (event
) x 4 个周期 (period
).
'data.frame': 968 obs. of 4 variables:
$ count : num 4 0 2 3 3 0 1 0 8 14 ...
$ subject: num 1 1 1 1 1 1 1 1 2 2 ...
$ event : Factor w/ 2 levels "call","visit": 2 2 2 2 2 2 2 2 1 1 ...
$ period : Factor w/ 4 levels "period_1","period_2",..: 1 2 3 4 1 2 3 4 1 2 ...
我想要的:
- 我想用贝叶斯方法拟合 GLMM,假设 (1)
subject
、(2) subject:visit
、(3) subject:event
. 的随机效应
- 我想为所有固定效应设置 N(0, 10^6) 先验,
- 我要设置N(0, sigma2_a), N(0, sigma2_b) , N(0, sigma2_c) (1)
subject
, (2) subject:visit
, (3) [=18] 随机效应的先验=],分别
- 我想为 sigma2_a、sigma2_b、[设置统一先验=87=] 分别。
我得到了什么:
我相信我正在正确设置模型公式,并且我正在为固定效应参数设置所需的先验:
## define some priors
prior <- c(prior_string("normal(0,10^3)", class = "b"),
prior_string("normal(0,10^3)", class = "b", coef = "eventvisit"),
prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_2"),
prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_3"),
prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_4"),
prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_2"),
prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_3"),
prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_4"))
## fit model
fit1 <- brm(count ~ event + period + event:period + (1|subject) + (0 + event|subject) + (0 + period|subject),
data = data.long, family = poisson(),
prior = prior,
warmup = 1000, iter = 4000, chains = 4,
cores = 7)
我的挣扎:
- 如何设置N(0, sigma2_a), N(0, sigma2_b), N(0, sigma2_c) (1)
subject
, (2) subject:visit
, (3) subject:event
随机效应的先验],分别
- 如何为 sigma2_a、sigma2_b、[= 设置统一先验87=]分别.
关于你想要什么:你能用subject:visit
和subject:event
更详细地解释一下你想要什么吗?目前,我无法判断您的模型是否已根据您的目的正确指定。
关于先验:
- 如果设置
prior_string("normal(0,10^3)", class = "b")
,则无需为每个系数再次指定该先验。在整个 class 之前全局设置它就足够了。请注意,考虑到您的响应变量和预测变量的规模,normal(0, 1000) 非常宽,几乎没有影响。你最好把它留在外面。
- 那些
normal(0, sigma_x)
先验是为所有随机效应项自动设置的。不用担心他们。
- 您可以使用
class = "sd"
设置随机效应 SD 的先验。例如prior_string("cauchy(0, 5)", class = "sd")
。我明确鼓励您 不要 使用统一先验,特别是因为它们对参数(标准差)有一个硬性上限,这不是理论上的上限。
我想拟合 GLMM 泊松模型计数。我有 121 个科目 (subject
),我观察到每个科目有 8 个泊松计数 (count
):它们对应于 2 种类型的事件 (event
) x 4 个周期 (period
).
'data.frame': 968 obs. of 4 variables:
$ count : num 4 0 2 3 3 0 1 0 8 14 ...
$ subject: num 1 1 1 1 1 1 1 1 2 2 ...
$ event : Factor w/ 2 levels "call","visit": 2 2 2 2 2 2 2 2 1 1 ...
$ period : Factor w/ 4 levels "period_1","period_2",..: 1 2 3 4 1 2 3 4 1 2 ...
我想要的:
- 我想用贝叶斯方法拟合 GLMM,假设 (1)
subject
、(2)subject:visit
、(3)subject:event
. 的随机效应
- 我想为所有固定效应设置 N(0, 10^6) 先验,
- 我要设置N(0, sigma2_a), N(0, sigma2_b) , N(0, sigma2_c) (1)
subject
, (2)subject:visit
, (3) [=18] 随机效应的先验=],分别 - 我想为 sigma2_a、sigma2_b、[设置统一先验=87=] 分别。
我得到了什么:
我相信我正在正确设置模型公式,并且我正在为固定效应参数设置所需的先验:
## define some priors prior <- c(prior_string("normal(0,10^3)", class = "b"), prior_string("normal(0,10^3)", class = "b", coef = "eventvisit"), prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_2"), prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_3"), prior_string("normal(0,10^3)", class = "b", coef = "eventvisit:periodperiod_4"), prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_2"), prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_3"), prior_string("normal(0,10^3)", class = "b", coef = "periodperiod_4")) ## fit model fit1 <- brm(count ~ event + period + event:period + (1|subject) + (0 + event|subject) + (0 + period|subject), data = data.long, family = poisson(), prior = prior, warmup = 1000, iter = 4000, chains = 4, cores = 7)
我的挣扎:
- 如何设置N(0, sigma2_a), N(0, sigma2_b), N(0, sigma2_c) (1)
subject
, (2)subject:visit
, (3)subject:event
随机效应的先验],分别 - 如何为 sigma2_a、sigma2_b、[= 设置统一先验87=]分别.
关于你想要什么:你能用subject:visit
和subject:event
更详细地解释一下你想要什么吗?目前,我无法判断您的模型是否已根据您的目的正确指定。
关于先验:
- 如果设置
prior_string("normal(0,10^3)", class = "b")
,则无需为每个系数再次指定该先验。在整个 class 之前全局设置它就足够了。请注意,考虑到您的响应变量和预测变量的规模,normal(0, 1000) 非常宽,几乎没有影响。你最好把它留在外面。 - 那些
normal(0, sigma_x)
先验是为所有随机效应项自动设置的。不用担心他们。 - 您可以使用
class = "sd"
设置随机效应 SD 的先验。例如prior_string("cauchy(0, 5)", class = "sd")
。我明确鼓励您 不要 使用统一先验,特别是因为它们对参数(标准差)有一个硬性上限,这不是理论上的上限。