# Improving NCBI GEO submissions of scRNA-seq data

## Code and full report

https://github.com/rnabioco/someta

## The problem

To improve reproducibility and usability, we suggest the Gene Expression Omnibus (GEO) improve its submission guidelines for processed data stemming from single-cell RNA sequencing.

Current GEO guidelines require that a count matrix is included with a submission. But because the current GEO requirements surrounding supplemental files are vague, many studies do not include downstream analysis results (e.g., cluster assignments, UMAP/t-SNE projection coordinates, and cell type classification metadata), which vary due to algorithm parameter settings and non-deterministic steps in the processing pipeline.

For single-cell RNA-seq, cell type assignments are not labeled by sample names, as would be the case in bulk RNA-seq data. Hence, a count matrix is simply an intermediate file format, similar to other intermediate formats for bulk RNA-seq experiments (BAM/SAM/BED), which also do not enable reproduction of conclusions. This is counter to GEO’s own stance on processed data, “defined as the data on which the conclusions in the related manuscript are based”. The lack of a clear GEO guideline leads to reproducibility issues, as studies that only provide count matrices require significant domain-specific expertise to associate per-cell mRNA counts with a cell type or phenotype.

We suggest that in addition to count matrices, a metadata table containing relevant information (e.g., sample, clustering, cell-type, pseudo-time information) should be a required component of single-cell RNA-seq submissions. These metadata tables are already generated by commonly used single-cell RNA-seq analysis workflows (Seurat, SingleCellExperiment, scanpy) and could easily be included with other submission components.

For example, we compare the usability and reproducibility of two single-cell mRNA-seq submissions in GEO:

GEO accession GSE137710 contains a metadata file for each sample (e.g., “GSE137710_human_melanoma_cell_metadata_9315x14.tsv.gz”), enabling rapid downstream analyses to find expression patterns and markers for newly described cell types.

In contrast, GEO accession GSE124494 only includes count matrix information, requiring a non-expert to recreate (i.e., guess) the published associations between cell-type and gene expression. This is also a particularly challenging example as the associated publication used now-outdated versions of Seurat and its integration algorithm, requiring even more work to reproduce. This metadata file was certainly created and could have easily been attached to the submission.

## Our proposal

Moving forward, we suggest two remedies to this issue:

1. Updating the GEO submission guidelines to require metadata file submissions. This would be done on https://www.ncbi.nlm.nih.gov/geo/info/seq.html by updating the “Processed data files” with a section specifically outlining required data types for single-cell mRNA-seq submissions.

2. For single-cell mRNA-seq data, in addition to standard count matrices (genes-by-cells), we expect users to deposit metadata annotations generated during the course of analysis.

Encouraging previous depositors of single-cell mRNA-seq data to update their GEO records with metadata, if it was not included in the original submission.

# Session info

    sessionInfo()
    #> R version 4.5.2 (2025-10-31)
    #> Platform: x86_64-pc-linux-gnu
    #> Running under: Ubuntu 24.04.3 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.26.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=C
    #>  [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] stats4    stats     graphics  grDevices utils     datasets  methods
    #> [8] base
    #>
    #> other attached packages:
    #>  [1] rmarkdown_2.30              SingleCellExperiment_1.33.0
    #>  [3] SummarizedExperiment_1.41.1 Biobase_2.71.0
    #>  [5] GenomicRanges_1.63.1        Seqinfo_1.1.0
    #>  [7] IRanges_2.45.0              S4Vectors_0.49.0
    #>  [9] BiocGenerics_0.57.0         generics_0.1.4
    #> [11] MatrixGenerics_1.23.0       matrixStats_1.5.0
    #> [13] cowplot_1.2.0               ggplot2_4.0.2
    #> [15] clustifyr_1.23.0            BiocStyle_2.39.0
    #>
    #> loaded via a namespace (and not attached):
    #>  [1] tidyselect_1.2.1      dplyr_1.2.0           farver_2.1.2
    #>  [4] S7_0.2.1              fastmap_1.2.0         digest_0.6.39
    #>  [7] dotCall64_1.2         lifecycle_1.0.5       cluster_2.1.8.2
    #> [10] SeuratObject_5.3.0    magrittr_2.0.4        compiler_4.5.2
    #> [13] rlang_1.1.7           sass_0.4.10           tools_4.5.2
    #> [16] utf8_1.2.6            yaml_2.3.12           data.table_1.18.2.1
    #> [19] knitr_1.51            labeling_0.4.3        S4Arrays_1.11.1
    #> [22] sp_2.2-1              DelayedArray_0.37.0   RColorBrewer_1.1-3
    #> [25] abind_1.4-8           BiocParallel_1.45.0   withr_3.0.2
    #> [28] purrr_1.2.1           sys_3.4.3             grid_4.5.2
    #> [31] colorspace_2.1-2      future_1.69.0         progressr_0.18.0
    #> [34] iterators_1.0.14      globals_0.19.0        scales_1.4.0
    #> [37] cli_3.6.5             crayon_1.5.3          otel_0.2.0
    #> [40] future.apply_1.20.1   rjson_0.2.23          httr_1.4.8
    #> [43] cachem_1.1.0          parallel_4.5.2        BiocManager_1.30.27
    #> [46] XVector_0.51.0        vctrs_0.7.1           Matrix_1.7-4
    #> [49] jsonlite_2.0.0        GetoptLong_1.1.0      clue_0.3-67
    #> [52] listenv_0.10.0        maketools_1.3.2       foreach_1.5.2
    #> [55] jquerylib_0.1.4       tidyr_1.3.2           glue_1.8.0
    #> [58] parallelly_1.46.1     spam_2.11-3           codetools_0.2-20
    #> [61] shape_1.4.6.1         gtable_0.3.6          ComplexHeatmap_2.27.1
    #> [64] tibble_3.3.1          pillar_1.11.1         htmltools_0.5.9
    #> [67] circlize_0.4.17       entropy_1.3.2         fgsea_1.37.4
    #> [70] R6_2.6.1              doParallel_1.0.17     evaluate_1.0.5
    #> [73] lattice_0.22-9        png_0.1-8             bslib_0.10.0
    #> [76] Rcpp_1.1.1            fastmatch_1.1-8       SparseArray_1.11.10
    #> [79] xfun_0.56             GlobalOptions_0.1.3   buildtools_1.0.0
    #> [82] pkgconfig_2.0.3