说我有两个因子变量foo
和bar
,它们都包含相同的级别"a"
,"b"
和"c"
。是否有任何方法可以在lme4(或任何其他程序包)中指定一个模型,该模型具有对foo
和bar
的随机拦截,并且在相同级别的拦截之间具有相关性?换句话说,我认为"a"
中foo
的效果应与"a"
中的bar
相关(与"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]);
}
答案 0 :(得分:3)
您的模型没有固定的影响,这就是为什么您没有相关矩阵的原因。根据您的描述,您在某种程度上指的是foo
和bar
之间的交互。要添加这种交互,您需要向模型中添加foo:bar
项作为固定效果,如下所示:
mod <- glmer(y ~ (1 | foo) + (1 | bar) + foo:bar, df, poisson)
summary(mod)
这将给出以下输出:
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [glmerMod]
Family: poisson ( log )
Formula: y ~ (1 | foo) + (1 | bar) + foo:bar
Data: df
AIC BIC logLik deviance df.resid
3962.1 4016.1 -1970.1 3940.1 989
Scaled residuals:
Min 1Q Median 3Q Max
-1.8572 -0.6665 -0.0947 0.5406 3.8695
Random effects:
Groups Name Variance Std.Dev.
foo (Intercept) 0 0
bar (Intercept) 0 0
Number of obs: 1000, groups: foo, 3; bar, 3
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.07131 0.05882 18.212 <2e-16 ***
fooa:bara 0.16682 0.07692 2.169 0.0301 *
foob:bara 0.04549 0.08039 0.566 0.5715
fooc:bara -0.08801 0.08464 -1.040 0.2984
fooa:barb 0.08196 0.08370 0.979 0.3275
foob:barb 0.05421 0.08006 0.677 0.4983
fooc:barb 0.08886 0.07712 1.152 0.2492
fooa:barc -0.02109 0.07884 -0.268 0.7891
foob:barc 0.12437 0.07720 1.611 0.1072
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) foo:br fob:br foc:br fo:brb fb:brb fc:brb fo:brc
fooa:bara -0.765
foob:bara -0.732 0.560
fooc:bara -0.695 0.531 0.509
fooa:barb -0.703 0.537 0.514 0.488
foob:barb -0.735 0.562 0.538 0.511 0.516
fooc:barb -0.763 0.583 0.558 0.530 0.536 0.560
fooa:barc -0.746 0.571 0.546 0.519 0.524 0.548 0.569
foob:barc -0.762 0.583 0.558 0.530 0.535 0.560 0.581 0.569
当然,如您所见,此处的交互作用发生在所有级别之间(不是您所希望的条件)。希望您能得到我的答案,作为获得所需解决方案的第一步。我还将尝试为您解决问题,并在发现有用的内容时更新我的答案。我的第一印象是,您需要以一种可以控制相同级别截距之间的交互的方式来修改数据框。
[更新]
您可以手动添加一个交互变量,如下所示:
df <- transform(df,foo_bar.inter=interaction(foo,bar, sep = ":"))
,然后您可以仅将a
与a
,b
与b
和c
与c
保留,如下所示:>
df$foo_bar.inter[df$foo != df$bar] <- NA
您可以尝试一下,如果您需要其他帮助,请告诉我。
好运。