[R] Error in lmer: asMethod(object) : matrix is not symmetric [1, 2]

Ben Bolker bbolker at gmail.com
Fri Oct 5 15:34:45 CEST 2012


Olivier Blaser <olivier.blaser <at> unil.ch> writes:


> I am having trouble with lmer. I am looking at recombinant versus non 
> recombinant individuals. In the response variable recombinant 
> individuals are coded as 1's and non-recombinant as 0's. I built a model 
> with 2 fixed factors and 1 random effect. Sex (males/females) is the 
> first fixed effect and sexual genotype (XY, YY, WX and WY) the second 
> one. Sexual Genotype is nested in sex. XY and YY individuals are males 
> and WX and WY females. I crossed 8 XY males with 8 WY females and 8 YY 
> males with 8 WX females. Each cross corresponds to a family (i.e. family 
> 1 to 8 for XY x WY and family 9 to 16 for YY WX). For each family I have 
> 20 offspring. Family is nested in sexual genotype as a random factor.
> 
> My data looks like:
>

reps<-factor(sample(c(0,1),640,replace=T,prob=c(0.95,0.05)))
sex<-factor(rep(c("M","F"),each=320))
geno<-factor(rep(c("XY","YY","WY","WX"),each=160))
fam<-factor(rep(c(1:8,9:16,1:8,9:16),each=20))
dat<-data.frame(reps,sex,geno,fam)

with(dat,table(sex,geno))
with(dat,table(sex,geno,fam))

 Follow-ups to this question should go to r-sig-mixed-models

 The slightly obscure error message is caused by a glitch
in lme4's printing code, where it tries to print a model
that hasn't been successfully fitted in the first place.
I actually get a **slightly** more informative error message
(maybe with a slightly later version of the package):

g1 <- glmer(reps~sex+geno+(1|fam),data=dat,family=binomial)
Error in mer_finalize(ans) : Downdated X'X is not positive definite, 1.

[although lmer() automatically calls glmer() for GLMMs, I
 prefer to use glmer() explicitly]

  To diagnose/show what the problem is, let's try fitting in glm.
It works, but the answer indicates that
your design matrix is rank-deficient/overfitted:
    
(g0 <- glm(reps~sex+geno,data=dat,family=binomial))

i.e., the 'genoYY' estimate is NA, because once 'sexM',
'genoWY', and 'genoXY' parameters are fitted the model is
completely determined.

  Unlike [g]lm, [g]lmer can't handle rank-deficient/overfitted
fixed-effect design matrices (as I understand it, because the
somewhat fancier/more efficient linear algebra primitives used
in lme4 don't handle this case).  Therefore, you have to figure
out a way to code your design matrix that will work.  At the moment
I don't know of an elegant way to do that, but here's a hack:

## extract model matrix and drop intercept and genoYY dummy variables
mm <- model.matrix(g0)[,2:4]  
dat2 <-data.frame(reps,mm,fam)
g2 <- glmer(reps~sexM+genoWY+genoXY+(1|fam),data=dat2,family=binomial)

  I don't know if this gives you the answer you want or not ...




More information about the R-help mailing list