[BioC] Limma: correct calculation of B statistics (log odds)

Gordon Smyth smyth at wehi.EDU.AU
Thu Apr 27 06:18:03 CEST 2006

Hi Ben,

Well, all models are approximate, the real question is, how sensitive 
are they to deviations from model assumptions which are likely to 
occur in practice. The two-sample t-test holds up remarkably well 
under moderate deviations from normality, equal variances etc. On the 
other hand, the variance test you have used is known to be 
exceptionally sensitive to its assumptions. You might be amused by 
George Box's comment, on the the subject of testing equality of 
variances before doing a t-test:

    "To make the preliminary test on variances is rather like putting 
to sea in a rowing boat to find out whether conditions are 
sufficiently calm for an ocean liner to leave port."

    See http://www.garfield.library.upenn.edu/classics1982/A1982MX29400001.pdf

In the microarray context, you could well explore inequality of 
variances if you have large samples in both groups, but I would 
suggest you do this more robustly and descriptively than var.test(). 
If you have small sample sizes, my experience is that there are 
usually many other more important factors to worry about than this.

Best wishes

At 07:57 AM 27/04/2006, Wittner, Ben, Ph.D. wrote:
>Dear Gordon,
>I apologize for not thanking you more quickly for your detailed and thoughtful
>response. I think I agree with everything you've said below, but now I have
>another concern on which I would like your opinion.
>For many of the data sets I've dealt with, for many genes, the 
>variances of the
>two classes do not seem to be equal. For example, the code below uses R's
>var.test() to produce a p-value for each gene and then plots a 
>histogram of the
>p-values. The histogram can be viewed at
>The model implemented in limma seems to assume a single variance for 
>each gene.
>Do you think this is a problem?
>Thanks again,
>pdat <- pData(ALL)
>subset <- intersect(grep('^B', as.character(pdat$BT)),
>                     which(pdat$mol %in% c('BCR/ABL', 'NEG')))
>eset <- ALL[, subset]
>i1 <- which(eset$mol == 'BCR/ABL')
>i2 <- which(eset$mol == 'NEG')
>pvals <- apply(exprs(eset), 1, function(v) (var.test(v[i1], v[i2])$p.value))
>jpeg(filename='ALL.jpeg', width=240, height=240)
>hist(pvals, col='green',
>      main='Histogram of var.test() pvals for ALL BCR/ABL vs NEG')

More information about the Bioconductor mailing list