[BioC] LIMMA No residual using rmaPLM

Gordon Smyth smyth at wehi.edu.au
Wed Sep 7 04:06:13 CEST 2005


>Date: Mon, 05 Sep 2005 13:51:38 +0300
>From: "Ron Ophir" <ron.ophir at weizmann.ac.il>
>Subject: [BioC] LIMMA No residual using rmaPLM
>To: <bioconductor at stat.math.ethz.ch>
>Message-ID: <s31c4d86.078 at wisemail.weizmann.ac.il>
>Content-Type: text/plain
>
>Hi
>I am analyzing affymetrix data having the following experimental
>design:
> > analysis$design
>                 Normal IOP IOPC
>L91RAE230 2.CEL      0   1    0
>L92RAE230 2.CEL      0   1    0
>L93RAE230 2.CEL      0   0    1
>L94RAE230 2.CEL      0   0    1
>L95RAE230 2.CEL      1   0    0
>L96RAE230 2.CEL      1   0    0
>  and following contrasts
> > analysis$contrasts
>        IOPC.IOP IOPC.Normal IOP.Normal
>Normal        0          -1         -1
>IOP          -1           0          1
>IOPC          1           1          0
>The preprocessing was done using affyPLM packge
>analysis$data<-rmaPLM(analysis$raw)
>where analysis$raw is AfyyBatch object. Then I fitted the the model
>once with weighting matrix using AMP flags
>fm<-as.matrix(analysis$Flags!="A")
>analysis$fit<-lmFit(analysis$data,analysis$design,w=matrix(as.numeric(fm),dim(fm)[1],dim(fm)[2],dimnames=dimnames(fm)))
>   and got a reasonable results and once without this matrix. What was
>surprising is that fitting without the weighting matrix I got the
>following error message:
> > analysis$bayes<-eBayes(analysis$contrasts.fit)
>Error in ebayes(fit = fit, proportion = proportion, stdev.coef.lim =
>stdev.coef.lim) :
>         No residual degrees of freedom in linear model fits
>I've checked the fit coeffecient matrix (analyis$fit object) and is all
>NA.
>Does someone have an idea why? I did not applied any weighting matrix
>for this fitting.

As Ben has already explained, you are implicitly using a weighting matrix 
here because your 'PLMset' object contains a slot 'se.chip.coefs' from 
which limma is attempting to construct probe-set weights. (Basically the 
weight for each expression value is the inverse squared se, with some 
moderation to prevent absurd values.) You can easily turn this off by using

    lmFit(..., weights=NULL)

The philosophy is this: If the se.chip.coefs slot is empty, then limma will 
take the se's and hence the weights to be all equal. If however this slot 
is set to be a matrix with entirely NA values, then limma will assume (and 
this is the crucial thing) that the se's are not only missing but 
non-ignorable. Hence it passes NA weights to the lmFit and hence you end up 
with no useful data.

I am open to suggestion that limma should do something different. My 
feeling which motivates the current behaviour is that slots in data objects 
are only set (or should only be set) when they really mean something. Hence 
they should not be ignored without specific direction to do so, even if 
they contain NA values.

Gordon

>Thanks
>Ron



More information about the Bioconductor mailing list