[BioC] Problem with limma's topTable lfc filter when more than 1 contrast is in output

Vladimir Zhurov vzhurov2 at uwo.ca
Sat Jan 21 05:52:10 CET 2012


Alex Gutteridge <alexg at ...> writes:

> 
> On 20.01.2012 05:11, Vladimir Zhurov wrote:
> >> ...
> >
> > Dear Bioconductors,
> >
> > I am having the following problem which can be due to a 
> > misunderstanding,
> > or an actual problem with topTable function in limma package.
> >
> > As far as I understand lfc and p filters should work together in 
> > filtering
> > topTable results. Am I correct in this regard?
> >
> > If it is an intended situation then the problem is the following: 
> > when more
> > than one contrasts is reported lfc filter does not affect the output. 
> > Which
> > is shown in the sample R session below.
> >
> > I would appreciate you help.
> >
> > Regards.
> >
> > Vladimir.
> >
> 
> Hi Vladimir,
> 
> I think the issue maybe that it is not clear (to me anyway!) what 
> result one would expect with a lfc filter on a table with multiple 
> contrasts. Should rows where all contrasts are above the cutoff be 
> reported? Or where any are? It doesn't seem to be explicit in the docs, 
> but my assumption is that to avoid confusion topTable ignores lfc= in 
> the case you describe.
> 
> Perhaps decideTests() is what you are really looking for? You can then 
> index a topTable generated data.frame with the results of decideTests. 
> E.g (pseudo-code not tested!)
> 
> tt = topTable(fit,p.value=1,number=Inf,sort.by="none")
> dt = decideTests(fit,p.value=0.05,lfc=1)
> 
> tt[dt[,1] != 0 & dt[,2] != 0 & dt[,3] !=0,] #Gives rows where all 
> contrasts pass filter (assuming 3 contrasts)
> tt[dt[,1] != 0 | dt[,2] != 0 | dt[,3] !=0,] #Gives rows where any 
> contrast passes filter
> 

Alex,

Thank you for your input. I was considering decideTests but wanted to check
whether there is something that can be done with topTable. I think that it would
be nice at very least to explain intended behavior in more details in the manual
for a case of multiple contrasts comparison.

Anyway, I ended up with the following workaround (lets say lfc=1, p=0.05 and no
adjustment of p value):

tt.all<-topTable(fit.eb, sort.by="none", number=Inf, adjust.method="none")
dt<-decideTests(fit.eb, lfc=1, p=0.05, adjust.method="none", method="separate")
rs<-rowSums(abs(dt))
tt<-tt.all[rs >= 1,] # a single contrast above lfc will be sufficient

One may think that you are done at this point. However, decideTests with
method="separate" recapitulates topTable performed on individual contrasts. As a
result there are extra probes which will be reported and will have p value above
cut-off when topTable is done across multiple comparisons. They need to be
further filtered out.

tt.filt<-tt[tt$adj.P.Val < 0.05,]

Regards.

Vladimir.



More information about the Bioconductor mailing list