Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Singularity in backsolve at level 0, block 1 in LME model

Tags:

r

mixed-models

dput for data, copy from https://pastebin.com/1f7VuBkx (too large to include here)

data.frame':    972 obs. of  7 variables:
$ data_mTBS : num  20.3 22.7 0 47.8 58.7 ...
$ data_tooth: num  1 1 1 1 1 1 1 1 1 1 ...
$ Adhesive  : Factor w/ 4 levels "C-SE2","C-UBq",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Approach  : Factor w/ 2 levels "ER","SE": 1 1 1 1 1 1 1 1 1 1 ...
$ Aging     : Factor w/ 2 levels "1w","6m": 1 1 1 1 1 1 2 2 2 2 ...
$ data_name : Factor w/ 40 levels "C-SE2-1","C-SE2-10",..: 11 11 11 11 11 11 11 11 11 11 ...
$ wait      : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
head(Data)


   data_mTBS data_tooth Adhesive Approach Aging data_name wait
1     20.27          1    C-UBq       ER    1w   C-UBq-1   no
2     22.73          1    C-UBq       ER    1w   C-UBq-1   no
3      0.00          1    C-UBq       ER    1w   C-UBq-1   no
4     47.79          1    C-UBq       ER    1w   C-UBq-1   no
5     58.73          1    C-UBq       ER    1w   C-UBq-1   no
6     57.02          1    C-UBq       ER    1w   C-UBq-1   no

when I run the following code without "wait", it works perfectly, but when I try run it with "wait" included in the model it gives the singularity problem.

LME_01<-lme(data_mTBS ~ Adhesive*Approach*Aging*wait, na.action=na.exclude,data = Data, random = ~ 1|data_name);

Error in MEEM(object, conLin, control$niterEM) : Singularity in backsolve at level 0, block 1

contrast_Aging<-contrast(LME_01,a = list(Aging =c("1w"),Adhesive = levels(Data$Adhesive),Approach = levels(Data$Approach) ),b = list(Aging =c("6m"), Adhesive = levels(Data$Adhesive),Approach = levels(Data$Approach)))

c1<-as.matrix(contrast$X)
Contrastsi2<-summary(glht(LME_01, c1))

&

contrast_Approach<-contrast(LME_01,
                                    a = list(Approach = c("SE"), Aging =levels(Data$Aging)   ,Adhesive = levels(Data$Adhesive)),
                                    b = list(Approach = c("ER"), Aging =levels(Data$Aging)   ,Adhesive = levels(Data$Adhesive)))

c2<-as.matrix(contrast$X)
Contrastsi3<-summary(glht(LME_01, c2))

Thanks in advance.

like image 348
Mohammed Ahmed Avatar asked May 24 '18 09:05

Mohammed Ahmed


1 Answers

tl;dr as @HongOoi is telling you, wait and Adhesive are confounded in your model. lme is a little stupider/more stubborn than many of the other modeling functions in R, which will either warn you explicitly that you have confounded fixed effects or automatically drop some of them for you.

It's a bit easier to see this if you plot the data:

## source("SO50505290_data.txt")

library(ggplot2)
ggplot(dd,aes(Adhesive,data_mTBS,
              fill=Aging,
              alpha=Approach))+
  facet_grid(.~wait,scale="free_x",space="free",
             labeller=label_both)+
  guides(alpha = guide_legend(override.aes = list(fill = "darkgray")))+
  geom_boxplot()
ggsave("SO50505290.png")

enter image description here

This shows you that knowing that wait=="no" is the same as knowing that Adhesive=="C-UBq".

It would probably make more sense to back up and think about the questions you're asking, but if you do this with lme4::lmer it will tell you

fixed-effect model matrix is rank deficient so dropping 16 columns / coefficients

library(lme4)
LME_02<-lmer(data_mTBS ~ Adhesive*Approach*Aging*wait+
               (1|data_name), 
            na.action=na.exclude,data = dd)
like image 64
Ben Bolker Avatar answered Nov 10 '22 13:11

Ben Bolker