[R-sig-ME] Model with interaction alone
Ben Bolker
bbolker at gmail.com
Fri Jan 31 22:46:45 CET 2014
Pierre Montpied <montpied at ...> writes:
>
> Hi list,
>
> I could not find any answer to my problem thus I post it on this list.
>
> I have a design where sites (Site) are nested in different regions
> (Reg) and a pair of plots in each site
> is assigned two levels of a treatment (Trait).
>
> I fit this model with lme (or lmer) with two crossed fixed factors
> (Reg *Trait) and a random factor Site
>
> All works fine when I fit the complete model "Response~Reg + Treat +
> Reg:Treat"t or equivalently "Response~Reg*Trait"
>
> But when I try the interaction alone by "Response~Reg:Trait" I get the
> error message:
> "Error in MEEM(object, conLin, control$niterEM) : Singularity in
> backsolve at level 0, block 1".
>
> When I replace "Reg:Trait" by "interaction(Reg,Trait)" or by
> "factor(Reg:Trait)" all works fine
> whereas these should be equivalent to "Reg:Trait"
>
> Any explanation ?
>
> Below is a script simulating this
Thanks for the reproducible example. I have to admit I don't fully
understand what's going on here, and in particular the difference
between "Reg:Trait" and "interaction(Reg,Trait)" and "factor(Reg:Trait)",
but the bottom line is that in the first case, R has decided that
it should include an intercept column in the model (fixed-effect
model matrix) as well as the 4 levels of the interaction, so the
fixed-effect model is overparameterized, which leads to the error.
In the second two cases R drops the intercept, so the model matrix
constructed by model.matrix() has only 4 rather than 5 columns
(see the end of this post for example).
The equivalent error from lme4::lmer is *slightly* more transparent
(and I'll try to improve it further). If you specify Reg:Trait-1 or
Reg:Trait+0 (explicitly suppressing the intercept), everything works
again.
>
library(nlme)
Nrep <- 10 # replicates = site number per region
Data <- expand.grid(Trait=c("T1","T2"),
Reg=rep(c("R1","R2"),each=Nrep),
Site=paste0("S",rep(1:(Nrep*2),each=2)))
Data <- transform(Data,RegTrait=factor(paste(Data$Reg,Data$Trait,sep=".")))
## with(Data,table(Reg,Trait,Site))
with(Data,table(Site,Trait,Reg))
Mu<-20 # Intercept
Alpha2<-1 # Fixed effect Trait
Beta2<-2 # Fixed effect Region
Gamma22<-2 # Interaction Trait:Region
Sigi<-1.5 # Random effect Site
Sige<-1 # Residual
## Simulation:
set.seed(101)
Data$Rep<- Mu +
Alpha2*(Data$Trait=="T2") +
Beta2*(Data$Reg=="R2") +
Gamma22*(Data$Reg=="R2")*(Data$Trait=="T2") +
rep(rnorm(Nrep*2,0,Sigi),each=2) +
rnorm(Nrep*4,0,Sige)
library(nlme)
## the following two models should be _exactly_ identical
Modele.lme.1 <-lme(Rep~Trait*Reg,
random=~1|Site,
data=Data)# OK
Modele.lme.2 <-lme(Rep~Trait + Reg + Trait:Reg,
random=~1|Site,
data=Data)# OK
## Interaction alone:
Modele.lme.3 <- lme(Rep~Trait:Reg,
random=~1|Site,
data=Data)# Error:
## Error in MEEM(object, conLin, control$niterEM) :
## Singularity in backsolve at level 0, block 1
Modele.lme.4 <- lme(Rep~interaction(Trait,Reg),
random=~1|Site,
data=Data)# OK
names(fixef(Modele.lme.4))
Modele.lme.5 <- lme(Rep~factor(Trait:Reg),
random=~1|Site,
data=Data)# OK
names(fixef(Modele.lme.5))
Modele.lme.6 <- lme(Rep~Trait:Reg-1,
random=~1|Site,
data=Data)# OK
names(fixef(Modele.lme.6))
library(lme4)
Modele.lmer.1 <- lmer(Rep~Trait*Reg+(1|Site),
data=Data)
Modele.lmer.2 <- lmer(Rep~Trait:Reg+(1|Site),
data=Data) ## error: rank of X
Modele.lmer.3 <- lmer(Rep~Trait:Reg-1+(1|Site),
data=Data)
fixef(Modele.lmer.3)
## check model matrices
X1 <- model.matrix(~Trait*Reg,Data)
X2 <- model.matrix(~Trait:Reg,Data)
X3 <- model.matrix(~Trait:Reg-1,Data)
More information about the R-sig-mixed-models
mailing list