Hi,
I am sorry if this is a repeated question, but I couldn't find any example that fits my exact case.
I have a dataset of individuals with alternative genotypes (North or Heterozygous). Each genotype was reared under different temperatures (Seven or Ten). I am interested in understanding the effect of temperature by genotype and of genotype by temperature. Initially I constructed the following model matrix in edgeR following section 3.3.1:
design$group<-factor(paste0(design$TEMP, ".", design$GENO))
design_model <- model.matrix(~ 0 + group)
colnames(design_model) <- levels(group)
SEVEN.Heterozygous SEVEN.North TEN.Heterozygous TEN.North
1 1 0 0 0
2 1 0 0 0
3 1 0 0 0
4 1 0 0 0
5 1 0 0 0
6 1 0 0 0
7 1 0 0 0
8 1 0 0 0
9 1 0 0 0
10 1 0 0 0
11 1 0 0 0
12 1 0 0 0
13 0 1 0 0
14 0 1 0 0
15 0 1 0 0
16 0 1 0 0
17 0 1 0 0
18 0 1 0 0
19 0 0 1 0
20 0 0 1 0
21 0 0 1 0
22 0 0 1 0
23 0 0 1 0
24 0 0 1 0
25 0 0 1 0
26 0 0 1 0
27 0 0 1 0
28 0 0 1 0
29 0 0 1 0
30 0 0 0 1
31 0 0 0 1
32 0 0 0 1
33 0 0 0 1
34 0 0 0 1
35 0 0 0 1
36 0 0 0 1
37 0 0 0 1
38 0 0 0 1
attr(,"assign")
[1] 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$group
[1] "contr.treatment"
And testing differential expression for the effect of, let's say, genotype for a given temperature:
# Calculate dispersion
df <- estimateDisp(df, model_design, robust=TRUE)
df <- estimateGLMCommonDisp(df, model_design)
# Fit the model
fit <- glmQLFit(df, model_design, robust=TRUE)
# Make a contrast
con.SEVEN.North_vs_Het <- makeContrasts(groupSEVEN.North - groupSEVEN.Heterozygous, levels=design_model)
qlf.SEVEN.North_vs_Het <- glmQLFTest(fit, contrast=con.SEVEN.North_vs_Het)
Now I wanted to make this a bit more complicated:
1. Testing for overall effect of temperature or genotype
With the model matrix above, is it correct to test for the overall effect of temperature like this?
qlf.Ten_vs_Seven <- glmQLFTest(fit, contrast=c(-1,-1,1,1)
Or should I instead construct a model matrix that includes temperature and genotype explicitly (see code bellow)? But then how do I test for the effect of genotype within temperature, or temperature within genotype, like above; doo I need to have a separate model matrix for this interaction?
TEMP<-factor(paste(design$TEMP))
GENO<-factor(paste(design$GENO))
design_model <- model.matrix(~ GENO+TEMP)
2. How to add a blocking factor?
Sex doesn't seem to have a strong effect on gene expression in this dataset (all groups of GENO x TEMP have equivalent numbers of males and females), but I thought I should still control for this effect. What would be the best way to do this in the model matrix? From the first model matrix, should I just add SEX as a blocking factor in the design matrix above like so:
design$group<-factor(paste0(design$TEMP, ".", design$GENO))
SEX<-factor(paste(design$SEX))
design_model <- model.matrix(~ 0 + group + SEX)
And then proceeding as above to make the contrasts that I want? I am able to fit the model with this model matrix, but I am not sure it is the correct way of adding the blocking factor.
So I also tried this code following the section 3.3.2 of the manual and inspired by this question, but I get a warning that my Design matrix is not of full rank
SEX<-factor(paste(design$SEX))
TEMP<-factor(paste(design$TEMP))
GENO<-factor(paste(design$GENO))
design_model <- model.matrix(~ 0 + SEX + GENO:TEMP)
SEXF SEXM GENOHeterozygous:TEMPSEVEN GENONorth:TEMPSEVEN GENOHeterozygous:TEMPTEN GENONorth:TEMPTEN
1 0 1 1 0 0 0
2 1 0 1 0 0 0
3 0 1 1 0 0 0
4 1 0 1 0 0 0
5 0 1 1 0 0 0
6 0 1 1 0 0 0
7 1 0 1 0 0 0
8 1 0 1 0 0 0
9 0 1 1 0 0 0
10 1 0 1 0 0 0
11 0 1 1 0 0 0
12 0 1 1 0 0 0
13 1 0 0 1 0 0
14 0 1 0 1 0 0
15 1 0 0 1 0 0
16 1 0 0 1 0 0
17 1 0 0 1 0 0
18 0 1 0 1 0 0
19 1 0 0 0 1 0
20 0 1 0 0 1 0
21 0 1 0 0 1 0
22 0 1 0 0 1 0
23 1 0 0 0 1 0
24 1 0 0 0 1 0
25 0 1 0 0 1 0
26 1 0 0 0 1 0
27 1 0 0 0 1 0
28 1 0 0 0 1 0
29 0 1 0 0 1 0
30 1 0 0 0 0 1
31 0 1 0 0 0 1
32 1 0 0 0 0 1
33 0 1 0 0 0 1
34 1 0 0 0 0 1
35 0 1 0 0 0 1
36 0 1 0 0 0 1
37 0 1 0 0 0 1
38 0 1 0 0 0 1
attr(,"assign")
[1] 1 1 2 2 2 2
attr(,"contrasts")
attr(,"contrasts")$SEX
[1] "contr.treatment"
attr(,"contrasts")$GENO
[1] "contr.treatment"
attr(,"contrasts")$TEMP
[1] "contr.treatment"
Then I tried explicitly adding GENO and TEMP:
SEX<-factor(paste(design$SEX))
TEMP<-factor(paste(design$TEMP))
GENO<-factor(paste(design$GENO))
design_model <- model.matrix(~ SEX + GENO + TEMP + GENO:TEMP)
(Intercept) GENONorth TEMPTEN SEXM GENONorth:TEMPTEN
1 1 0 0 1 0
2 1 0 0 0 0
3 1 0 0 1 0
4 1 0 0 0 0
5 1 0 0 1 0
6 1 0 0 1 0
7 1 0 0 0 0
8 1 0 0 0 0
9 1 0 0 1 0
10 1 0 0 0 0
11 1 0 0 1 0
12 1 0 0 1 0
13 1 1 0 0 0
14 1 1 0 1 0
15 1 1 0 0 0
16 1 1 0 0 0
17 1 1 0 0 0
18 1 1 0 1 0
19 1 0 1 0 0
20 1 0 1 1 0
21 1 0 1 1 0
22 1 0 1 1 0
23 1 0 1 0 0
24 1 0 1 0 0
25 1 0 1 1 0
26 1 0 1 0 0
27 1 0 1 0 0
28 1 0 1 0 0
29 1 0 1 1 0
30 1 1 1 0 1
31 1 1 1 1 1
32 1 1 1 0 1
33 1 1 1 1 1
34 1 1 1 0 1
35 1 1 1 1 1
36 1 1 1 1 1
37 1 1 1 1 1
38 1 1 1 1 1
attr(,"assign")
[1] 0 1 2 3 4
attr(,"contrasts")
attr(,"contrasts")$GENO
[1] "contr.treatment"
attr(,"contrasts")$TEMP
[1] "contr.treatment"
attr(,"contrasts")$SEX
[1] "contr.treatment"
And this works with fitting the model, but then I am not sure how to test for differences between temperatures within genotypes, or differences between genotypes within temperatures because I only have the GENONorth:TEMPTEN, and not GENONorth:TEMPSEVEN, GENOHeterozygous:TEMPTEN, or GENOHeterozygous:TEMPSEVEN...
Any advice?
Thank you so much!