Skip to content

Dropping correlations bet. random-effects in lme4 syntax

7 messages · Phillip Alday, Simon Harmel

#
Hello all,

I know to drop all correlations among all level-1 predictors in the random
part of an lmer() call, I can use `||`. But I was wondering how to drop
correlations (a) "individually" or (b) "in pairs"?

Example of (a) is how to drop the correlation of B with others (A & C)?
Example of (b) is how to drop the correlation between B and C?

lmer(y ~ A * B * C + (A * B * C  || group), data = data)

Thanks,
Simon
#
You can split the specification of your grouping to achieve this, at
least in part:

lmer(y ~ A * B * C + (A * C | group) + (B|group) , data = data)

Note that life gets tricky with the interaction terms.

Phillip
On 03/10/2020 06:35, Simon Harmel wrote:
#
Thanks Phillip. What would be the meaning of placing `0 +` next to any of
the random effects (e.g., B) as shown in m2?

m1 <- lmer(y ~ A * B * C + (A * C | group) + (B|group) , data = data)

m2 <- lmer(y ~ A * B * C + (A * 0+ B * C  | group), data = data)
On Sat, Oct 3, 2020 at 11:33 AM Phillip Alday <phillip.alday at mpi.nl> wrote:

            

  
  
#
I have no idea what 0* means, but 0+ means "suppress the intercept"
(which has knock-on effects for categorical variables and whether
they're represented in the model as (nlevels-1) contrasts or nlevels).

For the other things: try it out. The output of summary(m1) will show
you which levels and correlations were kept.
On 03/10/2020 18:44, Simon Harmel wrote:

  
  
#
Thanks for the additional information about the use of `0+` in the context
of categorical variables:)

So, by splitting the specification of the grouping variable like:

lmer(y ~ A * B * C + (A * C | group) + (B|group) , data = data)

I get the below correlation matrix. So, here we have created 2 different
intercepts, one for each "split" of the same grouping variable, right?

I ask this because B has no correlation with the first split's (intercept)
but it has a singular correlation with the second split's (intercept). The
output looks confusing to a novice like me.


            (Intercept)      A      C    A:C (Intercept)  B
(Intercept)       1.000 -0.794 -0.195  0.953           0  0
A                -0.794  1.000  0.278 -0.854           0  0
C                -0.195  0.278  1.000  0.028           0  0
A:C               0.953 -0.854  0.028  1.000           0  0
(Intercept)       0.000  0.000  0.000  0.000           1 -1
B                 0.000  0.000  0.000  0.000          -1  1
On Sat, Oct 3, 2020 at 11:52 AM Phillip Alday <phillip.alday at mpi.nl> wrote:

            

  
  
#
On 03/10/2020 19:24, Simon Harmel wrote:
Yes, by default R adds in an intercept. I recommend always writing 1+ or
0+ to make explicit what you want.

(This was what I meant with "Note that life gets tricky with the
interaction terms." in my first reply.)
Singularity isn't a problem per se -- it's mathematically well defined
and being able to fit singular covariance matrices for the random
effects was one of the algorithmic innovations lme4 has compared to its
predecessor nlme.

Singularity can be a problem for inference (because it's often a sign of
overfitting).... but it makes sense here. B has no correlation with the
first intercept because you set it to be zero via your formula
specification, so that term is forced to be zero in the model
computation. The second intercept is perfectly correlated with B because
it (the second intercept) is redundant in the model, but it can't
correlate with the first intercept (because that correlation is forced
to zero by your model specification) and so it collapses into B.

If B is continuous, you can avoid this with 0+B. If B is categorical,
then 0+B will still be overparameterized, but you can try 0+dummy(B) to
set up indicator variable for one of the two levels. (I can tell from
your output that B is continuous or only has two levels because there is
only one slope for it.)

Phillip

  
  
#
Awesome, thanks!
On Sat, Oct 3, 2020 at 12:40 PM Phillip Alday <phillip.alday at mpi.nl> wrote: