Differential Expression Analysis.
Overview
This report tests whether normalized protein abundances differ between experimental groups. It provides the sample design, quality diagnostics, and statistical evidence needed to interpret differential protein abundance.
Input: quantified protein abundances from 12 samples, analysed with DIANN. The detailed source-data reference is recorded in Session Info.
Analysis background
The differential expression analysis verifies if the difference between normalized empirical protein abundances measured in two groups is significantly non-zero. To make the test as sensitive and specific as possible, the methods used to measure (Taverna and Gaspari 2021) and estimate protein abundances (Grossmann et al. 2010) are optimized to minimize the biochemical and technical variance. In addition, these empirical abundances \(A\) are further \(log_2\) transformed and scaled to make them compatible with the statistical test procedure (Välikangas et al. 2018). Therefore, we obtain a scale free \(\log_2\) transformed normalized protein abundances \(\log_2(A)\) for a sample.
For unpaired experiments the difference \(\Delta\) between group \(a\) and \(b\), for a specific protein is estimated by:
\[ \Delta = \frac{1}{n}\sum_{i=1}^n \log_2(A^a_i) - \frac{1}{m}\sum_{j=1}^{m}\log_2(A^b_j) \]
where \(A^a_i\) - is the normalized protein abundance of sample \(i\) in the group \(a\) of \(n\) samples, while \(A^b_j\) is the protein abundance of sample \(j\) in group \(b\) of \(m\) samples.
For paired experiments, the difference is estimated by:
\[ \Delta = \frac{1}{n}\sum_{i=1}^n \log_2(A^a_i) - \log_2(A^b_{i}) \]
where \(n\) is the number of subjects, each treated with \(a\) and \(b\).
Of note, when comparing two samples \(a\) and \(b\) the difference of logarithms equals the logarithm of the ratio (exponent rule):
\[ \log(A^a) - \log(A^b) = \log(\frac{A^a}{A^b}) \]
It is called the \(\log\)-ratio or \(\log\) fold-change (logFC).
The estimated differences \(\Delta\) have an associated error \(\epsilon\). Therefore, the differential expression analysis must test if the difference is significantly nonzero.
We run a set of functions implemented in the R package [prolfqua] (Wolski et al. 2023) to filter and normalize the data, generate visualizations, and to compute differential expression analysis. To further improve the power of the differential expression test the protein variances are moderated (Smyth 2004), i.e. the individual protein variances are updated using a variance prior estimated from all the proteins in the experiment.
Results
Table 1 shows the number of samples assigned to each group while Table 2 shows the names of the files assigned to the group.
| group_ | # samples |
|---|---|
| A | 4 |
| B | 4 |
| Ctrl | 4 |
| sample | sampleName | group_ | nr_1 | nr_2 |
|---|---|---|---|---|
| A_V1 | A_V1 | A | 97 | 69 |
| A_V2 | A_V2 | A | 98 | 73 |
| A_V3 | A_V3 | A | 100 | 68 |
| A_V4 | A_V4 | A | 97 | 72 |
| B_V1 | B_V1 | B | 96 | 74 |
| B_V2 | B_V2 | B | 99 | 72 |
| B_V3 | B_V3 | B | 97 | 75 |
| B_V4 | B_V4 | B | 98 | 71 |
| Ctrl_V1 | Ctrl_V1 | Ctrl | 100 | 72 |
| Ctrl_V2 | Ctrl_V2 | Ctrl | 96 | 69 |
| Ctrl_V3 | Ctrl_V3 | Ctrl | 97 | 72 |
| Ctrl_V4 | Ctrl_V4 | Ctrl | 98 | 72 |
Peptide and Protein identification
The protein matrix is filtered using the following threshold:
- Minimum number of peptides / protein: 1.
The overall number of proteins in this experiment is: 100. The percentage of contaminant proteins is:0 %. The percentage of decoy proteins among quantified entries is: 0 %.
We keep the contaminant proteins because, for some experiments, these contaminants are relevant. They are recognizable by identifiers starting with zz or CON, are flagged in the result tables, and are drawn as triangles in the volcano plot. Decoy sequences (identifiers starting with REV or rev) are retained in the raw and abundance exports for traceability, but they are excluded from the model fit so they cannot distort the variance moderation that is shared across proteins. They therefore carry no fold change, p-value, or FDR, and do not appear in the volcano plot or the differentially-expressed set. Their proportion among quantified entries (reported above) serves as an empirical false-discovery signal for the whole quantified data set — not for the differentially-expressed list.
Figure 1 shows the number of quantified proteins with one or more peptides per sample.
Figure 2 shows the number of quantified proteins with two or more peptides per sample.
Missing Value Analysis
The absence of a protein measurement in a sample might be biologically relevant or might point to technical problems. Significant differences in the set of proteins observed in the samples within a group typically indicate either technical problems or excessive biological variability. If one sample out of ten has a different set of proteins, it is likely an outlier and can be removed from the analysis. If the differences between the groups are significant but within the groups are small, this might systematically bias the difference estimates, i.e., produce false-positive or false-negative test results.
A dichotomous view of the data can be constructed by transforming protein abundance estimates into present/absent calls (Figure 3). The heatmap shows only proteins with at least one missing value. There are 20 proteins with at least one missing value in the data, which is (20 %).
We expect that samples in the same group are more similar and cluster together, i.e., they are in the same branch of the dendrogram.
Using Figure 4 we examine if we see the same proteins in each group. We say a protein is unobserved in the group if it is absent in all samples and is present otherwise. A significant overlap among groups allows more precise estimation of the protein abundance differences between the groups.
Protein Abundance Analysis
The density plot (Figure 5 left panel) displays the protein abundance distribution for all data set samples. Major differences between samples could indicate that the individual protein abundance values are affected by technical biases. These biases might need to be corrected to separate them from biological effects. The right panel of Figure 5 shows the distribution of the transformed and scaled normalized empirical protein abundances. Normalization is applied to remove systematic differences in protein abundances due to different sample concentrations or amounts of sample loaded on a column. However, in the presence of a large proportion of missing data, normalization potentially amplifies systematic errors.
To do this the z-score of the \(\log_2\) transformed protein abundances are computed. Because we need to estimate the protein differences on the original scale, we have to multiply the \(z\)-score by the average standard deviation of all the \(N\) samples in the experiment. After normalization all samples have an equal mean and variance and a similar distribution.
The median coefficient of variation (CV) of a group of samples or all samples in the dataset, can be used to compare the experiment with other experiments (Piehowski et al. 2013). For example, the median CV for high-performance liquid chromatography experiments ranges from 2% to 35% depending on the biological samples studied, the chromatography method used, label-free or labelled quantification (Taverna and Gaspari 2021).
Figure 6 shows the coefficients of variation (CV) for all proteins computed on non-normalized data. Ideally the within group CV should be smaller than the CV of all samples.
Table 3 shows the median CV of all groups and across all samples (all).
| what | A | B | Ctrl | All |
|---|---|---|---|---|
| CV | 3.47 | 3.37 | 3.64 | 9.32 |
The protein abundance heatmap (Figure 7) groups the protein and samples using unsupervised hierarchical clustering. Distances between proteins and samples are computed using normalized protein abundances. Proteins with a large proportion of missing observations are not shown in this heatmap, because for these proteins no distance can be computed. Proteins and samples showing similar abundances are grouped and shown in adjacent rows and columns respectively.
We use principal component analysis (PCA) to transform the high-dimensional space defined by all proteins into a two-dimensional one containing most of the information. Figure 8 shows the location of the samples according to the first and second principal component, which explain most of the variance in the data. Samples close in the PCA plot are more similar than those farther apart.
Differential Expression Analysis
The method used to test for differential expression consists of several steps: First a model that explains the observed protein abundances using the grouping of the samples is fitted to each protein with the selected backend (the modelName/facade key; by default a linear model fitted with the R function lm):
normalized_abundance ~ group_.
Secondly, the difference between the groups is computed (Table 4).
| name | contrast |
|---|---|
| AVsC | group_A - group_Ctrl |
| BVsC | group_B - group_Ctrl |
and a null hypothesis significance test (NHST) is conducted, where the null hypothesis is that the protein is not differentially expressed (Faraway 2004).
If there are no abundances measured in one of the groups for some proteins, we assume the observations are missing because the protein abundance is below the detection limit. Therefore, we estimate the detection limit using the mean of the \(1\%\) smallest group averages. Furthermore, to make it explicit how each estimate was produced, the estimate_type column (see table in Figure 9) records whether a row was fit from observed data, rescued via LOD imputation (lod_imputed), or filled from a group-mean fallback (missing_fallback); rescued/fallback rows are visualized with a distinct colour in Figure 10. The modelName column records the selected analysis method (the facade key, e.g. lm, rfit, limma).
Next, to increase the power of the analysis variance shrinkage is performed (Smyth 2004). Finally, the false discovery rate (FDR) using the Benjamini-Hochberg procedure is computed (Benjamini and Hochberg 1995). The FDR is the expected proportion of false discoveries in a list of proteins, and can be used to select candidates for follow up experiments. FDR thresholds commonly used are 5, 10 or 25%. By filtering the proteins using an FDR threshold of 10 % we can expect this proportion of false positives in the list and 90 % truly differentially expressed proteins. Because we do not know which of them are true positives follow up experiments are necessary.
The table (Figure 9) summarizes the differential expression analysis results by providing the following information:
- protein_Id - unique protein identifier
- description - information about the protein provided in the FASTA database
- contrast - name of the comparison
- modelName - selected analysis method (facade key, e.g.
lm,rfit,limma) - estimate_type - how the estimate was produced:
observed,lod_imputed, ormissing_fallback - FDR - false discovery rate
- diff - difference between groups.
The volcano plot Figure 10 helps to identify proteins with large differences among groups and a low FDR. The significance dimension is a \(-\log_{10}\) transformed FDR, i.e., small values of FDR become large after transformation. Promising candidate proteins are found in the upper right and left sector of the plot.
estimate_type, so rows estimated by missing-value imputation or group-mean fallback are visually distinguished from observed fits.
Differentially Expressed Proteins
Here we use the FDR threshold of 0.1 and a difference threshold of 0.2 to select differentially expressed proteins. Table 5 summarizes the number of significant calls.
| contrast | n | Significant | Not Significant |
|---|---|---|---|
| AVsC | 100 | 40 | 60 |
| BVsC | 100 | 37 | 63 |
The table shown in Figure 11 lists all the significant proteins.
Furthermore, Figure 12 shows a co-clustered heatmap of the row z-scored protein abundances of all significant calls. Proteins and samples with similar abundance profiles are grouped by unsupervised hierarchical clustering.
Additional Analysis
The zip file contains an Excel file DE_Groups_vs_Controls.xlsx. All the figures can be recreated using the data in the excel file. The Excel file contains the following spreadsheets:
- annotation - the annotation of the samples in the experiment
- raw_abundances table with empirical protein abundances.
- normalized_abundances table with normalized protein abundances.
- raw_abundances_matrix A table where each column represents a sample and each row represents a protein and the cells store the empirical protein abundances.
- normalized_abundances_matrix A table where each column represents a sample and each row represents a protein and the cells store the empirical protein abundances.
- diff_exp_analysis A table with the results of the differential expression analysis. For each protein there is a row containing the estimated difference between the groups, the false discovery rate FDR, the 95% confidence interval, the posterior degrees of freedom.
- missing_information - spreadsheet containing information if a protein is present (1) or absent in a group (0).
- protein_variances - spreadsheet which for each protein shows the variance (var) or standard deviation (sd) within a group, the number of samples (n) and the number of observations (not_na) as well as the group average intensity (mean).
The data can be used to perform functional enrichment analysis (Monti et al. 2019). To compare the obtained results with known protein interactions we recommend the string-db.org (Szklarczyk et al. 2017), which is a curated database of protein-protein interaction networks for a large variety of organisms. To simplify the data upload to string-db we include text files containing the uniprot ids:
-
ORA_background.txtall proteins. -
ORA_<contrast_name>.txtproteins accepted with the FDR and difference threshold.
Other web applications allowing to run over representation analysis (ORA) (Monti et al. 2019) are:
Furthermore, protein IDs sorted by t-statistic can then be subjected to gene set enrichment analysis (GSEA) (Subramanian et al. 2005). To simplify running GSEA, we provide the file:
GSEA_<contrast_name>.rnk
This file can be used with the webgestalt web application or used with the GSEA application from gsea-msigdb
For questions and improvement suggestions, with respect to this report, please contact protinf@fgcz.uzh.ch.
Session Info
| Field | Value |
|---|---|
| Workunit ID | 23000 |
| Order ID | 6200 |
| Project ID | 3000 |
| Project name | n/a |
| Creator | runner |
| Created at | 2026-07-29 11:16:46 UTC |
| Input data | https://fgcz-bfabric.uzh.ch/bfabric/ |
| Quantification software | DIANN |
| Model | lm_impute |
| prolfquapp version | 2.6.1 |
R version 4.6.1 (2026-06-24)
Platform: x86_64-pc-linux-gnu
locale: LC_CTYPE=C.UTF-8, LC_NUMERIC=C, LC_TIME=C.UTF-8, LC_COLLATE=C.UTF-8, LC_MONETARY=C.UTF-8, LC_MESSAGES=C.UTF-8, LC_PAPER=C.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=C.UTF-8 and LC_IDENTIFICATION=C
attached base packages: stats, graphics, grDevices, utils, datasets, methods and base
other attached packages: dplyr(v.1.2.1)
loaded via a namespace (and not attached): RColorBrewer(v.1.1-3), jsonlite(v.2.0.0), shape(v.1.4.6.1), magrittr(v.2.0.5), jomo(v.2.7-6), farver(v.2.1.2), logistf(v.1.26.1), nloptr(v.2.2.1), rmarkdown(v.2.31), GlobalOptions(v.0.1.4), vctrs(v.0.7.3), minqa(v.1.2.8), progress(v.1.2.3), htmltools(v.0.5.9), S4Arrays(v.1.12.0), forcats(v.1.0.1), broom(v.1.0.13), cellranger(v.1.1.0), SparseArray(v.1.12.2), mitml(v.0.4-5), sass(v.0.4.10), bslib(v.0.11.0), htmlwidgets(v.1.6.4), plyr(v.1.8.9), cachem(v.1.1.0), plotly(v.4.12.1), mime(v.0.13), lifecycle(v.1.0.5), iterators(v.1.0.14), pkgconfig(v.2.0.3), Matrix(v.1.7-5), R6(v.2.6.1), fastmap(v.1.2.0), shiny(v.1.14.0), rbibutils(v.2.4.1), MatrixGenerics(v.1.24.0), clue(v.0.3-68), digest(v.0.6.39), dtplyr(v.1.3.3), colorspace(v.2.1-3), lobstr(v.1.2.1), S4Vectors(v.0.50.1), crosstalk(v.1.2.2), GenomicRanges(v.1.64.0), labeling(v.0.4.3), httr(v.1.4.8), abind(v.1.4-8), mgcv(v.1.9-4), compiler(v.4.6.1), withr(v.3.0.3), bit64(v.4.8.2), doParallel(v.1.0.17), pander(v.0.6.6), S7(v.0.2.2), backports(v.1.5.1), logger(v.0.4.2), UpSetR(v.1.4.1), prolfquasaint(v.0.1.5), pan(v.2.0), MASS(v.7.3-65), DelayedArray(v.0.38.2), rjson(v.0.2.23), optparse(v.1.8.2), tools(v.4.6.1), otel(v.0.2.0), httpuv(v.1.6.17), nnet(v.7.3-20), glue(v.1.8.1), promises(v.1.5.0), nlme(v.3.1-169), grid(v.4.6.1), cluster(v.2.1.8.2), generics(v.0.1.4), operator.tools(v.1.6.3.1), gtable(v.0.3.6), tzdb(v.0.5.0), formula.tools(v.1.7.1), preprocessCore(v.1.74.0), tidyr(v.1.3.2), data.table(v.1.18.4), hms(v.1.1.4), XVector(v.0.52.0), BiocGenerics(v.0.58.1), ggrepel(v.0.9.8), foreach(v.1.5.2), pillar(v.1.11.1), stringr(v.1.6.0), limma(v.3.68.4), later(v.1.4.8), circlize(v.0.4.18), splines(v.4.6.1), lattice(v.0.22-9), survival(v.3.8-6), bit(v.4.6.0), tidyselect(v.1.2.1), ComplexHeatmap(v.2.28.0), knitr(v.1.51), reformulas(v.0.4.4), gridExtra(v.2.3.1), prolfquapp(v.2.6.1), bookdown(v.0.47), IRanges(v.2.46.0), Seqinfo(v.1.2.0), SummarizedExperiment(v.1.42.0), stats4(v.4.6.1), xfun(v.0.60), prolfqua(v.1.7.0), Biobase(v.2.72.0), statmod(v.1.5.2), matrixStats(v.1.5.0), DT(v.0.34.0), stringi(v.1.8.7), lazyeval(v.0.2.3), yaml(v.2.3.12), boot(v.1.3-32), evaluate(v.1.0.5), codetools(v.0.2-20), tibble(v.3.3.1), BiocManager(v.1.30.27), cli(v.3.6.6), affyio(v.1.82.0), rpart(v.4.1.27), xtable(v.1.8-8), arrow(v.25.0.0), Rdpack(v.2.6.6), jquerylib(v.0.1.4), Rcpp(v.1.1.2), readxl(v.1.5.0), png(v.0.1-9), parallel(v.4.6.1), ggplot2(v.4.0.3), readr(v.2.2.0), assertthat(v.0.2.1), prettyunits(v.1.2.0), lme4(v.2.0-6), glmnet(v.5.0), viridisLite(v.0.4.3), scales(v.1.4.0), affy(v.1.90.0), purrr(v.1.2.2), crayon(v.1.5.3), writexl(v.1.5.4), GetoptLong(v.1.1.1), rlang(v.1.3.0), vsn(v.3.80.0) and mice(v.3.19.0)
References
Glossary
- groups - different treatments, genotypes etc.
- diff (difference) - it is the difference of the protein abundance estimate of two groups
- FDR - false discovery rate
This report was generated from the Quarto template Grp2Analysis_V2_R6.qmd included in the prolfquapp R package (version 2.6.1).