假设我有 2 个因子变量foo
,bar
它们都包含相同的水平"a"
、"b"
和"c"
。有没有办法在 lme4 (或任何其他包)中指定具有随机截距的模型foo
以及bar
具有相同级别的截距之间的相关性?换句话说,我认为 in 的效果"a"
应该foo
与"a"
in相关bar
(类似 for"b"
和"c"
)。形式上,这可能类似于:
中的每个级别k
。["a", "b", "c"]
这是一些估计sigma^2_foo
和的代码sigma^2_bar
:
library(lme4)
levs <- c("a", "b", "c")
n <- 1000
df <- data.frame(y = rpois(n, 3.14),
foo = sample(levs, n, TRUE),
bar = sample(levs, n, TRUE))
mod <- glmer(y ~ (1 | foo) + (1 | bar), df, poisson)
> mod
Formula: y ~ (1 | foo) + (1 | bar)
Random effects:
Groups Name Std.Dev.
foo (Intercept) 0.009668
bar (Intercept) 0.006739
但当然错过了相关项rho
。是否可以将此相关结构添加到该模型中?
更新
希望对熟悉Stan的人有所帮助,在 Stan 中,此随机效应模型的基本实现如下所示:
data {
int<lower = 1> num_data;
int<lower = 1> num_levels;
int<lower = 0> y[num_data];
int<lower = 1, upper = num_levels> foo_ix[num_data];
int<lower = 1, upper = num_levels> bar_ix[num_data];
}
parameters {
real alpha;
vector[num_levels] alpha_foo;
vector[num_levels] alpha_bar;
real<lower = 0.0> sigma_foo;
real<lower = 0.0> sigma_bar;
real<lower = -1.0, upper = 1.0> rho;
}
transformed parameters {
matrix[2, 2] Sigma;
Sigma[1, 1] = square(sigma_foo);
Sigma[2, 1] = rho * sigma_foo * sigma_bar;
Sigma[1, 2] = rho * sigma_foo * sigma_bar;
Sigma[2, 2] = square(sigma_bar);
}
model {
for (i in 1:num_levels) {
[alpha_foo[i], alpha_bar[i]] ~ multi_normal([0.0, 0.0], Sigma);
}
y ~ poisson_log(alpha + alpha_foo[foo_ix] + alpha_bar[bar_ix]);
}