Apologies for yet again a question on how to properly define the design and contrasts in limma for an experiment... However, despite reading the docs, searching the support forum, and Googling, I am still not clear how to properly do this for my experiment.
I have array data from a mouse experiment in which the treatments were made on dams (2 diets; LFD and W), but the outcomes were measured in livers of all offspring of these dams, in both male and female pups. Obviously I would like to take the ‘dam/litter effect’ into account. Question: how to define the design and contrasts to do this?
Research questions to be answered:
- Which genes are regulated in the pups by the diets of the mother?
- Is there a diet effect in each gender (sexe)?
- Is there a differential response between the two genders?
Initially I fitted an additive model (group means + litter), but then I faced the infamous “coefficients not estimable” warning. Still i identified genes for the above two questions, although topTable didn't like it.
However, I also realized that this is a nested design because dam/litter is nested with diets. After renumbering the litters, i fitted a ‘traditional’ model (including intercept). All coefficients were estimable, but now I am not sure which coefficients to compare to answer my research questions....
Finally, a long time ago Gordon recommended the use of duplicateCorrelation() for an experiment with *similar* design. Could this also (best) applied here?
Any feedback would be appreciated!
Thanks,
Guido
cel means additive model
targets (used with additive model):
Filename Sexe Diet Litter
sample1 M LFD L37
sample2 M LFD L37
sample3 M LFD L49
sample4 M LFD L49
sample5 M LFD L50
sample6 M LFD L50
sample7 M WD L48
sample8 M WD L48
sample9 M WD L48
sample10 M WD L48
sample11 M WD L40
sample12 M WD L40
sample13 F LFD L49
sample14 F LFD L50
sample15 F LFD L37
sample16 F LFD L37
sample17 F LFD L37
sample18 F LFD L49
sample19 F WD L39
sample20 F WD L39
sample21 F WD L40
sample22 F WD L40
sample23 F WD L48
sample24 F WD L48
> SD <- as.factor(paste(targets$Sexe, targets$Diet, sep="."))
> Litter <- factor(targets$Litter)
>
>
> design <- model.matrix(~0+SD+Litter)
> design
SDF.LFD SDF.WD SDM.LFD SDM.WD LitterL39 LitterL40 LitterL48 LitterL49 LitterL50
1 0 0 1 0 0 0 0 0 0
2 0 0 1 0 0 0 0 0 0
3 0 0 1 0 0 0 0 1 0
4 0 0 1 0 0 0 0 1 0
5 0 0 1 0 0 0 0 0 1
6 0 0 1 0 0 0 0 0 1
7 0 0 0 1 0 0 1 0 0
8 0 0 0 1 0 0 1 0 0
9 0 0 0 1 0 0 1 0 0
10 0 0 0 1 0 0 1 0 0
11 0 0 0 1 0 1 0 0 0
12 0 0 0 1 0 1 0 0 0
13 1 0 0 0 0 0 0 1 0
14 1 0 0 0 0 0 0 0 1
15 1 0 0 0 0 0 0 0 0
16 1 0 0 0 0 0 0 0 0
17 1 0 0 0 0 0 0 0 0
18 1 0 0 0 0 0 0 1 0
19 0 1 0 0 1 0 0 0 0
20 0 1 0 0 1 0 0 0 0
21 0 1 0 0 0 1 0 0 0
22 0 1 0 0 0 1 0 0 0
23 0 1 0 0 0 0 1 0 0
24 0 1 0 0 0 0 1 0 0
attr(,"assign")
[1] 1 1 1 1 2 2 2 2 2
attr(,"contrasts")
attr(,"contrasts")$SD
[1] "contr.treatment"
attr(,"contrasts")$Litter
[1] "contr.treatment"
> fit <- lmFit(x.norm,design)
Coefficients not estimable: LitterL48
Warning message:
Partial NA coefficients for 12332 probe(s)
> cont.matrix <- makeContrasts(
+ WD_LFD = ( (SDF.WD + SDM.WD)/2 - (SDF.LFD + SDM.LFD)/2 ), #diet main effect
+ WD.F_LFD.F = (SDF.WD - SDF.LFD), #diet efefct in female pups
+ WD.M_LFD.M = (SDM.WD - SDM.LFD), #diet effect in male pups
+ delta.sexe = ((SDF.WD - SDF.LFD) - (SDM.WD - SDM.LFD)), #sexe-dep genes
+ levels=design)
>
> fit2 <- contrasts.fit(fit, cont.matrix)
> fit2 <- eBayes(fit2, trend=TRUE, robust=TRUE)
> topTable(fit2)
Error in topTableF(fit, number = number, genelist = genelist, adjust.method = adjust.method, :
F-statistics not found in fit
> topTable(fit2,coef=1)
logFC AveExpr t P.Value adj.P.Val B
625599_at -0.7151058 6.119586 -6.990635 2.479186e-07 0.001589408 6.373436
11303_at -0.5876455 7.568066 -6.974488 2.577697e-07 0.001589408 6.341612
20787_at -0.3881564 9.571703 -6.511793 7.979145e-07 0.002118622 5.411698
15202_at -0.9022215 4.951477 -6.781162 8.324025e-07 0.002118622 5.347300
381524_at -1.0326256 7.693721 -7.155681 8.589938e-07 0.002118622 5.269775
54712_at -0.5565909 6.665185 -6.183399 1.805718e-06 0.003489665 4.731520
15233_at -1.4009764 8.011086 -7.054168 1.980835e-06 0.003489665 4.565668
108956_at 0.5669231 8.105670 6.074023 2.934636e-06 0.004523742 4.321340
19013_at -0.4013013 8.215255 -5.681969 6.415447e-06 0.008790587 3.663809
20855_at -0.4206979 6.216767 -5.579242 8.340307e-06 0.010285266 3.441188
>
targets for nested design; litter renumbered Filename Sexe Diet Litter sample1 M LFD 1 sample2 M LFD 1 sample3 M LFD 2 sample4 M LFD 2 sample5 M LFD 3 sample6 M LFD 3 sample7 M WD 3 sample8 M WD 3 sample9 M WD 3 sample10 M WD 3 sample11 M WD 2 sample12 M WD 2 sample13 F LFD 2 sample14 F LFD 3 sample15 F LFD 1 sample16 F LFD 1 sample17 F LFD 1 sample18 F LFD 2 sample19 F WD 1 sample20 F WD 1 sample21 F WD 2 sample22 F WD 2 sample23 F WD 3 sample24 F WD 3 > Diet <-relevel(as.factor(targets$Diet), ref="LFD") > Sexe <- relevel(factor(targets$Sexe), ref="M") > Litter <- factor(targets$Litter) > > design <- model.matrix(~Diet+Diet:Sexe+Diet:Litter) > > colnames(design) <- make.names(colnames(design)) > design X.Intercept. DietWD DietLFD.SexeF DietWD.SexeF DietLFD.Litter2 DietWD.Litter2 DietLFD.Litter3 DietWD.Litter3 1 1 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 3 1 0 0 0 1 0 0 0 4 1 0 0 0 1 0 0 0 5 1 0 0 0 0 0 1 0 6 1 0 0 0 0 0 1 0 7 1 1 0 0 0 0 0 1 8 1 1 0 0 0 0 0 1 9 1 1 0 0 0 0 0 1 10 1 1 0 0 0 0 0 1 11 1 1 0 0 0 1 0 0 12 1 1 0 0 0 1 0 0 13 1 0 1 0 1 0 0 0 14 1 0 1 0 0 0 1 0 15 1 0 1 0 0 0 0 0 16 1 0 1 0 0 0 0 0 17 1 0 1 0 0 0 0 0 18 1 0 1 0 1 0 0 0 19 1 1 0 1 0 0 0 0 20 1 1 0 1 0 0 0 0 21 1 1 0 1 0 1 0 0 22 1 1 0 1 0 1 0 0 23 1 1 0 1 0 0 0 1 24 1 1 0 1 0 0 0 1 attr(,"assign") [1] 0 1 2 2 3 3 3 3 attr(,"contrasts") attr(,"contrasts")$Diet [1] "contr.treatment" attr(,"contrasts")$Sexe [1] "contr.treatment" attr(,"contrasts")$Litter [1] "contr.treatment" > > fit <- lmFit(x.norm,design) > > # Intercept equals mean expression in LFD-male > > cont.matrix <- makeContrasts( + WD_LFD = ( (DietWD+DietWD.SexeF) - DietLFD.SexeF ), #diet main effect?? + WD.F_LFD.F = (DietWD.SexeF - DietLFD.SexeF), #diet efefct in female pups?? + WD.M_LFD.M = (DietWD), #diet effect in male pups?? + delta.sexe = ((DietWD.SexeF - DietLFD.SexeF) - DietWD), #sexe-dep genes?? + levels=design) > > > fit2 <- contrasts.fit(fit, cont.matrix) > fit2 <- eBayes(fit2, trend=TRUE, robust=TRUE) > topTable(fit2) WD_LFD WD.F_LFD.F WD.M_LFD.M delta.sexe AveExpr F P.Value adj.P.Val 22139_at 0.8232779 0.4584550 0.3648229 0.09363214 10.113522 38.30188 2.405464e-08 0.0002966418 17748_at -0.6849334 -0.3371893 -0.3477441 0.01055483 11.319395 30.75738 1.799528e-07 0.0011095887 69036_at -0.6605604 -0.2511031 -0.4094573 0.15835417 12.554694 29.08963 2.943635e-07 0.0012100302 20787_at -0.5784347 -0.3335203 -0.2449145 -0.08860582 9.571703 27.47740 4.828340e-07 0.0014885772 226123_at 0.6573526 0.4589262 0.1984264 0.26049983 7.369280 24.79782 1.150587e-06 0.0028378068 11303_at -0.7741369 -0.2470930 -0.5270440 0.27995100 7.568066 21.72466 3.375199e-06 0.0054942399 18703_at -0.5938379 -0.3379725 -0.2558654 -0.08210715 10.945976 21.69258 3.415043e-06 0.0054942399 68371_at -0.7809301 -0.5201257 -0.2608044 -0.25932122 9.174027 22.62103 3.564217e-06 0.0054942399 240660_at -0.5326507 -0.3816188 -0.1510319 -0.23058683 8.190418 20.47978 5.366370e-06 0.0073531199 237847_at -0.5386111 -0.4031175 -0.1354937 -0.26762380 7.751602 19.84829 6.835333e-06 0.0084293321 > > topTable(fit2,coef=1) logFC AveExpr t P.Value adj.P.Val B 22139_at 0.8232779 10.113522 8.199715 1.473255e-08 0.0001816818 9.153816 17748_at -0.6849334 11.319395 -7.494534 7.470096e-08 0.0003140067 7.766977 69036_at -0.6605604 12.554694 -7.485026 7.638826e-08 0.0003140067 7.747720 20787_at -0.5784347 9.571703 -6.899323 3.091683e-07 0.0009531658 6.533630 11303_at -0.7741369 7.568066 -6.532403 7.583463e-07 0.0018703853 5.746102 226123_at 0.6573526 7.369280 6.261047 1.487074e-06 0.0030564329 5.151217 242109_at 0.7940300 6.865846 6.180800 1.817511e-06 0.0030592229 4.973379 18703_at -0.5938379 10.945976 -6.145715 1.984575e-06 0.0030592229 4.895362 68371_at -0.7809301 9.174027 -6.057329 3.424477e-06 0.0046922949 4.420740 240660_at -0.5326507 8.190418 -5.647087 7.012635e-06 0.0077855083 3.770503 > # got stuck: both topTables for main diet effect do NOT match...

Hi Aaron,
Thanks very much for your reply! I fully understand your
duplicateCorrelationapproach. However, I am (still) puzzled by your 2nd approach in which directly is blocked on litter:Specifically, why do you drop the 7th coefficient (SDF.WD) from the design (and not another one)?
Also, i would appreciate if you could spend few more words on when to drop which term for what contrasts, and how you would define these.
Thanks for answering these (likely naive) questions.
I dropped the 7th coefficient because it made the interpretation of the remaining terms easier. If I dropped
SDM.WDand retainedSDF.WD, the variousLitterterms would represent average expression across all females for LFD litters but across males for WD litters. This is unnecessarily confusing, so I droppedSDF.WDto ensure that theLitterterms represent average expression across females for each litter.As for the contrasts, you can just set
coef=7intopTableto test the sex effect across LFD litters. Similarly, you can setcoef=8to test the sex effect across WD litters. This makes sense, because the corresponding coefficients indesign2represent the sex effect of males over females for each diet.Hi Aaron,
I have doubt why dropping coef number 7 the final two terms represent the average log-fold change for male mice over female, in the LFD or WD-fed mice. The design matrix would be:
Do the last two terms represent SDM.LFD-SDF.LFD and SDM.WD-SDF.LFD? Am I wrong?
Best,
Keifa
Ask a new question.
Done: Limma DesignMatrix, dropping terms