Укажите корреляцию между различными перехватами с одинаковым уровнем в разных группах - PullRequest
4 голосов
/ 25 апреля 2019

Скажем, у меня есть 2 факторные переменные foo и bar, которые содержат одинаковые уровни "a", "b" и "c".Есть ли способ указать в lme4 (или любом другом пакете) модель со случайными перехватами для foo и bar с корреляцией между перехватами с одинаковым уровнем?Другими словами, я думаю, что эффект "a" в foo должен коррелироваться с "a" в bar (аналогично для "b" и "c").Формально это может выглядеть примерно так:

mvn

для каждого уровня 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]);
}

1 Ответ

3 голосов
/ 01 мая 2019

Ваша модель не имеет фиксированных эффектов, и поэтому у вас нет корреляционной матрицы. Согласно вашему описанию, вы имеете в виду взаимодействие между 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

Конечно, как вы могли видеть, взаимодействие здесь происходит между всеми уровнями вместе (не обусловлено, как вы желаете). Я надеюсь, что вы можете получить мой ответ в качестве начального шага, чтобы получить желаемое решение. Я также постараюсь выяснить это для вас и обновлю свой ответ, как только найду что-нибудь полезное. Мое первое впечатление - вам нужно изменить свой фрейм данных таким образом, чтобы вы могли контролировать взаимодействие между перехватчиками одного уровня.


[UPDATE]

Вы можете добавить переменную взаимодействия вручную, например, следующим образом:

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

Вы можете попробовать и сообщить мне, если вам нужна дополнительная помощь.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...