{"id":32111493,"url":"https://github.com/tidyomics/tidybulk","last_synced_at":"2026-02-21T10:31:34.683Z","repository":{"id":37983367,"uuid":"205042805","full_name":"tidyomics/tidybulk","owner":"tidyomics","description":"Brings bulk and pseudobulk transcriptomics to the tidyverse","archived":false,"fork":false,"pushed_at":"2025-11-12T01:06:31.000Z","size":120619,"stargazers_count":176,"open_issues_count":17,"forks_count":25,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-01-26T16:37:06.779Z","etag":null,"topics":["bioconductor","bulk-transcriptional-analyses","deseq2","differential-expression","edger","ensembl-ids","entrez","gene-symbols","gsea","mds-dimensions","pca","pipe","redundancy","tibble","tidy","tidy-data","tidyverse","transcriptomics","transcripts","tsne"],"latest_commit_sha":null,"homepage":"https://stemangiola.github.io/tidybulk/","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tidyomics.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-08-28T23:46:30.000Z","updated_at":"2026-01-11T18:54:57.000Z","dependencies_parsed_at":"2025-12-12T00:12:21.723Z","dependency_job_id":null,"html_url":"https://github.com/tidyomics/tidybulk","commit_stats":{"total_commits":1086,"total_committers":10,"mean_commits":108.6,"dds":0.09760589318600366,"last_synced_commit":"915117b885f81144605504427492283c9ad9bddd"},"previous_names":["tidyomics/tidybulk","stemangiola/tidybulk"],"tags_count":18,"template":true,"template_full_name":null,"purl":"pkg:github/tidyomics/tidybulk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tidyomics%2Ftidybulk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tidyomics%2Ftidybulk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tidyomics%2Ftidybulk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tidyomics%2Ftidybulk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tidyomics","download_url":"https://codeload.github.com/tidyomics/tidybulk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tidyomics%2Ftidybulk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29471961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T05:26:30.465Z","status":"ssl_error","status_checked_at":"2026-02-15T05:26:21.858Z","response_time":118,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bioconductor","bulk-transcriptional-analyses","deseq2","differential-expression","edger","ensembl-ids","entrez","gene-symbols","gsea","mds-dimensions","pca","pipe","redundancy","tibble","tidy","tidy-data","tidyverse","transcriptomics","transcripts","tsne"],"created_at":"2025-10-20T14:34:41.606Z","updated_at":"2026-02-21T10:31:34.677Z","avatar_url":"https://github.com/tidyomics.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"tidybulk: An R tidy framework for modular transcriptomic data analysis\n================\n\n\u003c!-- badges: start --\u003e\n\n[![Lifecycle:maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://www.tidyverse.org/lifecycle/#maturing)\n[![R build\nstatus](https://github.com/stemangiola/tidybulk/workflows/R-CMD-check/badge.svg)](https://github.com/stemangiola/tidybulk/actions/)\n[![Bioconductor\nstatus](https://bioconductor.org/shields/build/release/bioc/tidybulk.svg)](https://bioconductor.org/checkResults/release/bioc-LATEST/tidybulk/)\n\u003c!-- badges: end --\u003e\n\n**tidybulk** is a powerful R package designed for modular transcriptomic\ndata analysis that brings transcriptomics to the tidyverse.\n\n## Why tidybulk?\n\nTidybulk provides a unified interface for comprehensive transcriptomic\ndata analysis with seamless integration of SummarizedExperiment objects\nand tidyverse principles. It streamlines the entire workflow from raw\ndata to biological insights.\n\n## Functions/utilities available\n\n### Abundance Normalization Functions\n\n| Function                         | Description                             |\n|----------------------------------|-----------------------------------------|\n| `scale_abundance()`              | Scale abundance data                    |\n| `quantile_normalise_abundance()` | Quantile normalization                  |\n| `adjust_abundance()`             | Adjust abundance for unwanted variation |\n| `fill_missing_abundance()`       | Fill missing abundance values           |\n| `impute_missing_abundance()`     | Impute missing abundance values         |\n\n### Filtering and Selection Functions\n\n| Function              | Description                                         |\n|-----------------------|-----------------------------------------------------|\n| `identify_abundant()` | Identify abundant transcripts without removing them |\n| `keep_abundant()`     | Keep abundant transcripts                           |\n| `keep_variable()`     | Keep variable transcripts                           |\n| `filterByExpr()`      | Filter by expression                                |\n\n### Dimensionality Reduction Functions\n\n| Function              | Description                              |\n|-----------------------|------------------------------------------|\n| `reduce_dimensions()` | Reduce dimensions with PCA/MDS/tSNE/UMAP |\n| `rotate_dimensions()` | Rotate dimensions                        |\n| `remove_redundancy()` | Remove redundant features                |\n\n### Clustering Functions\n\n| Function                  | Description                           |\n|---------------------------|---------------------------------------|\n| `cluster_elements()`      | Cluster elements with various methods |\n| `kmeans clustering`       | K-means clustering                    |\n| `SNN clustering`          | Shared nearest neighbor clustering    |\n| `hierarchical clustering` | Hierarchical clustering               |\n| `DBSCAN clustering`       | Density-based clustering              |\n\n### Differential Analysis Functions\n\n| Function | Description |\n|----|----|\n| `test_differential_expression()` | Test differential expression with various methods |\n\n### Cellularity Analysis Functions\n\n| Function                   | Description                                 |\n|----------------------------|---------------------------------------------|\n| `deconvolve_cellularity()` | Deconvolve cellularity with various methods |\n| `cibersort()`              | CIBERSORT analysis                          |\n\n### Gene Enrichment Functions\n\n| Function                         | Description                  |\n|----------------------------------|------------------------------|\n| `test_gene_enrichment()`         | Test gene enrichment         |\n| `test_gene_overrepresentation()` | Test gene overrepresentation |\n| `test_gene_rank()`               | Test gene rank               |\n\n### Utility Functions\n\n| Function | Description |\n|----|----|\n| `describe_transcript()` | Describe transcript characteristics |\n| `get_bibliography()` | Get bibliography |\n| `resolve_complete_confounders_of_non_interest()` | Resolve confounders |\n\n### Validation and Utility Functions\n\n| Function                      | Description                       |\n|-------------------------------|-----------------------------------|\n| `check_if_counts_is_na()`     | Check if counts contain NA values |\n| `check_if_duplicated_genes()` | Check for duplicated genes        |\n| `check_if_wrong_input()`      | Validate input data               |\n| `log10_reverse_trans()`       | Log10 reverse transformation      |\n| `logit_trans()`               | Logit transformation              |\n\nAll functions are directly compatible with `SummarizedExperiment`\nobjects and follow tidyverse principles for seamless integration with\nthe tidyverse ecosystem.\n\n### Scientific Citation\n\nMangiola, Stefano, Ramyar Molania, Ruining Dong, Maria A. Doyle, and\nAnthony T. Papenfuss. 2021. “Tidybulk: An R tidy framework for modular\ntranscriptomic data analysis.” Genome Biology 22 (42).\n\u003chttps://doi.org/10.1186/s13059-020-02233-7\u003e\n\n[Genome Biology - tidybulk: an R tidy framework for modular\ntranscriptomic data\nanalysis](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-020-02233-7)\n\nIn this example we will use the `airway` dataset, a\n`SummarizedExperiment` object containing RNA-seq data from an experiment\nstudying the effect of dexamethasone treatment on airway smooth muscle\ncells. This dataset is available in the\n[airway](https://bioconductor.org/packages/airway/) package.\n\n``` r\nlibrary(airway)\ndata(airway)\n```\n\n### Comparison of  Differential Expression methods\n\n\n``` r\n# Standard differential expression analysis\nairway = airway |\u003e\n\n# Use QL method\n    test_differential_expression(~ dex, method = \"edgeR_quasi_likelihood\", prefix = \"ql__\") |\u003e\n    \n    # Use edger_robust_likelihood_ratio\n    test_differential_expression(~ dex, method = \"edger_robust_likelihood_ratio\", prefix = \"lr_robust__\") |\u003e\n    \n# Use DESeq2 method\n    test_differential_expression(~ dex, method = \"DESeq2\", prefix = \"deseq2__\") |\u003e\n    \n    # Use limma_voom\n    test_differential_expression(~ dex, method = \"limma_voom\", prefix = \"voom__\") |\u003e\n\n# Use limma_voom_sample_weights\n    test_differential_expression(~ dex, method = \"limma_voom_sample_weights\", prefix = \"voom_weights__\") \n```\n\n\n### Histograms of p-values across methods\n\nInspection of the raw p-value histogram provides a rapid check of\ndifferential-expression results. When no gene is truly differentially\nexpressed, the p-values follow a uniform U(0,1) distribution across the\ninterval 0–1, so the histogram appears flat\n[Source](https://bioconductor.org/help/course-materials/2014/useR2014/Workflows.html).\nIn a more realistic scenario where only a subset of genes changes, this\nuniform background is still present but an obvious spike emerges close\nto zero, created by the genuine signals.\n\nThanks to the modularity of the `tidybulk` workflow, that can multiplex\ndifferent methods, we can easily compare the p-values across methods.\n\n``` r\nairway |\u003e\n  pivot_transcript() |\u003e \n  select(\n    ql__PValue, \n    lr_robust__PValue, \n    voom__P.Value, \n    voom_weights__P.Value, \n    deseq2__pvalue\n  ) |\u003e \n  pivot_longer(everything(), names_to = \"method\", values_to = \"pvalue\") |\u003e\n  ggplot(aes(x = pvalue, fill = method)) +\n  geom_histogram(binwidth = 0.01) +\n  facet_wrap(~method) +\n  my_theme +\n  labs(title = \"Histogram of p-values across methods\")\n```\n\n    ## Warning: Removed 30 rows containing non-finite outside the scale range\n    ## (`stat_bin()`).\n\n![](README_files/figure-gfm/differential-expression-pvalue-histograms-1.png)\u003c!-- --\u003e\n\n### Compare Results Across Methods\n\n``` r\n# Summary statistics\nairway |\u003e pivot_transcript() |\u003e select(contains(\"ql|lr_robust|voom|voom_weights|deseq2\")) |\u003e select(contains(\"logFC\")) |\u003e \nsummarise(across(everything(), list(min = min, median = median, max = max), na.rm = TRUE))\n```\n\n    ## Warning: There was 1 warning in `summarise()`.\n    ## ℹ In argument: `across(...)`.\n    ## Caused by warning:\n    ## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.\n    ## Supply arguments directly to `.fns` through an anonymous function instead.\n    ## \n    ##   # Previously\n    ##   across(a:b, mean, na.rm = TRUE)\n    ## \n    ##   # Now\n    ##   across(a:b, \\(x) mean(x, na.rm = TRUE))\n\n    ## # A tibble: 1 × 0\n\n### Pairplot of pvalues across methods (GGpairs)\n\n``` r\nlibrary(GGally)\n```\n\n    ## Warning: package 'GGally' was built under R version 4.5.1\n\n``` r\nairway |\u003e \n  pivot_transcript() |\u003e \n  select(ql__PValue, lr_robust__PValue, voom__P.Value, voom_weights__P.Value, deseq2__pvalue) |\u003e \n  ggpairs(columns = 1:5) +\n  scale_x_continuous(trans = tidybulk::log10_reverse_trans()) +\n  scale_y_continuous(trans = tidybulk::log10_reverse_trans()) +\n  my_theme +\n  labs(title = \"Pairplot of p-values across methods\")\n```\n\n![](README_files/figure-gfm/differential-expression-pvalue-pairplot-1.png)\u003c!-- --\u003e\n\n### Pairplot of effect sizes across methods (GGpairs)\n\n``` r\nlibrary(GGally)\nairway |\u003e \n  pivot_transcript() |\u003e \n  select(ql__logFC, lr_robust__logFC, voom__logFC, voom_weights__logFC, deseq2__log2FoldChange) |\u003e \n  ggpairs(columns = 1:5) +\n  my_theme +\n  labs(title = \"Pairplot of effect sizes across methods\")\n```\n\n![](README_files/figure-gfm/differential-expression-effectsize-pairplot-1.png)\u003c!-- --\u003e\n\n\n### Quality Control \n\nIt is important to check the quality of the fit. All methods produce a\nfit object that can be used for quality control. The fit object produced\nby each underlying method is stored as an attribute of the\n`airway_mini` object. We can use them, for example, to perform quality\ncontrol of the fit.\n\n#### For edgeR\n\nPlot the biological coefficient of variation (BCV) trend. This plot is\nhelpful in understanding the dispersion of the data.\n\n``` r\nlibrary(edgeR)\n```\n\n``` r\nmetadata(airway)$tidybulk$edgeR_quasi_likelihood_object |\u003e\n  plotBCV()\n```\n\n![](README_files/figure-gfm/differential-expression-edgeR-object-1.png)\u003c!-- --\u003e\n\nPlot the log-fold change vs mean plot.\n\n``` r\nlibrary(edgeR)\n\nmetadata(airway)$tidybulk$edgeR_quasi_likelihood_fit |\u003e\n  plotMD()\n```\n\n![](README_files/figure-gfm/differential-expression-edgeR-fit-1.png)\u003c!-- --\u003e\n\n#### For DESeq2\n\nPlot the mean-variance trend.\n\n``` r\nlibrary(DESeq2)\n\nmetadata(airway)$tidybulk$DESeq2_object |\u003e\n  plotDispEsts()\n```\n\n![](README_files/figure-gfm/differential-expression-DESeq2-object-1.png)\u003c!-- --\u003e\n\nPlot the log-fold change vs the mean plot.\n\n``` r\nlibrary(DESeq2)\n\nmetadata(airway)$tidybulk$DESeq2_object |\u003e\n  plotMA()\n```\n\n![](README_files/figure-gfm/differential-expression-DESeq2-fit-1.png)\u003c!-- --\u003e\n\n\n### Volcano Plots for Each Method\n\nVisualising the significance and effect size of the differential\nexpression results as a volcano plot, we appreciate that some methods\nhave much lower p-value distributions than other methods, for the same\nmodel and data.\n\n``` r\n# Create volcano plots\nairway |\u003e\n\n    # Select the columns we want to plot\n    pivot_transcript() |\u003e \n    select(\n            .feature,\n      ql__logFC, ql__PValue,\n      lr_robust__logFC, lr_robust__PValue,\n      voom__logFC, voom__P.Value,\n      voom_weights__logFC, voom_weights__P.Value,\n      deseq2__log2FoldChange, deseq2__pvalue\n    ) |\u003e\n\n    # Pivot longer to get a tidy data frame\n    pivot_longer(\n      - .feature,\n      names_to = c(\"method\", \"stat\"),\n      values_to = \"value\", names_sep = \"__\"\n    ) |\u003e\n\n    # Harmonize column names\n    mutate(stat  = case_when(\n        stat %in% c(\"logFC\", \"log2FoldChange\") ~ \"logFC\",\n        stat %in% c(\"PValue\", \"pvalue\", \"P.Value\", \"p.value\") ~ \"PValue\"\n    )) |\u003e\n  pivot_wider(names_from = \"stat\", values_from = \"value\") |\u003e\n  unnest(c(logFC, PValue)) |\u003e \n\n    # Plot\n  ggplot(aes(x = logFC, y = PValue)) +\n  geom_point(aes(color = PValue \u003c 0.05, size = PValue \u003c 0.05)) +\n  scale_y_continuous(trans = tidybulk::log10_reverse_trans()) +\n  scale_color_manual(values = c(\"TRUE\" = \"red\", \"FALSE\" = \"black\")) +\n  scale_size_manual(values = c(\"TRUE\" = 0.5, \"FALSE\" = 0.1)) +\n  facet_wrap(~method) +\n  my_theme +\n  labs(title = \"Volcano Plots by Method\")\n```\n\n    ## Warning: Removed 30 rows containing missing values or values outside the scale range\n    ## (`geom_point()`).\n\n![](README_files/figure-gfm/differential-expression-volcano-plots-1-1.png)\u003c!-- --\u003e\n\nPlotting independent y-axis scales for the p-values and effect sizes\nallows us to compare the top genes across methods.\n\n**Methods:**\n\n- **edgeR quasi-likelihood:** Quasi-likelihood F-tests for differential\n  expression\n\n- **edgeR robust likelihood ratio:** Robust likelihood ratio tests\n\n- **DESeq2:** Negative binomial distribution with dispersion estimation\n\n- **limma-voom:** Linear modeling with empirical Bayes moderation\n\n- **limma-voom with sample weights:** Enhanced voom with quality weights\n  **References:**\n\n- Robinson et al. (2010) edgeR: a Bioconductor package for differential\n  expression analysis\n\n- Chen et al. (2016) From reads to genes to pathways: differential\n  expression analysis of RNA-Seq experiments using Rsubread and the\n  edgeR quasi-likelihood pipeline\n\n- Love et al. (2014) Moderated estimation of fold change and dispersion\n  for RNA-seq data with DESeq2\n\n- Law et al. (2014) voom: precision weights unlock linear model analysis\n  tools for RNA-seq read counts\n\n- Liu et al. (2015) Why weight? Modelling sample and observational level\n  variability improves power in RNA-seq analyses\n\n\n## Automatic bibliography\n\n`tidybulk` allows you to get the bibliography of all methods used in our\nworkflow.\n\n``` r\n# Get bibliography of all methods used in our workflow\nairway |\u003e get_bibliography()\n```\n\n    ##  @Article{tidybulk,\n    ##   title = {tidybulk: an R tidy framework for modular transcriptomic data analysis},\n    ##   author = {Stefano Mangiola and Ramyar Molania and Ruining Dong and Maria A. Doyle \u0026 Anthony T. Papenfuss},\n    ##   journal = {Genome Biology},\n    ##   year = {2021},\n    ##   volume = {22},\n    ##   number = {42},\n    ##   url = {https://genomebiology.biomedcentral.com/articles/10.1186/s13059-020-02233-7},\n    ##   }\n    ## @article{wickham2019welcome,\n    ##   title={Welcome to the Tidyverse},\n    ##   author={Wickham, Hadley and Averick, Mara and Bryan, Jennifer and Chang, Winston and McGowan, Lucy D'Agostino and Francois, Romain and Grolemund, Garrett and Hayes, Alex and Henry, Lionel and Hester, Jim and others},\n    ##   journal={Journal of Open Source Software},\n    ##   volume={4},\n    ##   number={43},\n    ##   pages={1686},\n    ##   year={2019}\n    ##  }\n    ## @article{robinson2010edger,\n    ##   title={edgeR: a Bioconductor package for differential expression analysis of digital gene expression data},\n    ##   author={Robinson, Mark D and McCarthy, Davis J and Smyth, Gordon K},\n    ##   journal={Bioinformatics},\n    ##   volume={26},\n    ##   number={1},\n    ##   pages={139--140},\n    ##   year={2010},\n    ##   publisher={Oxford University Press}\n    ##  }\n    ## @article{robinson2010scaling,\n    ##   title={A scaling normalization method for differential expression analysis of RNA-seq data},\n    ##   author={Robinson, Mark D and Oshlack, Alicia},\n    ##   journal={Genome biology},\n    ##   volume={11},\n    ##   number={3},\n    ##   pages={1--9},\n    ##   year={2010},\n    ##   publisher={BioMed Central}\n    ##  }\n    ## @incollection{smyth2005limma,\n    ##   title={Limma: linear models for microarray data},\n    ##   author={Smyth, Gordon K},\n    ##   booktitle={Bioinformatics and computational biology solutions using R and Bioconductor},\n    ##   pages={397--420},\n    ##   year={2005},\n    ##   publisher={Springer}\n    ##  }\n    ## @Manual{,\n    ##     title = {R: A Language and Environment for Statistical Computing},\n    ##     author = {{R Core Team}},\n    ##     organization = {R Foundation for Statistical Computing},\n    ##     address = {Vienna, Austria},\n    ##     year = {2020},\n    ##     url = {https://www.R-project.org/},\n    ##   }\n    ## @article{lund2012detecting,\n    ##   title={Detecting differential expression in RNA-sequence data using quasi-likelihood with shrunken dispersion estimates},\n    ##   author={Lund, Steven P and Nettleton, Dan and McCarthy, Davis J and Smyth, Gordon K},\n    ##   journal={Statistical applications in genetics and molecular biology},\n    ##   volume={11},\n    ##   number={5},\n    ##   year={2012},\n    ##   publisher={De Gruyter}\n    ##     }\n    ## @article{zhou2014robustly,\n    ##   title={Robustly detecting differential expression in RNA sequencing data using observation weights},\n    ##   author={Zhou, Xiaobei and Lindsay, Helen and Robinson, Mark D},\n    ##   journal={Nucleic acids research},\n    ##   volume={42},\n    ##   number={11},\n    ##   pages={e91--e91},\n    ##   year={2014},\n    ##   publisher={Oxford University Press}\n    ##  }\n    ## @article{love2014moderated,\n    ##   title={Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2},\n    ##   author={Love, Michael I and Huber, Wolfgang and Anders, Simon},\n    ##   journal={Genome biology},\n    ##   volume={15},\n    ##   number={12},\n    ##   pages={550},\n    ##   year={2014},\n    ##   publisher={Springer}\n    ##  }\n    ## @article{law2014voom,\n    ##   title={voom: Precision weights unlock linear model analysis tools for RNA-seq read counts},\n    ##   author={Law, Charity W and Chen, Yunshun and Shi, Wei and Smyth, Gordon K},\n    ##   journal={Genome biology},\n    ##   volume={15},\n    ##   number={2},\n    ##   pages={R29},\n    ##   year={2014},\n    ##   publisher={Springer}\n    ##     }\n    ## @article{liu2015weight,\n    ##   title={Why weight? Modelling sample and observational level variability improves power in RNA-seq analyses},\n    ##   author={Liu, Ruijie and Holik, Aliaksei Z and Su, Shian and Jansz, Natasha and Chen, Kelan and Leong, Huei San and Blewitt, Marnie E and Asselin-Labat, Marie-Liesse and Smyth, Gordon K and Ritchie, Matthew E},\n    ##   journal={Nucleic acids research},\n    ##   volume={43},\n    ##   number={15},\n    ##   pages={e97--e97},\n    ##   year={2015},\n    ##   publisher={Oxford University Press}\n    ##     }\n    ## @article{leek2012sva,\n    ##   title={The sva package for removing batch effects and other unwanted variation in high-throughput experiments},\n    ##   author={Leek, Jeffrey T and Johnson, W Evan and Parker, Hilary S and Jaffe, Andrew E and Storey, John D},\n    ##   journal={Bioinformatics},\n    ##   volume={28},\n    ##   number={6},\n    ##   pages={882--883},\n    ##   year={2012},\n    ##   publisher={Oxford University Press}\n    ##  }\n    ## @article{newman2015robust,\n    ##   title={Robust enumeration of cell subsets from tissue expression profiles},\n    ##   author={Newman, Aaron M and Liu, Chih Long and Green, Michael R and Gentles, Andrew J and Feng, Weiguo and Xu, Yue and Hoang, Chuong D and Diehn, Maximilian and Alizadeh, Ash A},\n    ##   journal={Nature methods},\n    ##   volume={12},\n    ##   number={5},\n    ##   pages={453--457},\n    ##   year={2015},\n    ##   publisher={Nature Publishing Group}\n    ##  }\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftidyomics%2Ftidybulk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftidyomics%2Ftidybulk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftidyomics%2Ftidybulk/lists"}