指定不同组中相同级别的不同截距之间的相关性

时间:2019-04-24 21:56:28

标签: r lme4 random-effects

说我有两个因子变量foobar,它们都包含相同的级别"a""b""c"。是否有任何方法可以在lme4(或任何其他程序包)中指定一个模型,该模型具有对foobar的随机拦截,并且在相同级别的拦截之间具有相关性?换句话说,我认为"a"foo的效果应与"a"中的bar相关(与"b""c"类似) 。形式上看起来可能像这样:

mvn

k中每个["a", "b", "c"]的级别。

以下是一些估算sigma^2_foosigma^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]);
}

1 个答案:

答案 0 :(得分:3)

您的模型没有固定的影响,这就是为什么您没有相关矩阵的原因。根据您的描述,您在某种程度上指的是foobar之间的交互。要添加这种交互,您需要向模型中添加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 = ":"))

,然后您可以仅将aabbcc保留,如下所示:

df$foo_bar.inter[df$foo != df$bar] <- NA

您可以尝试一下,如果您需要其他帮助,请告诉我。

好运。