[BioC] limma, voom, weights: factorial versus nested interaction results

Reiner Schulz reiner.schulz at kcl.ac.uk
Thu Jan 3 11:21:46 CET 2013


hi Ryan,

the voom call is:
counts.voom= voom( counts, design= design.matrix, plot=T,
lib.size=nf*colSums( counts), normalize.method= 'none')
where nf= calcNormFactors( counts) and design.matrix as below.

fitting is done using:
fit.limma= lmFit( counts.voom$E, design= design.matrix, weights=
counts.voom$weights)
and:
fit.limma.alt= lmFit( counts.voom$E, design= design.matrix.alt, weights=
counts.voom$weights)
where design.matrix.alt as below. so, the only difference is in the
design matrix; expression values and weights are the same. yet, i
observe the unexpected inequalities below. without 'weights=
counts.voom$weights', everything is as expected.

also, relevant bits from sessionInfo():
R version 2.15.2 (2012-10-26)
Platform: x86_64-pc-linux-gnu (64-bit)
limma_3.14.3
edgeR_3.0.7
DESeq_1.10.1

best, r

On 02/01/13 19:47, Ryan C. Thompson wrote:
> It would probably help to have the exact code that you used to call
> voom. voom can take a lot of arguments, and I'm not sure which ones
> would make a difference here.
> 
> On 01/02/2013 07:31 AM, Reiner Schulz wrote:
>> Dear all,
>>
>> Am analysing an RNA-seq experiment with a two-way factorial design, and
>> am observing different results for two contrasts of interest depending
>> on whether I use a factorial model matrix or a nested interaction model
>> matrix. I only observe this if the data are pre-processed w/ voom:
>>> counts.voom= voom( ...
>> i.e., when there are observational level weights passed to lmFit. If I
>> only pass counts.voom$E (no observational level weights) to lmFit, the
>> results for the two contrasts of interest are identical for the
>> factorial and nested interaction model matrices.
>> Is this to be expected, and if so, what is the explanation?
>>
>> Much appreciated, Reiner
>>
>> PS: some more details ...
>>
>>> strain
>>   [1] MUT MUT MUT MUT MUT MUT MUT MUT MUT MUT MUT MUT MUT WT  WT  WT  WT
>>   WT  WT
>> [20] WT  WT  WT  WT  WT  WT  WT
>> Levels: WT MUT
>>> treat
>>   [1] U  T2 T1 U  T2 T1 U  U  T2 T1 U  T2 T1 U  T2 T1 U  T2 T1 U  U  T2
>> T1 U  T2
>> [26] T1
>> Levels: U T1 T2
>>
>>> cond= factor( paste( sep='.', strain, treat), lev=c('WT.U', 'MUT.U',
>> 'WT.T1', 'MUT.T1', 'WT.T2', 'MUT.T2'))
>>> design.matrix= model.matrix( ~0 + cond)
>>> design.matrix
>>     WT.U MUT.U WT.T1 MUT.T1 WT.T2 MUT.T2
>> 1  0    1     0     0      0      0
>> 2  0    0     0     0      0      1
>> 3  0    0     0     1      0      0
>> 4  0    1     0     0      0      0
>> 5  0    0     0     0      0      1
>> 6  0    0     0     1      0      0
>> 7  0    1     0     0      0      0
>> 8  0    1     0     0      0      0
>> 9  0    0     0     0      0      1
>> 10 0    0     0     1      0      0
>> 11 0    1     0     0      0      0
>> 12 0    0     0     0      0      1
>> 13 0    0     0     1      0      0
>> 14 1    0     0     0      0      0
>> 15 0    0     0     0      1      0
>> 16 0    0     1     0      0      0
>> 17 1    0     0     0      0      0
>> 18 0    0     0     0      1      0
>> 19 0    0     1     0      0      0
>> 20 1    0     0     0      0      0
>> 21 1    0     0     0      0      0
>> 22 0    0     0     0      1      0
>> 23 0    0     1     0      0      0
>> 24 1    0     0     0      0      0
>> 25 0    0     0     0      1      0
>> 26 0    0     1     0      0      0
>>
>>> design.matrix.alt= model.matrix( ~strain + strain:treat)
>>> design.matrix.alt
>>     Intercept MUT WT:T1 MUT:T1 WT:T2 MUT:T2
>> 1  1         1   0     0      0     0
>> 2  1         1   0     0      0     1
>> 3  1         1   0     1      0     0
>> 4  1         1   0     0      0     0
>> 5  1         1   0     0      0     1
>> 6  1         1   0     1      0     0
>> 7  1         1   0     0      0     0
>> 8  1         1   0     0      0     0
>> 9  1         1   0     0      0     1
>> 10 1         1   0     1      0     0
>> 11 1         1   0     0      0     0
>> 12 1         1   0     0      0     1
>> 13 1         1   0     1      0     0
>> 14 1         0   0     0      0     0
>> 15 1         0   0     0      1     0
>> 16 1         0   1     0      0     0
>> 17 1         0   0     0      0     0
>> 18 1         0   0     0      1     0
>> 19 1         0   1     0      0     0
>> 20 1         0   0     0      0     0
>> 21 1         0   0     0      0     0
>> 22 1         0   0     0      1     0
>> 23 1         0   1     0      0     0
>> 24 1         0   0     0      0     0
>> 25 1         0   0     0      1     0
>> 26 1         0   1     0      0     0
>>
>> Observed equalities (as expected):
>> MUT == MUT.U - WT.U
>> WT:T1 == WT.T1 - WT.U
>> MUT:T1 == MUT.T1 - MUT.U
>> WT:T2 == WT.T2 - WT.U
>> MUT:T2 == MUT.T2 - MUT.U
>> MUT:T1 - WT:T1 == (MUT.T1 - MUT.U) - (WT.T1 - WT.U)
>> MUT:T2 - WT:T2 == (MUT.T2 - MUT.U) - (WT.T2 - WT.U)
>>
>> Observed inequalities (only w/ voom pre-processed data; unexpected):
>> WT:T1 - WT:T2 != (WT.T1 - WT.U) - (WT.T2 - WT.U)
>> MUT:T1 - MUT:T2 != (MUT.T1 - MUT.U) - (MUT.T2 - MUT.U)
>>
>> -- 
>>
>> _______________________________________________
>> Bioconductor mailing list
>> Bioconductor at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/bioconductor
>> Search the archives:
>> http://news.gmane.org/gmane.science.biology.informatics.conductor
> 
> 

-- 
Reiner Schulz, Ph.D.
Senior Lecturer in Bioinformatics and Epigenomics
Dept. of Medical and Molecular Genetics
King's College London
Guy's Hospital, 8th floor Tower Wing
London SE1 9RT
https://atlas.genetics.kcl.ac.uk/~rschulz



More information about the Bioconductor mailing list