Introduction to prolfqua

Introduction

prolfqua covers the steps of a label-free quantification (LFQ) proteomics analysis: quality control, normalization, aggregation of peptides to proteins, modelling, hypothesis testing and sample size estimation (Wolski et al. 2022).

The package works with data in long format, one row per measured feature (protein, peptide, precursor) and sample. Three building blocks carry an analysis:

  • AnalysisConfiguration maps the columns of the table to their roles: the feature hierarchy (protein, peptide, …), the explanatory factors, the sample and the intensity column.
  • LFQData holds the data together with its configuration. Its methods return helpers for transformation (get_Transformer()), aggregation (get_Aggregator()), summary statistics (get_Stats()), missing-value summaries (get_Summariser()) and plots (get_Plotter()).
  • build_contrast_analysis() fits a model per protein and computes the requested contrasts. The method argument selects the model: linear models (lm, rlm, rfit), limma and limma-voom, DEqMS variance moderation, Firth logistic regression for presence/absence, mixed models and ROPECA on peptide-level data, and variants that impute groups without observations at the limit of detection.

Every method returns an object with the same interface: get_contrasts(), get_Plotter(), get_missing() and to_wide(). Results of different methods therefore have the same columns and can be compared or combined directly.

Installation

Install prolfqua from Bioconductor with:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")
}
BiocManager::install("prolfqua")

The development version is available on GitHub:

BiocManager::install("fgcz/prolfqua")

Quick start

We simulate peptide-level intensities for 100 proteins measured in three groups (A, B and Ctrl). sim_lfq_data_peptide_config() returns the data together with a matching AnalysisConfiguration.

library(prolfqua)
istar <- sim_lfq_data_peptide_config(Nprot = 100, seed = 1234)
lfqdata <- LFQData$new(istar$data, istar$config)
lfqdata$factors() |> head()
#> # A tibble: 6 × 3
#>   sample sampleName group_
#>   <chr>  <chr>      <chr> 
#> 1 A_V1   A_V1       A     
#> 2 A_V2   A_V2       A     
#> 3 A_V3   A_V3       A     
#> 4 A_V4   A_V4       A     
#> 5 B_V1   B_V1       B     
#> 6 B_V2   B_V2       B

We \(\log_2\) transform the intensities, scale them robustly, and aggregate the peptides to proteins with Tukey’s median polish.

lfqdata <- lfqdata$get_Transformer()$log2()$robscale()$lfq
lfqprot <- lfqdata$get_Aggregator()$aggregate()
lfqprot$get_Plotter()$intensity_distribution_density()
Distribution of the normalized protein intensities per sample.

Distribution of the normalized protein intensities per sample.

We compare groups A and B with the control group, using limma’s moderated linear model.

contrasts <- c(
  "A_vs_Ctrl" = "group_A - group_Ctrl",
  "B_vs_Ctrl" = "group_B - group_Ctrl"
)
fa <- build_contrast_analysis(lfqprot, "~ group_", contrasts, method = "limma")
res <- fa$get_contrasts()
head(res[, c("protein_Id", "contrast", "diff", "p.value", "FDR")])
#> # A tibble: 6 × 5
#>   protein_Id  contrast     diff    p.value       FDR
#>   <chr>       <chr>       <dbl>      <dbl>     <dbl>
#> 1 0EfVhX~3967 A_vs_Ctrl  0.199  0.000123   0.000397 
#> 2 0m5WN4~6025 A_vs_Ctrl  0.178  0.0000160  0.0000726
#> 3 0YSKpy~2865 A_vs_Ctrl -0.175  0.00277    0.00554  
#> 4 3QLHfm~8938 A_vs_Ctrl  0.214  0.00456    0.00807  
#> 5 3QYop0~7543 A_vs_Ctrl -0.221  0.00000298 0.0000179
#> 6 76k03k~7094 A_vs_Ctrl -0.0822 0.00980    0.0156
fa$get_Plotter()$volcano()$FDR
Volcano plot of the two contrasts.

Volcano plot of the two contrasts.

All available methods are listed by list_facades():

names(list_facades())
#>  [1] "binomial_nested"   "deqms"             "deqms_voom"       
#>  [4] "firth"             "firth_nested"      "limma"            
#>  [7] "limma_impute"      "limma_voom"        "limma_voom_impute"
#> [10] "limpa"             "limpa_nested"      "lm"               
#> [13] "lm_impute"         "lmer_nested"       "rfit"             
#> [16] "rfit_impute"       "rlm"               "ropeca_nested"

Further documentation

The package website https://fgcz.github.io/prolfqua/ holds the full set of tutorials:

The vignette Comparing two groups with prolfqua is also part of this package.

Session info

sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] prolfqua_0.99.2  dplyr_1.2.1      BiocStyle_2.41.0
#> 
#> loaded via a namespace (and not attached):
#>   [1] Rdpack_2.6.6           gridExtra_2.3.1        rlang_1.3.0           
#>   [4] magrittr_2.0.5         clue_0.3-68            GetoptLong_1.1.1      
#>   [7] otel_0.2.0             matrixStats_1.5.0      compiler_4.6.1        
#>  [10] mgcv_1.9-4             png_0.1-9              vctrs_0.7.3           
#>  [13] pkgconfig_2.0.3        shape_1.4.6.1          crayon_1.5.3          
#>  [16] fastmap_1.2.0          backports_1.5.1        labeling_0.4.3        
#>  [19] utf8_1.2.6             promises_1.5.0         rmarkdown_2.32        
#>  [22] nloptr_2.2.1           UpSetR_1.4.1           purrr_1.2.2           
#>  [25] xfun_0.61              glmnet_5.1             jomo_2.7-6            
#>  [28] logistf_1.26.1         cachem_1.1.0           jsonlite_2.0.0        
#>  [31] progress_1.2.3         later_1.4.8            pan_2.0               
#>  [34] prettyunits_1.2.0      broom_1.0.13           parallel_4.6.1        
#>  [37] cluster_2.1.8.3        R6_2.6.1               bslib_0.12.0          
#>  [40] stringi_1.8.9          RColorBrewer_1.1-3     limma_3.99.0          
#>  [43] boot_1.3-32            rpart_4.1.27           jquerylib_0.1.4       
#>  [46] Rcpp_1.1.2             iterators_1.0.14       knitr_1.52            
#>  [49] IRanges_2.47.5         httpuv_1.6.17          Matrix_1.7-6          
#>  [52] splines_4.6.1          nnet_7.3-21            tidyselect_1.2.1      
#>  [55] yaml_2.3.12            doParallel_1.0.17      codetools_0.2-20      
#>  [58] lattice_0.23-1         tibble_3.3.1           plyr_1.8.9            
#>  [61] shiny_1.14.0           withr_3.0.3            S7_0.2.2              
#>  [64] evaluate_1.0.5         survival_3.8-12        circlize_0.4.18       
#>  [67] pillar_1.11.1          BiocManager_1.30.27    mice_3.19.0           
#>  [70] KernSmooth_2.23-27     foreach_1.5.2          stats4_4.6.1          
#>  [73] reformulas_0.4.4       plotly_4.12.1          generics_0.1.4        
#>  [76] hms_1.1.4              S4Vectors_0.51.10      ggplot2_4.0.3         
#>  [79] scales_1.4.0           minqa_1.2.8            xtable_1.8-8          
#>  [82] glue_1.8.1             lazyeval_0.2.3         maketools_1.3.2       
#>  [85] tools_4.6.1            sys_3.4.3              data.table_1.18.6.1   
#>  [88] lme4_2.0-6             forcats_1.0.1          buildtools_1.0.0      
#>  [91] grid_4.6.1             tidyr_1.3.2            rbibutils_2.4.1       
#>  [94] crosstalk_1.2.2        colorspace_2.1-4       nlme_3.1-171          
#>  [97] formula.tools_1.7.1    cli_3.6.6              viridisLite_0.4.3     
#> [100] ComplexHeatmap_2.29.0  gtable_0.3.6           sass_0.4.10           
#> [103] digest_0.6.39          operator.tools_1.6.3.1 BiocGenerics_0.59.12  
#> [106] ggrepel_0.9.8          rjson_0.2.23           htmlwidgets_1.6.4     
#> [109] farver_2.1.2           htmltools_0.5.9        lifecycle_1.0.5       
#> [112] httr_1.4.9             mime_0.13              GlobalOptions_0.1.4   
#> [115] mitml_0.4-5            statmod_1.5.2          MASS_7.3-66

References

Wolski, Witold E., Paolo Nanni, Jonas Grossmann, Maria d’Errico, Ralph Schlapbach, and Christian Panse. 2022. “Prolfqua: A Comprehensive R-package for Proteomics Differential Expression Analysis.” bioRxiv, ahead of print. https://doi.org/10.1101/2022.06.07.494524.