Skip to content

v2.0.0

Latest

Choose a tag to compare

@sebastian-gregoricchio sebastian-gregoricchio released this 10 Aug 08:19
· 5 commits to main since this release
d9b9c4a

v2.0.0 - August 7th 2026

  • added the protein.info slot to the DEprot and DEprot.analyses objects: an optional annotation table with one row per protein (gene symbol, description, number of peptides, etc.), kept row-by-row aligned with the counts
  • load.counts2() (and load.counts()) accept a protein.info table at loading; the IDs can be given as row names, in a prot.id column or in any column indicated by protein.info.id.column. The table is re-ordered on the counts: unannotated proteins are filled with NA and annotations of proteins absent from the counts are discarded
  • added add.protein.info() to attach, replace or remove the annotation of an object built previously
  • added get.protein.info() to extract the annotation table from an object, in the same fashion as get.metadata()
  • the annotation is propagated by filter.proteins(), remove.undetected.proteins(), harmonize.batches(), filter.samples() and by all the diff.analyses*() functions
  • get.results() gains protein.info.columns and protein.info.prefix: the annotation is appended only on request, using the keywords "none" (default) and "all" or a vector of column names. The columns are bound to the results by protein ID (not by position) and colliding names are made unique
  • export.analyses() writes the annotated results tables
  • objects created with previous versions of the package remain usable: the missing slot is interpreted as an absent annotation
  • added missingness.diagnostic(): classifies the missing values as MNAR-like or MCAR-like following the same rule of the double-imputation strategy, estimates the limit of detection by a logistic dropout model (LOD50), and returns the diagnostic plots (detection vs abundance densities, dropout curve, imputation map, Jaccard similarity of the detection patterns with dendrogram, per-sample and per-class summaries, UpSet of the MNAR-like patterns)
  • the parameters of randomize.missing.values (group.column, percentage.missing, tail.percentage) are retrieved automatically when the randomization has already been run; the counts are selected at the lowest level available (raw > normalized > randomized > imputed)
  • contrast-level diagnostics are computed when a DEprot.analyses object is provided, including the directional MNAR classification and the testable flag for the proteins missing in both groups
  • added class DEprot.missingness with show, summary and plot methods
  • fixed the ComplexUpset themes in plot.upset(), which were not valid anymore since ggplot2 v4.0.0
  • added time-course analyses: analyze.timecourse() returns an object of the new class DEprot.timecourse (with show, summary and plot methods). Time is handled as a numeric covariate: a natural-spline basis is fitted by limma and all the time coefficients are tested jointly by a moderated F-test, resulting in a single test per protein and therefore in no contrast to define
  • analyze.timecourse(): the spline degrees of freedom are capped automatically at n.timepoints - 2 (a saturated spline being equivalent to treating the time as a factor), and a linear trend is fitted below 4 timepoints; the time.transform option (log2, log10, log1p, sqrt) re-spaces log-spaced designs so that the last timepoint does not dominate the fit
  • analyze.timecourse(): the results table reports the kinetic descriptors of each fitted trajectory (amplitude, initial.slope, peak.time, trend.shape: monotone/transient/complex) together with the cluster assignment, the membership and the ranking score
  • analyze.timecourse(): the trending proteins are soft-clustered (c-means, or PAM) on the Z-scored fitted curves rather than on the raw timepoint means, which makes the clustering robust to unequal time spacing and to missing values; the fuzzifier and the number of clusters are estimated from the data when not provided
  • added rank.timecourse() to re-rank the proteins, globally and within each cluster, without refitting the model, and get.timecourse.results() to retrieve the results with cluster/top-N subsetting
  • added plot.timecourse.protein() (measured points, mean ± SEM and fitted trajectory of individual proteins) and plot.timecourse.profiles() (one panel per cluster, lines colored by membership). Both accept values = "counts", "log2FC" (relative to reference.time) or "zscore"
  • added heatmap.timecourse(): heatmap of the trending proteins with the rows split by cluster, sortable by rank, membership, peak.time, amplitude or hclust, and displaying either the measured means or the smooth fitted trajectories
  • added timecourse.enrichment(): over-representation analyses run independently on each cluster, using all the quantified proteins as universe, returning an object of the new class DEprot.timecourse.enrichment (with show and plot methods). The dotplot shows the enrichment as dot size, the significance as color, and the number of proteins of the geneset written inside each dot
  • splines, e1071 and cluster added to the dependencies
  • added combine.enrichments(): merges a named list of enrichments in a single dotplot, with the discoveries on the x-axis and the genesets on the y-axis; the dots are sized by fold enrichment or gene ratio, colored by significance, and carry the protein count inside
  • added divergent.enrichment(): plots two enrichments back-to-back, the second one with the sign inverted, to show together the two sides of the same contrast (e.g. ORA of the up- and down-regulated proteins); bar length can be FoldEnrichment, GeneRatio, Count, NES or padj
  • both functions accept a mix of DEprot.enrichResult, DEprot.timecourse.enrichment, enrichResult/gseaResult (clusterProfiler) objects and plain result tables; a DEprot.timecourse.enrichment is expanded into one discovery per cluster
  • added the internal helpers .parse.ratio(), .get.enrichment.table() and .collect.enrichments(), which harmonize the columns of GSEA and ORA results (for a GSEA the leading edge is used as equivalent of the ORA Count); timecourse.enrichment() now uses the exported .parse.ratio() instead of its local copy
  • added export.external(): converts a DEprot/DEprot.analyses object into a SummarizedExperiment, QFeatures, MSnSet, limma::EList or a plain list of tables, with the shortcuts as.SummarizedExperiment(), as.QFeatures() and as.MSnSet()
  • all the count matrices available are exported as assays, the metadata become the column annotation, and protein.info together with the differential results become the row annotation
  • the parameters that the destination classes cannot store (log base, normalization/imputation methods, contrasts, thresholds) are kept in the metadata of the exported object; keep.object = TRUE allows a lossless round-trip
  • SummarizedExperiment, QFeatures and MSnbase are optional dependencies: requested only when needed and never installed without confirmation
  • added detect.outliers(): automatic per-sample QC flagging combining median inter-sample correlation, robust Mahalanobis distance in PC space and missing rate; returns a DEprot.outliers object (with show and plot methods) whose outliers slot can be passed directly to filter.samples()
  • added diff.analyses.proDA(): differential analyses on left-censored data using proDA. The missing values are not replaced but modelled as observations below the detection limit, so that the uncertainty on the undetected values propagates into lfcSE instead of being compressed by the imputation. It requires counts that still contain the missing values (which.data = "normalized") and it is the natural continuation of a strongly-MNAR verdict of missingness.diagnostic(), whose output can be passed directly through missingness.object
    the results table of diff.analyses.proDA() keeps the columns of the other differential functions and adds n.detected. and n.approx; each contrast stores a proDA.fit element with the fitted model and the per-sample dropout curves
  • filter.samples() recognizes the new engine and re-runs the contrasts with the stored parameters
  • diff.analyses.limma() now returns the lfdr column when padj.method = "fdrtool", as already stated in the manual proDA added to the dependencies
  • updated overview vignette, manual and tests accordingly
  • added time-course vignette

Full Changelog: 1.3.1...2.0.0