This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Design matrix not of full rank.

I have a dataset like so

df <- data.frame(condition=rep(c("c","l"),each=12),family=rep(c(20,21,27,30),each=3))
df
   condition family
1          c     20
2          c     20
3          c     20
4          c     21
5          c     21
6          c     21
7          c     27
8          c     27
9          c     27
10         c     30
11         c     30
12         c     30
13         l     20
14         l     20
15         l     20
16         l     21
17         l     21
18         l     21
19         l     27
20         l     27
21         l     27
22         l     30
23         l     30
24         l     30

I would like to compare condition c and l within families. I created a model like so:

design.mat <- model.matrix(~condition+family,df)

creating this model matrix

   (Intercept) conditionl family20 family21 family27 family30
1            1          0        1        0        0        0
2            1          0        1        0        0        0
3            1          0        1        0        0        0
4            1          0        0        1        0        0
5            1          0        0        1        0        0
6            1          0        0        1        0        0
7            1          0        0        0        1        0
8            1          0        0        0        1        0
9            1          0        0        0        1        0
10           1          0        0        0        0        1
11           1          0        0        0        0        1
12           1          0        0        0        0        1
13           1          1        1        0        0        0
14           1          1        1        0        0        0
15           1          1        1        0        0        0
16           1          1        0        1        0        0
17           1          1        0        1        0        0
18           1          1        0        1        0        0
19           1          1        0        0        1        0
20           1          1        0        0        1        0
21           1          1        0        0        1        0
22           1          1        0        0        0        1
23           1          1        0        0        0        1
24           1          1        0        0        0        1
attr(,"assign")
[1] 0 1 2 2 2 2
attr(,"contrasts")
attr(,"contrasts")$condition
[1] "contr.treatment"

attr(,"contrasts")$family
[1] "contr.treatment"

I then ran

eb <- DGEList(counts)
ebg <- estimateGLMCommonDisp(eb,design.mat)

but I get this error:

Error in glmFit.default(y, design = design, dispersion = dispersion, offset = offset,  : 
  Design matrix not of full rank.  The following coefficients not estimable:
 family30

I also tried

design.mat <- model.matrix(~0+condition+family,df)

as suggested in another post, but it still does not work. Any ideas on how this can be tackled is highly appreciated. Thanks.

rna-seq edger r

Just drop the column 'family 20' from the design matrix. In this setting condition:c / family:20 is your baseline class

Yes. That did fix the issue. Thanks a lot. Would you like to add that as an answer?

Not really, it's pretty elementary. Can you see why the matrix you posted has rank 5?

When calling design.mat <- model.matrix(~condition+family,df), the resulting object has no conditionc column. It was automatically removed as the first level of the condition factor. But then why was family20 not removed in a similar way?

It's a trap ... to keep us all in business. Plus I don't think model.matrix could really be automated for all the possible designs in the world

Can I just check that your real code uses

family=factor(rep(c(20,21,27,30),each=3))

rather than family=rep(c(20,21,27,30),each=3)

hmmm... that might be it. I just tried it again and family20 does seem to be removed atutomatically.

0 answers

No answers yet.

Log in to answer this question.