Changes in version 3.18.0: o new function beadCountWeights() to estimate quantitative weights from the bead counts for each probe for Illumina BeadArrays. o New function contrastAsCoef(), which reforms a design matrix so that one or more specified contrasts become coefficients. This function is called by roast(). o plotMA() is now an S3 generic function. o The legend argument to plotMA() can now take a character value giving the position to place the legend. o toptable(), topTable() and topTreat() now preserve the rownames of the fit object, unless the fit object has duplicated names, in which case the rownames are copied to the ID column. Empty rownames are replaced with 1:nrow(fit). o read.ilmn() no longer adds the probe IDs to the gene annotation data.frame, leaving them instead as rownames of the expression matrix. It longer creates a targets file since the sample names are already preserved as column names of the expression matrix. o loessFit() now uses the locfit.raw in the locfit package when weights are provided instead of loess in the stats package. The function now runs very efficiently even on very long data vectors. The output results will change slightly when weights are provided. o voom() now outputs lib.size as a column of targets instead of as a separate component. o cbind for EList and EListRaw objects now recognizes a design matrix if it is present. o plotMDS() now checks explicitly that there are at least 3 samples to plot. o normexp.fit.detection.p() now tolerates some non-monotonicity in the detection p-pvalues as a function of expression. o fitFDistRobustly() now uses a smoother for the smallest df.prior values. This may result in smaller tail values than before when a group of input x values appear to be outliers but the largest value is not individually a stand-out value. o New merge methods for EList and EListRaw objects. o topTable() and treat() now give more informative error messages when the argument fit is not a valid MArrayLM object. o roast() now calls mroast() if the index vector is a list. Bug fix to mroast(), which had been ignoring the weights. o Updates to genas() function. argument chooseMethod renamed to subset and option "n" renamed to "all". Function now returns NA results and a message when no genes satisfy the criterion for inclusion in the analysis. Some editing of help page and streamlining of code. o Roles of contributors now specified in author field of DESCRIPTION file using standard codes. o Additions and updates to references in the help pages. Removed defunct Berkeley Press links to published Smyth (2004) article in several Rd files. Replacing with link to Preprint. Added link to Phipson (2013) thesis in two Rd files. Add Majewski et al reference to genas.Rd. Add Phipson et al and Sartor et al references to squeezeVar.Rd. Add Phipson et al reference to eBayes.Rd. Update lmscFit and voom references. o Update mammmary stem cell case study in User's Guide. As well as reflecting changes to read.ilmn() and topTable(), this now demonstrates how to find signature genes for particular cell type. o documentation about rownames and column names and the use of rownames(fit) and colnames(fit) added to lmFit.Rd. o improvements to help pages for data classes. o Edits to normalizeBetweenArrays help page (i) to further clarify which normalization methods are available for single-channel data and which are available for two-color data and (ii) to give a cross citation to the neqc() function for Illumina BeadChips. o Edits to voomaByGroup help page. o duplicateCorrelation() now uses the weights matrix when block is set. Previously the weights were ignored when block was used. o Bug fix to subsetting for MArrayLM objects: the df.total component was not being subsetted. o bug fix to eBayes(robust=TRUE) when some of the df.prior values are infinite. o Bug fix to ebayes(), which was not passing the 'robust' argument correctly on to squeezeVar(). o Bug fix to fitFDistRobustly(), which affected the estimated scale when df2 is estimated to be Inf. Changes in version 3.16.0: o New section in User's Guide on time course experiments with many time points. The RNA-seq case study in User's Guide has also been revised. o Improvements to various help pages including read.maimages.Rd, squeezeVar.Rd, fitFDist.Rd, trigammaInverse.Rd, normalizeRobustSpline.Rd, genas.Rd and roast.Rd. Previously the meaning of source="agilent" was mis-stated in read.maimages.Rd. o New robust method for estimating the empirical Bayes prior, called by specifying robust=TRUE in the call to eBayes(). When this is TRUE the output df.prior is now a vector instead of a scalar. o New function fitFDistRobustly() estimates the parameters of a scaled F-distribution robustly using Winsorized values. Outlier observations receive smaller values for df.prior than non-outliers. This permits robust methods for squeezeVar(), ebayes() and eBayes(), all of which now have a new argument wins.tail.p to specify the tail proportions for Winsorizing. o fitFDist() now permits infinite values for the covariate. It also gracefully handles cases where the covariate takes only a small number of distinct values. Similarly for eBayes() and squeezeVar() that call fitFDist(). o All the functions that perform gene set tests have been revised to make the input and output formats more consistent. roast(), mroast() and camera() are now S3 generic functions, with methods for EList and MAList objects. The order of arguments has been changed for roast(), mroast() and camera() so that the first argument is now y. All functions that perform gene sets now use the argument 'index' to specify which genes are included in the test set. Previously this argument was called 'iset' for roast() and romer() and 'indices' for camera(). camera() and mroast() now produce a data.frames. Instead of separate up and down p-value columns, there is now a two-sided p-value and a column indicating direction of change. There are new columns giving FDR values and the number of genes in each set. There is a new argument 'sort' to indicate whether output results should be sorted by p-value. mroast() has a new argument 'weights' for observational weights, to bring it into line with roast(), o vennDiagram() can now plot up to five sets (previously limited to three). o genas() now optionally draws a plot in which ellipses are used to represent the technical and biological components of correlation. It also now has the ability to automatically select which probes are used for the correlation analysis, and a new argument controls the method used for this selection. o New options for the method argument of propTrueNull(). o New functions vooma() and voomaByGroup() for computing precision weights based on a mean-variance trend. vooma() is similar to voom() but for microarray data instead of RNA-Seq. voomaByGroup() allows different groups to have systematically different variances. o New function predFCm() to compute predictive (shrunk) log fold changes. o New function fitGammaIntercept() for estimating the intercept of a gamma glm with an offset. Used by genas(). o New function zscoreHyper() for computing z-score equivalents of deviates from a hypergeometric distribution. o New function qqf() for qq-plots relative to an F-distribution. o normalizeWithinArrays() with method="robustspline" now longer requires the layout argument to be set. The layout argument for normalizeRobustSpline() now defaults to a single print-tip group. o fitFDist() now coerces degrees of freedom df1 below 1e-15 to zero. o Due to changes in R, loessFit() no longer makes direct calls to foreign language code in the stats package, and instead calls R functions. Unfortunately, this makes loessFit() about 25-30% slower than previously when weights are used. o Bug fix to read.maimages(), which was not accepting source="agilent.mean". o Bug fix for contrasts.fit() when the covariance matrix of the coefficients (cov.coefficients) is not found in the fitted model object. This situation doesn't arise using any of the standard limma analysis pipelines. o Bug fix to lmscFit() when the residual df = 1. o Bug fix to readTargets() to avoid warning message when targets$Label is used to set row names but targets$Label contains duplicated entries. Changes in version 3.14.0: o limma license upgraded to GPL (>=2) instead of LGPL to match R itself. o Many updates to the User's Guide. Sections have been added on reading single channel Agilent and Illumina data. The chapter on experimental designs has been split into three chapters on single-channel, common reference and two-color designs respectively. The material on the fixed effect approach to technical replication has been deleted. There are new sections on nested interactions for factorial designs and on multi-level designs. o The links to the Apoa1, Weaver and Bob1 datasets in the User's Guide have been updated to help users download the data themselves if they wish to repeat the case study analyses. o The help page for camera() now cites published paper Wu and Smyth (NAR, 2012). In view of the results of this paper, the claim is no longer made on help page for geneSetTest() that genes might be treated as independent when the experimental units are genetically identical mice. o Minor edits to CITATION file. o New function propTrueNull() for fast estimation of the proportion of true null hypotheses from a vector of p-values. o New function zscore() to compute z-score equivalents for deviates from any continuous distribution. Includes the functionality of the older functions zscoreGamma() and zscoreT() as special cases. o roast() now accepts observation level weights, through a new argument 'weights'. o loessFit() now applies minimum and maximum bounds by default to avoid zero or infinite weights. Equal weights are now treated as if the weights were NULL, even all zero weights, so that the lowess code is called instead of the loess code. o When there are no weights, loessFit() now extracts residuals directly from the C code output instead of computing in R. o fitFDist() now permits missing values for x or zero values for df1 even when there is a covariate. This means that squeezeVar() and eBayes() now work with trends even when not all the data values are informative. o New argument 'file' for convest(), implementing edits contributed by Marcus Davy. Arguments doplot and dereport renamed to 'plot' and 'report'. o Two improvements for plotMDS(). It now coerces labels to be character, and now makes extra room on the plot when the text labels are wide. o plotMDS() no longer gives an error when the requested number of top genes is greater than the total number of rows of data. o Code speed-up for alias2SymbolTable() o any(duplicated()) replaced by anyDuplicated() in several functions. o Fix to voom() so that it computes weights correctly even when the design matrix is not of full rank. o Bug fix for roast() when the fitted model has only one coefficient. Changes in version 3.12.0: o read.maimages() with source="agilent" now reads median foreground estimates instead of mean foreground. New option source= "agilent.mean" preserves earlier meaning of source="agilent". o Agilent single-channel case study added to User's Guide. o removeBatchEffect() now corrects for continuous covariates as well as qualitative factors. o new function camera() performs competitive gene set tests while adjusting for inter-gene correlation. o new function interGeneCorrelation() estimates the average intergene correlation for a set of genes. o columns in output from roast() have been re-ordered. o arguments 'selected' and 'selected2' renamed to 'index' and 'index2' in functions barcodeplot(), geneSetTest() and wilcoxGST(). o default labels for barcodeplot() are now somewhat more explicit. o new function rankSumTestWithCorrelation extends the Wilcoxon-Mann-Whitney test to allow for correlation between cases in one of the groups. geneSetTest() now calls this function instead of wilcox.test, with a consequence improvement in speed. o The lfc (log-fold-change) cutoff argument of topTable() is now applied to the minimum absolute logFC when ranking by F-statistic. Previously lfc was only used when ranking by t-statistic. o new methods "fast" and "affy" for normalizeCyclicLoess(), with "fast" becoming the default method. New argument 'cyclic.method' for normalizeBetweenArrays() gives access to the different cyclic loess methods. o There were problems with using the argument gene.weights in mroast(). This argument is now permitted to be of the same length as the number of probes in the data set. It is then automatically subsetted for each gene set. o mroast() now uses mid-p-values by default when adjusting for multiple testing. o neqc(), nec() and normexp.fit.control() now give user-friendly error messages when no negative control probes or no regular probes are found. Changes in version 3.10.0: o New function voom() allows RNA-Seq experiments to be analysed using the standard limma pipeline. An RNA-Seq case study is added to User's Guide. o treat(), roast() and mroast() can now estimate and work with a trend on the prior variance, bringing them into line with eBayes(). o barcodeplot() and barcodeplot2() merged into one function. o removeBatchEffect() can now correct for two batch factors. o plotMDS is now an S3 generic function. This allows MDS plots to be redrawn with new labels without needing to repeat the distance or scaling calculations. New S4 class "MDS" to hold the multidimensional scaling information output from plotMDS. o getEAWP() now gets probe annotation from the expression rownames of an EList object, if no other probe annotation is available. o topRomer() now ranks gene sets by secondary columns as well the primary criterion specified, to give a more meaningful ranking when the p-values are tied. o wilcoxGST() now accepts signed or unsigned test statistics. Change to p-value calculation in geneSetTest() when rank.only=FALSE to avoid zero p-values and follow recommendation of Phipson and Smyth (SAGMB, 2010). o plotMA() now recognizes ElistRaw and EList objects appropriately. o Default span for normalizeCyclicLoess increased from 0.4 to 0.7. Speed improved when weights=NULL. o Weaver case study (Section 11.5) in User's Guide is updated and rewritten. Data classes ElistRaw and Elist now described in the quick start section of the User's Guide. Other minor updates to User's Guide. o Bug fix for normalizeBetweenArrays() when object is an EListRaw and method="cyclicloess". Previously this function was applying cyclicloess to the raw intensities, then logging. Now it logs first, then applies cyclicloess. o Bug fix to avereps() for EList objects x when x$other is not empty.