CZ CELLxGENE — 单细胞转录组标准化数据平台

来源 CZI Single-Cell Biology, 社区贡献发布时间: 2026-08-04最后更新: 2026-08-04 阅读 67
CZ CELLxGENE — 单细胞转录组标准化数据平台

信息速览

数据集名称CZ CELLxGENE — 单细胞转录组标准化数据平台
数据类型H5AD AnnData, TileDB-SOMA
规模约 17,651 名人类供体
接入方式CZI Single-Cell Biology, 社区贡献
AI 就绪度

数据集封面

CZ CELLxGENE — 单细胞转录组标准化数据平台

千方医数集 · AI Ready 数据集 | 状态:published

CZ CELLxGENE 是全球最大、增长最快的标准化单细胞转录组平台。其 Census 组件 (LTS 2025-11-08) 以 TileDB-SOMA 格式统一了 2.17 亿细胞(1.62 亿人类 + 4,630 万小鼠 + 1,000 万其他灵长类),覆盖 898 种细胞类型和 417 种组织。通过严格的 ONTOLOGY 对齐标注(Cell Ontology + UBERON + MONDO + EFO)和原始 Count Matrix 标准化,Census 已成为所有单细胞 AI 基础模型——scGPT (33M 细胞预训练)、Geneformer (30M/104M)、UCE (36M)、CellFM (>100M)、TranscriptFormer (112M)——的标准预训练数据源。CZI 于 2025 年 2 月启动的 Billion Cells Project 目标在首年生成近 5 亿细胞数据,将单细胞 AI 推向下一个量级。

§0 出版与审核声明:page_status: published。核心论文:CZI Single-Cell Biology Program, bioRxiv 2023.10.30.563174 (2023)。数据版本:Census LTS 2025-11-08(Census Schema 2.4.0, Dataset Schema 7.0.0)。维护方:Chan Zuckerberg Initiative (CZI) + Lattice Curation Team (Stanford University)。许可:CC BY 4.0。点击导航:§1 概览 | §2 科学背景 | §3 技术规格 | §4 数据结构 | §5 下载 | §6 AI 指南 | §7 坑点 | §8 SOTA | §9 资源 | §10 声明卡 | §C 校验

§1 概览

§1.1 平台定位

CZ CELLxGENE (Chan Zuckerberg CELL by GENE) 是由 Chan Zuckerberg Initiative (CZI) 于 2017 年发起、2018 年正式发布的单细胞转录组交互式数据平台。其核心使命是将全球分散的单细胞测序数据统一到一个标准化、可互操作的数据基础设施中,使研究人员能够无需下载数据即可在云端查询、分析、建模数亿细胞的基因表达谱。

CELLxGENE 由三个互补组件构成:

组件 定位 用户界面 核心技术 目标用户
Discover Web 门户 浏览器 React + WebGL 可视化 生物学家/临床医生
Census 程序化访问 Python/R API TileDB-SOMA 列式存储 计算生物学家/AI 研究者
Annotate 桌面工具 本地安装 (MIT) Python + Flask + D3 实验生物学家/策展人

§1.2 Census LTS 2025-11-08 核心统计

指标 人类 小鼠 猕猴 绒猴 黑猩猩 合计
总细胞数 162,025,130 46,299,127 7,010,229 2,275,451 158,099 217,767,936
独特细胞数 99,633,637 21,029,771 2,929,014 1,712,738 158,099 125,463,259
数据集数 — — — — — 1,845
细胞类型 898 473 54 40 25 —
组织 417 101 29 33 1 —
组织大类 70 36 2 1 1 —
Assay 类型 37 16 2 1 1 —
疾病 192 16 1 1 1 —
发育阶段 194 66 4 3 1 —
自报种族 33 1 1 1 1 —

独特细胞(unique cells)指去除重复后实际参与 Census 构建的细胞数。总细胞数大于独特细胞数是因为同一细胞可能出现在多个数据集中(如同一数据集被多个研究引用),Census 通过 is_primary_data 标志去重。

§1.3 版本演进时间线

时间 里程碑 关键变化
2017 CZI 成立 Chan Zuckerberg Initiative 成立,单细胞生物学列为优先方向
2018.06 CELLxGENE Discover 上线 首批 8 个数据集,React 前端,UMAP/t-SNE 交互可视化
2019 CELLxGENE Annotate 发布 开源桌面工具 (MIT),支持协作式细胞类型标注
2020 Lattice 策展团队成立 Stanford 大学获 CZI 资助,专职数据标准化策展
2022.03 Schema 1.0 发布 首个正式数据提交规范,强制 ONTOLOGY 对齐
2022.12 Census v1 (“stable”) 首个 Census 版本,~50M 细胞,TileDB-SOMA 格式
2023.10 bioRxiv 预印本发表 CZI Single-Cell Biology, doi:10.1101/2023.10.30.563174
2023.12 Census LTS 2023-12-15 73M 细胞,Schema 3.0,加入小鼠数据
2024.02 scGPT 发表 (Nature Methods) 首个基于 CELLxGENE 预训练的单细胞基础模型
2024.05 TranscriptFormer 预印本 CZI 自研基础模型,12 物种 112M 细胞
2024.07 Schema 5.0 → 6.0 新增多组学字段、空间转录组支持
2025.01 Census LTS 2025-01-30 125M 细胞,Schema 6.1,加入 TranscriptFormer 嵌入
2025.02 Billion Cells Project 启动 目标首年 5 亿细胞,CZI 投入 $2.5 亿
2025.06 Schema 7.0 发布 disease 字段支持多值,feature_name 不再唯一
2025.11 Census LTS 2025-11-08 当前稳定版:217M 细胞,Schema 2.4.0/7.0.0

§1.4 INFOBOX

┌──────────────────────────────────────────────────────────┐
│  CZ CELLxGENE                                            │
├──────────────────────────────────────────────────────────┤
│  全称         Chan Zuckerberg CELL by GENE              │
│  维护方       Chan Zuckerberg Initiative (CZI)          │
│  策展方       Lattice Curation Team (Stanford)          │
│  成立时间     2018 年                                    │
│  当前版本     Census LTS 2025-11-08                      │
│  数据规模     2.17 亿细胞 (1.62 亿人类)                  │
│  数据集数     1,845 个标准化数据集                        │
│  细胞类型     898 种 (人类)                               │
│  组织覆盖     417 种 (人类)                               │
│  Assay 类型   37 种 (人类)                               │
│  数据格式     H5AD (AnnData) / TileDB-SOMA               │
│  许可证       CC BY 4.0                                  │
│  数据下载     AWS S3 (免签名) / Census API (Python/R)    │
│  核心论文     bioRxiv 2023.10.30.563174                   │
│  DOI          10.1101/2023.10.30.563174                   │
│  网站         https://cellxgene.cziscience.com/          │
│  GitHub       github.com/chanzuckerberg/cellxgene-census │
│  AI 模型      scGPT / Geneformer / UCE / CellFM / TF     │
└──────────────────────────────────────────────────────────┘

§2 单细胞生物学科学背景

§2.1 从 bulk RNA-seq 到 single-cell RNA-seq

传统 bulk RNA-seq 将组织中数百万细胞的基因表达取平均值,生成一个"平均转录组"。这种方法掩盖了细胞间的异质性——一个看似同质的肿瘤样本实际上可能包含癌细胞、免疫细胞、基质细胞、内皮细胞等数十种细胞类型,每种都有截然不同的基因表达谱。

单细胞 RNA-seq (scRNA-seq) 通过将组织解离为单个细胞,逐一测量每个细胞的基因表达,从根本上解决了这个问题:

维度 Bulk RNA-seq scRNA-seq
测量单位 组织平均值 单个细胞
分辨率 细胞群体水平 单细胞水平
稀有细胞检测 被平均效应掩盖 可检测 <1% 的稀有群体
细胞类型发现 不可行 可发现全新细胞类型
发育轨迹 不可行 可推断分化轨迹
数据量 ~20K 基因 × 1 样本 ~20K 基因 × 10K-100K 细胞
稀疏度 ~10-20% 零值 90-95% 零值
成本/样本 ~$100-300 ~$3,000-10,000

§2.2 10x Chromium droplet 技术原理

当前 scRNA-seq 领域的主导平台是 10x Genomics Chromium,它采用微流控液滴技术 (droplet-based microfluidics) 实现高通量单细胞捕获:

第 1 步——样本制备:组织样本通过酶解或机械解离成为单细胞悬液。活细胞比例需 >70%,细胞浓度调整至 700-1,200 cells/μL。

第 2 步——GEM 生成:在 Chromium X 仪器上,细胞悬液与含有条形码凝胶珠 (Gel Bead) 的试剂混合,通过微流控芯片生成数万个 GEMs (Gel Beads-in-emulsions)。每个 GEM 是一个纳升级油包水液滴,理想情况下包含一个细胞和一个 Gel Bead。

第 3 步——细胞裂解与 mRNA 捕获:GEM 中的细胞被裂解,释放的 mRNA 被 Gel Bead 上的 oligo(dT) 引物捕获。每个引物包含:

  • 10x Barcode(16 bp):标识细胞身份(同一 GEM 中所有分子共享同一 barcode)
  • UMI(12 bp):标识原始 mRNA 分子(每个引物独立)
  • poly(dT):捕获 mRNA 的 poly(A) 尾

第 4 步——逆转录与文库构建:mRNA 被逆转录为 cDNA,GEMs 被打破,cDNA 池被扩增并通过酶切构建测序文库。

第 5 步——高通量测序:在 Illumina NovaSeq 上进行双端测序。Read 1 含 10x Barcode + UMI,Read 2 含 cDNA 序列。

第 6 步——Cell Ranger 处理:10x 官方软件 Cell Ranger 将原始 FASTQ 处理为基因 × 细胞的计数矩阵:

  1. Read 1 提取 10x Barcode 和 UMI
  2. Read 2 比对到参考基因组 (STAR)
  3. UMI 去重(同一 cell barcode + gene + UMI 的 reads 合并为一个计数)
  4. EmptyDrops 区分真实细胞与背景噪声
  5. 输出 MEX 格式计数矩阵(genes × cells,90-95% 为零)

典型产出:一次 10x Chromium 实验约 10,000-20,000 细胞,~20,000 基因,产生 ~160M-400M 个数据点(大部分为零)。

§2.3 scRNA-seq 数据分析标准流程

scRNA-seq 数据的分析通常遵循以下标准流程,CELLxGENE 的标准化体系即建立在每一步的最佳实践之上:

步骤 操作 工具 CELLxGENE 对应
1. 质控 过滤低质量细胞(低基因数、高线粒体比例)和双联体 (doublets) Scanpy/Seurat 提交方完成,is_primary_data 标志
2. 归一化 消除文库大小差异 Scanpy (sc.pp.normalize_total) Census 保留原始 Count,不归一化
3. 对数变换 使数据分布更接近正态 sc.pp.log1p 用户自行处理
4. 高变基因选择 选取 2,000-4,000 个高变基因 (HVGs) sc.pp.highly_variable_genes Census 提供全基因矩阵
5. 降维 PCA 降至 50 维 sc.pp.pca Census 预计算 scVI 嵌入
6. 聚类 Leiden/Louvain 算法 sc.tl.leiden 原作者标注 + CL 标准化
7. 可视化 UMAP/t-SNE 2D 投影 sc.tl.umap Discover 门户内置
8. 细胞类型注释 Marker gene + 自动注释工具 CellTypist/SingleR Lattice 策展 + CL 映射
9. 差异表达 簇间差异基因 Wilcoxon/MAST Census API 支持
10. 轨迹分析 发育/分化轨迹推断 Monocle/Slingshot 发育阶段字段 (development_stage)

§2.4 细胞图谱愿景与 Human Cell Atlas

CELLxGENE 的终极目标是构建人类细胞图谱 (Human Cell Atlas, HCA)——一个覆盖人体所有组织、所有细胞类型的全面参考图谱。

项目 主导方 规模 与 CELLxGENE 的关系
Human Cell Atlas (HCA) 国际联盟 (Wellcome + CZI) 目标 10 亿细胞 数据贡献者,HCA 数据流入 CELLxGENE
Tabula Sapiens CZ Biohub + Stanford ~500K 细胞, 24 组织 CELLxGENE 上的标杆数据集
Tabula Muris CZ Biohub ~100K 细胞, 20 组织 小鼠参考图谱
Allen Brain Cell Atlas Allen Institute ~5M 细胞 脑组织数据贡献
Billion Cells Project CZI 目标 5 亿/年 CELLxGENE 的下一代扩展

HCA 的愿景是:人体约 37 万亿细胞,估计约 200-500 种主要细胞类型(含亚型可能达数千种)。截至 2025 年,CELLxGENE 已覆盖 898 种细胞类型和 417 种组织,但仍远未完成全图谱。

§2.5 单细胞基础模型与 CELLxGENE 的数据角色

2023-2025 年,单细胞生物学经历了与 NLP 类似的"基础模型革命":在大规模无标注数据上预训练 Transformer,然后在下游任务上微调。CELLxGENE Census 在这一浪潮中扮演了**“Common Crawl for single-cell biology”**的角色——几乎所有主流单细胞基础模型都使用 Census 作为核心预训练数据:

模型 年份 预训练数据 数据来源 参数量 架构 核心论文
scGPT 2024 33M 人类细胞 CELLxGENE Census ~50M Transformer (512 dim, 12 layer, 8 head) Nature Methods
Geneformer V1 2023 30M 细胞 Genecorpus (CELLxGENE 子集) ~30M-100M BERT-style rank encoding Nature
Geneformer V2 2025 104M 细胞 CELLxGENE Census 扩展 ~100M-300M 同 V1 + 多物种 bioRxiv
UCE 2023 36M 细胞 CELLxGENE Census 650M Encoder-only, 多物种 bioRxiv
CellFM 2025 >100M 细胞 CELLxGENE + 其他 800M Encoder + 跨模态 Nature Comms
TranscriptFormer 2025 112M 细胞 (12 物种) CELLxGENE Census ~300M Encoder-decoder, CZI 自研 bioRxiv
scPRINT 2024 50M 细胞 CELLxGENE Census ~100M Encoder, 多任务 bioRxiv
AIDO.Cell 2025 100M+ 细胞 CELLxGENE Census ~1B 多模态 arXiv

为什么 CELLxGENE 成为标准预训练源?

  1. 规模:2.17 亿细胞是迄今最大规模的单细胞数据集合
  2. 标准化:所有数据经过 ONTOLOGY 对齐和 Lattice 策展,元数据一致
  3. 原始 Count:提供未经归一化的原始 UMI Count,允许用户自定义预处理
  4. 多样性:覆盖 5 个物种、898 种细胞类型、417 种组织、192 种疾病
  5. 可编程访问:Census API 支持按条件筛选子集,无需下载全部数据
  6. 许可:CC BY 4.0 允许商业使用(不同于 HCA 的部分数据限制)
  7. 版本稳定:LTS 版本保证 5 年可访问,支持预训练实验复现
  8. 嵌入预计算:内置 scVI 和 TranscriptFormer 嵌入,可直接用于下游分析

§2.6 ONTOLOGY 对齐体系

CELLxGENE 最核心的标准化创新是强制 ONTOLOGY 对齐——所有元数据字段必须使用标准本体论术语,而非自由文本:

元数据字段 本体论 前缀 示例 维护方
cell_type Cell Ontology (CL) CL: CL:0000084 (T cell) OBO Foundry
tissue UBERON UBERON: UBERON:0002370 (thymus) OBO Foundry
disease MONDO MONDO: MONDO:0005148 (COVID-19) OBO Foundry
assay EFO EFO: EFO:0009901 (10x v3) EBI
development_stage HsapDv / MmusDv HsapDv: HsapDv:0000082 (adult) OBO Foundry
self_reported_ethnicity HANCESTRO HANCESTRO: HANCESTRO:0005 (European) HANCESTRO
sex PATO PATO: PATO:0000384 (female) OBO Foundry

策展流程:原始数据提交者提供自由文本注释(author_cell_type 字段),Lattice 策展团队对照 ONTOLOGY 标准进行映射,生成标准化字段(cell_type)。例如:

  • 原作者标注 "CD4+ helper T cells" → CL 映射 → CL:0000491 (CD4-positive helper T cell)

  • 原作者标注 "lung adenocarcinoma" → MONDO 映射 → MONDO:0005061

§3 技术规格

§3.1 Census 架构:TileDB-SOMA

Census 不使用传统的关系型数据库或文件系统存储,而是采用 TileDB-SOMA (Storage of Objects, Matrices, and Arrays)——一种基于 TileDB 的列式多维数组存储引擎:

层级 概念 说明
TileDB 引擎 底层存储 稀疏/稠密多维数组引擎,支持云原生 (S3)
SOMA 层 数据抽象 Collection / DataFrame / SparseNDArray / DenseNDArray
Census 层 业务逻辑 按物种组织的 obs/var/X/MS 矩阵

为什么不用 H5AD/AnnData?

维度 H5AD (AnnData) TileDB-SOMA
格式 单个 HDF5 文件 目录/云对象集合
随机访问 需加载整个文件 支持列式随机读取
云原生 需下载后访问 直接从 S3 流式读取
并发写 不支持 支持多写者
压缩率 一般 列式压缩,3-5 倍
查询速度 全量加载 10-100 倍快(条件查询)
版本管理 文件覆盖 TileDB 时间旅行

Census 目录结构:

census/
├── census_info/                    # Census 元信息
│   ├── summary/                    # 汇总统计
│   ├── datasets/                   # 数据集清单
│   └── census_schema_version/      # Schema 版本
├── census_data/
│   ├── homo_sapiens/               # 人类数据
│   │   ├── obs/                    # 细胞元数据 (DataFrame)
│   │   ├── var/                    # 基因元数据 (DataFrame)
│   │   ├── ms/                     # 测量集 (Measurement Set)
│   │   │   └── RNA/
│   │   │       ├── X/             # Count 矩阵
│   │   │       │   ├── raw/       # 原始 UMI Count (SparseNDArray)
│   │   │       │   └── normalized/ # 归一化矩阵 (SparseNDArray, 可选)
│   │   │       ├── var/           # RNA 测量级基因元数据
│   │   │       └── featuremappings/ # 基因 ID 映射
│   │   └── obs_embeddings/         # 预计算细胞嵌入
│   │       ├── scvi/               # scVI 嵌入
│   │       ├── tf-sapiens/         # TranscriptFormer 人类嵌入
│   │       └── tf-exemplar-human/  # TF exemplar 嵌入
│   ├── mus_musculus/               # 小鼠数据 (同构)
│   ├── macaca_mulatta/             # 猕猴数据
│   ├── callithrix_jacchus/         # 绒猴数据
│   └── pan_troglodytes/            # 黑猩猩数据
└── census_subsets/                 # 预定义子集

§3.2 Census Schema 版本演进

Schema 版本 发布时间 关键变化
1.0 2022.03 首个正式 Schema,强制 ONTOLOGY 对齐
2.0 2022.06 新增 is_primary_data 去重字段
3.0 2022.12 新增小鼠数据支持;raw 矩阵字段
4.0 2023.06 新增空间转录组字段 (spatial_coordinates)
5.0 2024.03 新增多组学字段 (multiome); cell_type_ontology_term_id 格式统一
6.0 2024.07 新增 suspension_type (cell/nucleus); 空间数据正式支持
7.0 2025.06 disease 支持多值 (` \

§3.3 数据提交与策展流程

CELLxGENE 的数据来源是社区驱动 + Lattice 策展的混合模式:

第 1 步——数据提交:研究者在发表论文后将 scRNA-seq 数据提交到 CELLxGENE Discover。提交需遵循 Dataset Schema,包含原始 Count 矩阵 (H5AD) 和元数据。

第 2 步——自动验证:CELLxGENE 数据摄入管道自动检查:

  • H5AD 文件格式完整性
  • 必填元数据字段是否存在
  • ONTOLOGY 术语是否有效(对照 CL/UBERON/MONDO/EFO 最新版本)
  • 基因 ID 是否为 Ensembl ID
  • Count 矩阵是否为非负整数

第 3 步——Lattice 人工策展:Lattice 策展团队(Stanford 大学,CZI 资助)对通过自动验证的数据集进行人工策展:

  • 将 author_cell_type(自由文本)映射到 Cell Ontology 标准术语
  • 校验组织注释与 UBERON 的一致性
  • 检查疾病注释与 MONDO 的对应关系
  • 验证实验方法与 EFO 的匹配
  • 处理提交者无法完成的复杂或模糊标注

第 4 步——版本冻结:策展完成后,数据集获得一个稳定的 CELLxGENE Collection ID 和 Dataset ID,进入 Discover 门户。

第 5 步——Census 合并:每周,新通过策展的数据集被合并到 Census “latest” 构建中。每 6 个月,冻结一个 LTS 版本。

§3.4 数据集收录标准

CELLxGENE Census 对数据集有严格的收录标准:

标准 要求 说明
物种 人类、小鼠、猕猴、绒猴、黑猩猩 2025 年扩展到 5 种灵长类
数据类型 scRNA-seq + 空间转录组 含 10x、Smart-seq2、Slide-seq 等 37 种 assay
原始 Count 必须提供未经归一化的 UMI Count 不接受已归一化/已对数变换的数据
基因标识 Ensembl Gene ID 不接受 Gene Symbol 作为主键
元数据 必填字段完整 cell_type/tissue/disease/assay/sex 等
ONTOLOGY 全部字段 ONTOLOGY 对齐 自由文本仅保留在 author_* 字段
许可 CC BY 4.0 不接受更限制性的许可
出版物 优先已发表论文 预印本也可收录
质控 基本细胞质控已完成 线粒体比例、双联体检测等

§3.5 预计算嵌入

Census LTS 2025-11-08 内置了多种预计算嵌入,用户无需自行训练即可获取细胞的向量化表示:

嵌入 方法 维度 物种覆盖 用途
scVI 深度生成模型 (variational autoencoder) 30 人类 + 小鼠 批次校正、整合分析
tf-sapiens TranscriptFormer 物种特异嵌入 256 人类 + 小鼠 跨数据集细胞类型比较
tf-exemplar TranscriptFormer exemplar 嵌入 256 人类 + 小鼠 参考图谱映射

嵌入通过 cellxgene_census.experimental.get_embedding() 或 get_anndata(obs_embeddings=...) 获取,存储为 TileDB DenseNDArray。

§3.6 空间转录组支持

2025 年 Schema 6.0+ 正式支持空间转录组数据:

Assay 技术 分辨率 Census 支持
10x Visium 斑点捕获 (55 μm) 近单细胞 ✅
Slide-seq v2 DNA 条形码珠 (10 μm) 亚细胞 ✅
MERFISH 原位测序 单分子 实验性
Stereo-seq DNA 纳米球阵列 亚细胞 实验性

空间数据在 Census 中额外包含:

  • spatial_coordinates:x/y 坐标
  • cell_size:细胞面积(Visium spot 模式下为 spot 面积)
  • spatial_tools:可用的空间分析工具标记

§3.7 Assay 类型分布

Census LTS 2025-11-08 人类数据包含 37 种 assay,按细胞数排序前 10:

排名 Assay EFO ID 典型细胞数/实验 占比
1 10x 3’‘’‘’‘’‘’‘’‘’‘’’ v3 EFO:0009901 5,000-20,000 ~45%
2 10x 3’‘’‘’‘’‘’‘’‘’‘’’ v2 EFO:0009899 3,000-10,000 ~20%
3 10x 5’‘’‘’‘’‘’‘’‘’‘’’ v3 EFO:0009922 5,000-15,000 ~8%
4 Smart-seq2 EFO:0008931 100-1,000 ~5%
5 10x 5’‘’‘’‘’‘’‘’‘’‘’’ v2 EFO:0009900 3,000-10,000 ~4%
6 10x Multiome EFO:0030062 5,000-15,000 ~3%
7 Drop-seq EFO:0008728 1,000-5,000 ~2%
8 10x 3’‘’‘’‘’‘’‘’‘’‘’’ v1 EFO:0010183 500-3,000 ~1%
9 BD Rhapsody EFO:0008641 2,000-10,000 ~1%
10 Slide-seq v2 EFO:0030063 10,000-50,000 <1%

10x Chromium 主导效应:约 80% 的细胞来自 10x Genomics 平台。不同 assay 间的技术差异(捕获效率、基因检出数、dropout 率)是批次效应的主要来源。

§4 数据结构详解

§4.1 obs(细胞元数据)字段表

obs 是 Census 中每个细胞的元数据 DataFrame,包含以下核心字段:

字段名 类型 必填 示例 说明
soma_joinid int64 是 1234567 Census 内部行 ID
dataset_id str 是 “0a5b8b…” 数据集 UUID
assay str 是 “10x 3’‘’‘’‘’‘’‘’‘’‘’’ v3” EFO 标准化实验方法
assay_ontology_term_id str 是 “EFO:0009901” EFO URI
cell_type str 是 “T cell” CL 标准化细胞类型
cell_type_ontology_term_id str 是 “CL:0000084” CL URI
tissue str 是 “blood” UBERON 标准化组织
tissue_ontology_term_id str 是 “UBERON:0000178” UBERON URI
tissue_general str 是 “blood” 组织大类
tissue_general_ontology_term_id str 是 “UBERON:0000178” UBERON URI
disease str 是 “normal” MONDO 标准化疾病(可多值)
disease_ontology_term_id str 是 “MONDO:0000001” MONDO URI
donor_id str 是 “donor_42” 供体标识(去标识化)
is_primary_data bool 是 True 是否为首次发布(去重标志)
development_stage str 是 “adult” HsapDv 标准化发育阶段
development_stage_ontology_term_id str 是 “HsapDv:0000082” HsapDv URI
self_reported_ethnicity str 否 “European” HANCESTRO 标准化种族
self_reported_ethnicity_ontology_term_id str 否 “HANCESTRO:0005” HANCESTRO URI
sex str 是 “female” PATO 标准化性别
sex_ontology_term_id str 是 “PATO:0000384” PATO URI
suspension_type str 是 “cell” cell / nucleus / na
observation_joinid str 是 “dataset_id:barcoded_sample_cell_id” 全局唯一标识

§4.2 var(基因元数据)字段表

var 是每个基因的元数据 DataFrame:

字段名 类型 说明
soma_joinid int64 Census 内部行 ID
feature_id str Ensembl Gene ID(唯一,如 ENSG00000141510)
feature_name str Gene Symbol(Schema 7.0+ 不再保证唯一)
feature_length int64 基因长度 (bp)
nnz int64 非零值数量(用于过滤低表达基因)
n_measured_obs int64 检测到该基因的细胞数

§4.3 X(Count 矩阵)

X 是核心的基因表达矩阵,以 TileDB SparseNDArray 存储:

属性 值
维度 obs × var (细胞 × 基因)
格式 COO 稀疏矩阵(仅存储非零值)
数据类型 int32 (raw count)
非零值数量 ~数十亿 (人类部分)
稀疏度 90-95% 零值
存储位置 census_data/homo_sapiens/ms/RNA/X/raw/

关键设计决策:Census 仅存储 原始 UMI Count(X/raw),不进行任何归一化。这允许用户根据自身需求选择归一化策略(如 Scanpy 的 sc.pp.normalize_total + sc.pp.log1p,或 scVI 的深度学习归一化)。

§4.4 obs_embeddings(预计算嵌入)

嵌入名称 存储路径 维度 数据类型 方法
scvi obs_embeddings/scvi/ 30 float32 scVI variational autoencoder
tf-sapiens obs_embeddings/tf-sapiens/ 256 float32 TranscriptFormer 物种特异
tf-exemplar obs_embeddings/tf-exemplar-human/ 256 float32 TranscriptFormer exemplar

§5 下载与访问

§5.1 Census API (Python) — 推荐方式

# 安装
# pip install cellxgene-census==1.17.*

import cellxgene_census

# 打开最新 LTS 版本(推荐用于可复现研究)
with cellxgene_census.open_soma(census_version="stable") as census:
    # 查看可用物种
    print(census["census_data"].keys())
    # [''''''''''''''''homo_sapiens'''''''''''''''', ''''''''''''''''mus_musculus'''''''''''''''', ''''''''''''''''macaca_mulatta'''''''''''''''',
    #  ''''''''''''''''callithrix_jacchus'''''''''''''''', ''''''''''''''''pan_troglodytes'''''''''''''''']

    # 查看人类数据汇总
    human = census["census_data"]["homo_sapiens"]
    print(f"总细胞数: {human.obs.count}")
    print(f"总基因数: {human.ms[''''''''''''''''RNA''''''''''''''''].var.count}")

§5.2 按条件筛选子集

import cellxgene_census

with cellxgene_census.open_soma() as census:
    # 获取特定组织+细胞类型的 AnnData 对象
    adata = cellxgene_census.get_anndata(
        census,
        organism="homo_sapiens",
        obs_value_filter="tissue == ''''''''''''''''blood'''''''''''''''' and cell_type in [''''''''''''''''T cell'''''''''''''''', ''''''''''''''''B cell'''''''''''''''', ''''''''''''''''natural killer cell'''''''''''''''']",
        var_value_filter="feature_name in [''''''''''''''''CD3D'''''''''''''''', ''''''''''''''''CD3E'''''''''''''''', ''''''''''''''''CD4'''''''''''''''', ''''''''''''''''CD8A'''''''''''''''', ''''''''''''''''MS4A1'''''''''''''''', ''''''''''''''''NKG7'''''''''''''''']",
        column_names={
            "obs": ["cell_type", "tissue", "disease", "donor_id", "assay"],
            "var": ["feature_name", "feature_id"]
        }
    )

    print(f"筛选细胞数: {adata.n_obs}")
    print(f"筛选基因数: {adata.n_vars}")
    print(adata.obs["cell_type"].value_counts())

§5.3 获取预计算嵌入

import cellxgene_census

with cellxgene_census.open_soma() as census:
    # 获取 scVI 嵌入
    adata = cellxgene_census.get_anndata(
        census,
        organism="homo_sapiens",
        obs_value_filter="tissue == ''''''''''''''''lung''''''''''''''''",
        obs_embeddings=["scvi"],
        column_names={"obs": ["cell_type", "tissue"]}
    )

    # 嵌入存储在 adata.obsm 中
    print(f"scVI 嵌入维度: {adata.obsm[''''''''''''''''scvi''''''''''''''''].shape}")
    # (n_cells, 30)

§5.4 AWS S3 直接下载

# 下载 LTS 2025-11-08 的 TileDB-SOMA 文件
aws s3 sync no-sign-request \
  s3://cellxgene-census-public-us-west-2/cell-census/2025-11-08/soma/ \
  ./census_soma/

# 下载 LTS 2025-11-08 的所有源 H5AD 文件
aws s3 sync no-sign-request \
  s3://cellxgene-census-public-us-west-2/cell-census/2025-11-08/h5ads/ \
  ./census_h5ads/

# 使用本地 Census
python -c "
import cellxgene_census
with cellxgene_census.open_soma(uri=''''''''''''''''./census_soma/'''''''''''''''') as census:
    print(census[''''''''''''''''census_data''''''''''''''''][''''''''''''''''homo_sapiens''''''''''''''''].obs.count)
"

§5.5 R 语言访问

# 安装
# install.packages("cellxgene.census")

library(cellxgene.census)

# 打开 LTS 版本
census <- open_soma(census_version = "stable")

# 获取 AnnData (Seurat 对象)
adata <- get_anndata(
  census,
  organism = "homo_sapiens",
  obs_value_filter = "tissue == ''''''''''''''''brain'''''''''''''''' and cell_type in [''''''''''''''''neuron'''''''''''''''', ''''''''''''''''astrocyte'''''''''''''''', ''''''''''''''''microglial cell'''''''''''''''']"
)

print(dim(adata))

§5.6 Discover Web 门户

CELLxGENE Discover (https://cellxgene.cziscience.com/) 提供 Web 界面:

  • 数据集浏览:按组织、疾病、细胞类型筛选 1,845 个数据集
  • 交互式可视化:UMAP/t-SNE 散点图,按任意元数据着色
  • 基因表达查看:在散点图上叠加任意基因的表达水平
  • 差异表达:选择细胞群后自动计算差异基因
  • 嵌入对比:scVI 嵌入 vs 原始 PCA
  • H5AD 下载:直接下载单个数据集的 AnnData 文件

§5.7 访问方式对比

方式 适用场景 数据传输量 延迟 编程门槛
Census API (Python) 大规模分析/AI 训练 按需 (仅筛子集) 低 (S3 流式) 中
Census API ® R 生态分析 按需 低 中
AWS S3 全量下载 离线/频繁查询 ~500 GB+ 一次性高 低
Discover Web 探索性查看 浏览器加载 中 无
TileDB-SOMA 直连 高级自定义查询 按需 最低 高

§6 AI 就绪指南

§6.1 Census 数据加载与 PyTorch DataLoader

"""
CELLxGENE Census → PyTorch DataLoader
使用 TileDB-SOMA-ML 实现高效流式数据加载
"""
# pip install cellxgene-census==1.17.* tiledbsoma-ml torch

import cellxgene_census
import tiledbsoma.ml
import torch
from torch.utils.data import DataLoader

def create_census_dataloader(
    organism="homo_sapiens",
    tissue="blood",
    cell_types=None,
    batch_size=512,
    shuffle=True,
    census_version="stable"
):
    """从 Census 创建 PyTorch DataLoader"""
    with cellxgene_census.open_soma(census_version=census_version) as census:
        # 构建 obs 过滤条件
        obs_filter = f"tissue == ''''''''''''''''{tissue}''''''''''''''''"
        if cell_types:
            ct_list = ", ".join([f"''''''''''''''''{ct}''''''''''''''''" for ct in cell_types])
            obs_filter += f" and cell_type in [{ct_list}]"

        # 使用 TileDB-SOMA-ML 创建数据集
        experiment = census["census_data"][organism]
        query = experiment.axis_query(
            measurement_name="RNA",
            obs_query=tiledbsoma.AxisQuery(value_filter=obs_filter)
        )

        # 创建 PyTorch Dataset
        dataset = tiledbsoma.ml.ExperimentDataset(
            query,
            layer_name="raw",
            obs_column_names=["cell_type", "tissue", "disease"]
        )

        print(f"数据集大小: {len(dataset)} 细胞")
        print(f"基因数: {dataset.shape[1]}")

        # 创建 DataLoader
        dataloader = DataLoader(
            dataset,
            batch_size=batch_size,
            shuffle=shuffle,
            num_workers=4,
            pin_memory=True
        )

        return dataloader

# 使用示例
dataloader = create_census_dataloader(
    tissue="blood",
    cell_types=["T cell", "B cell", "natural killer cell", "monocyte"],
    batch_size=256
)

for batch in dataloader:
    # batch["X"] 是 count 矩阵 (batch_size, n_genes)
    # batch["cell_type"] 等是元数据
    expressionevent-blocked= batch["X"]  # torch.Tensor, shape (256, ~20000)
    print(f"Batch shape: {expressions.shape}")
    break

§6.2 scGPT 预训练数据准备

"""
从 CELLxGENE Census 准备 scGPT 预训练数据
scGPT 使用 value binning tokenization: 基因 ID token + 表达值 binned token
"""
import cellxgene_census
import numpy as np
import scanpy as sc
from collections import Counter

def prepare_scgpt_pretraining_data(
    census_version="stable",
    target_cells=33_000_000,  # scGPT 原始预训练规模
    min_genes_per_cell=200,
    max_genes_per_cell=6000,
    min_cells_per_gene=10
):
    """准备 scGPT 格式预训练数据"""
    with cellxgene_census.open_soma(census_version=census_version) as census:
        human = census["census_data"]["homo_sapiens"]

        # 获取全部人类细胞元数据(仅必要列)
        obs_df = human.obs.read(
            column_names=[
                "soma_joinid", "cell_type", "tissue", "assay",
                "is_primary_data", "donor_id"
            ]
        ).concat().to_pandas()

        # 去重:仅保留 is_primary_data=True 的细胞
        obs_df = obs_df[obs_df["is_primary_data"] == True]
        print(f"去重后细胞数: {len(obs_df):,}")

        # 统计细胞类型分布
        ct_dist = obs_df["cell_type"].value_counts()
        print(f"细胞类型数: {len(ct_dist)}")
        print(f"Top-10 细胞类型:\n{ct_dist.head(10)}")

        # 按比例采样到目标规模
        if len(obs_df) > target_cells:
            # 分层采样保持细胞类型分布
            from sklearn.model_selection import train_test_split
            sampled, _ = train_test_split(
                obs_df, train_size=target_cells,
                stratify=obs_df["cell_type"],
                random_state=42
            )
            obs_df = sampled

        print(f"最终预训练细胞数: {len(obs_df):,}")

        # 分批获取 Count 矩阵并进行 scGPT tokenization
        batch_size = 100_000
        all_tokenized = []

        for start in range(0, len(obs_df), batch_size):
            end = min(start + batch_size, len(obs_df))
            batch_ids = obs_df["soma_joinid"].iloc[start:end].values

            # 读取该批次的 Count 矩阵
            adata = cellxgene_census.get_anndata(
                census,
                organism="homo_sapiens",
                obs_coordinates=batch_ids,
                column_names={"obs": ["cell_type"]}
            )

            # 质控过滤
            sc.pp.filter_cells(adata, min_genes=min_genes_per_cell)
            sc.pp.filter_genes(adata, min_cells=min_cells_per_gene)

            # scGPT value binning: 将连续表达值离散化为 b bins
            # scGPT 原论文使用 52 个 bin
            n_bins = 52
            X = adata.X.toarray() if hasattr(adata.X, ''''''''''''''''toarray'''''''''''''''') else adata.X

            # 对数归一化后分箱
            lib_sizes = X.sum(axis=1, keepdims=True)
            lib_sizes[lib_sizes == 0] = 1
            normalized = np.log1p(X / lib_sizes * 1e4)

            # 分位数分箱
            bins = np.quantile(normalized[normalized > 0], np.linspace(0, 1, n_bins + 1))
            tokenized = np.digitize(normalized, bins[1:-1])

            all_tokenized.append(tokenized)

            if start % 1_000_000 == 0:
                print(f"  已处理 {start:,} / {len(obs_df):,} 细胞")

        return all_tokenized, obs_df

# 运行
tokenized_data, metadata = prepare_scgpt_pretraining_data()
print(f"\nscGPT 预训练数据准备完成")
print(f"Tokenized 矩阵数: {len(tokenized_data)}")

§6.3 Geneformer 嵌入提取与零样本分析

"""
Geneformer 嵌入提取
Geneformer 使用 rank-based tokenization: 基因按表达水平排序(相对中位数)
"""
# pip install geneformer transformers torch

import cellxgene_census
import numpy as np
import torch
from transformers import AutoModel, AutoTokenizer
from geneformer import TranscriptomeTokenizer

def extract_geneformer_embeddings(
    tissue="heart",
    n_cells=10000,
    model_name="ctheodoris/Geneformer/geneformer-12L-30M"
):
    """从 Census 获取数据并用 Geneformer 提取嵌入"""
    # 第 1 步:从 Census 获取数据
    with cellxgene_census.open_soma() as census:
        adata = cellxgene_census.get_anndata(
            census,
            organism="homo_sapiens",
            obs_value_filter=f"tissue == ''''''''''''''''{tissue}''''''''''''''''",
            column_names={
                "obs": ["cell_type", "tissue", "disease"]
            }
        )

    print(f"获取 {adata.n_obs} 细胞, {adata.n_vars} 基因")

    # 第 2 步:Geneformer rank-based tokenization
    # 对每个细胞,将基因按表达量排序(相对全语料中位数)
    # Geneformer V2 输入长度 = 4096 genes/cell
    tokenizer = TranscriptomeTokenizer({
        "gene_id": "ensembl",
        "gene_name": "symbol",
        "count": "count"
    })

    # 计算 rank encoding
    X = adata.X.toarray() if hasattr(adata.X, ''''''''''''''''toarray'''''''''''''''') else adata.X

    # 基因级中位数(跨所有细胞)
    gene_medians = np.median(X[X > 0], axis=0)
    gene_medians[np.isnan(gene_medians)] = 0

    # 每个细胞:rank = 表达量 / 中位数,取 top-4096
    tokenized_cells = []
    for i in range(min(len(adata), n_cells)):
        x = X[i]
        # 排序基因 by 表达量/中位数比值
        ratios = np.where(gene_medians > 0, x / gene_medians, 0)
        top_indices = np.argsort(ratios)[::-1][:4096]
        # Geneformer 格式: [CLS] gene_1 gene_2 ... [EOS]
        tokens = ["[CLS]"] + [f"ENSG{idx:011d}" for idx in top_indices] + ["[EOS]"]
        tokenized_cells.append(tokens)

    # 第 3 步:加载 Geneformer 模型并提取嵌入
    model = AutoModel.from_pretrained(model_name)
    model.eval()

    embeddings = []
    with torch.no_grad():
        for tokens in tokenized_cells[:n_cells]:
            # 获取 [CLS] token 的最后隐藏层作为细胞嵌入
            inputs = AutoTokenizer.from_pretrained(model_name)(
                tokens, return_tensors="pt", padding=True, truncation=True
            )
            outputs = model(**inputs)
            cls_embedding = outputs.last_hidden_state[:, 0, :]  # [CLS] token
            embeddings.append(cls_embedding.squeeze().numpy())

    embeddings = np.array(embeddings)
    print(f"Geneformer 嵌入: {embeddings.shape}")  # (n_cells, 512)

    return embeddings, adata.obs

embeddings, obs = extract_geneformer_embeddings(tissue="heart")

§6.4 TranscriptFormer 推理与细胞类型注释

"""
TranscriptFormer (CZI 自研) 推理
直接使用 Census 内置的 tf-sapiens 嵌入进行细胞类型注释
"""
import cellxgene_census
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score

def transcriptformer_cell_annotation(
    query_tissue="blood",
    n_reference_cells=50000,
    n_folds=5
):
    """使用 Census 内置 TranscriptFormer 嵌入进行细胞类型注释"""
    with cellxgene_census.open_soma() as census:
        # 获取带有 TF 嵌入的数据
        adata = cellxgene_census.get_anndata(
            census,
            organism="homo_sapiens",
            obs_value_filter=f"tissue == ''''''''''''''''{query_tissue}''''''''''''''''",
            obs_embeddings=["tf-sapiens"],
            column_names={"obs": ["cell_type"]}
        )

    # 过滤细胞数 > 100 的类型
    ct_counts = adata.obs["cell_type"].value_counts()
    valid_types = ct_counts[ct_counts >= 100].index
    mask = adata.obs["cell_type"].isin(valid_types)
    adata = adata[mask].copy()

    print(f"参考数据: {adata.n_obs} 细胞, {len(valid_types)} 细胞类型")
    print(f"TF 嵌入维度: {adata.obsm[''''''''''''''''tf-sapiens''''''''''''''''].shape}")

    # 采样到参考规模
    if adata.n_obs > n_reference_cells:
        sc.pp.subsample(adata, n_obs=n_reference_cells)

    X = adata.obsm["tf-sapiens"]
    y = adata.obs["cell_type"].values

    # KNN 分类器(TF 嵌入空间中最近邻)
    knn = KNeighborsClassifier(n_neighbors=15, metric="cosine")

    # 5 折交叉验证
    scores = cross_val_score(knn, X, y, cv=n_folds, scoring="f1_macro")
    print(f"\nKNN (k=15) 5-fold CV F1-macro: {scores.mean():.4f} ± {scores.std():.4f}")

    # 在全部参考数据上训练
    knn.fit(X, y)

    # 预测新细胞
    # new_embeddings = ... (新数据的 TF 嵌入)
    # predictionevent-blocked= knn.predict(new_embeddings)

    return knn, adata

classifier, ref_data = transcriptformer_cell_annotation("blood", 50000)

§6.5 scVI 批次校正与数据整合

"""
scVI 批次校正:使用 Census 内置 scVI 嵌入进行跨数据集整合
"""
# pip install scvi-tools scanpy

import cellxgene_census
import scanpy as sc
import scvi
import numpy as np

def scvi_batch_correction(
    tissue="lung",
    min_cells_per_dataset=500
):
    """使用 scVI 进行跨数据集批次校正"""
    with cellxgene_census.open_soma() as census:
        adata = cellxgene_census.get_anndata(
            census,
            organism="homo_sapiens",
            obs_value_filter=f"tissue == ''''''''''''''''{tissue}''''''''''''''''",
            obs_embeddings=["scvi"],  # Census 预计算 scVI
            column_names={"obs": ["cell_type", "dataset_id", "assay", "donor_id"]}
        )

    # 过滤小数据集
    ds_counts = adata.obs["dataset_id"].value_counts()
    valid_ds = ds_counts[ds_counts >= min_cells_per_dataset].index
    adata = adata[adata.obs["dataset_id"].isin(valid_ds)].copy()

    print(f"整合数据: {adata.n_obs} 细胞, {len(valid_ds)} 数据集")
    print(f"批次来源: {adata.obs[''''''''''''''''dataset_id''''''''''''''''].nunique()} 个数据集")

    # 方法 1:直接使用 Census 预计算的 scVI 嵌入
    # 无需训练,直接用于下游分析
    scvi_emb = adata.obsm["scvi"]
    print(f"Census 预计算 scVI 嵌入: {scvi_emb.shape}")

    # UMAP 可视化
    sc.pp.neighbors(adata, use_rep="scvi")
    sc.tl.umap(adata)
    sc.pl.umap(adata, color=["cell_type", "dataset_id"], wspace=0.4)

    # 方法 2:自定义 scVI 训练(如需特定批次变量)
    # scvi.model.SCVI.setup_anndata(
    #     adata,
    #     layer=None,  # 使用 .X (raw count)
    #     batch_key="dataset_id",
    #     categorical_covariate_keys=["assay"],
    # )
    # model = scvi.model.SCVI(adata, n_latent=30, n_layers=2)
    # model.train(max_epochs=400, early_stopping=True)
    # adata.obsm["X_scVI_custom"] = model.get_latent_representation()

    return adata

adata_integrated = scvi_batch_correction("lung")

§6.6 扰动响应预测

"""
使用 Census 预训练的单细胞基础模型预测基因扰动响应
基于 scGPT 的 perturbation prediction pipeline
"""
# pip install scgpt torch scanpy

import torch
import numpy as np
import scanpy as sc
from scipy.stats import pearsonr

def perturbation_prediction_example():
    """
    预测基因敲除后的转录组变化
    使用 Norman et al. 2019 扰动数据集作为示例
    """
    # 加载预训练 scGPT 模型
    from scgpt.model import TransformerModel
    from scgpt.token import tokenize_and_pad_batch
    from scgpt.preprocess import Preprocessor

    # 第 1 步:加载扰动数据(示例:Norman 2019)
    # 实际数据从 https://dataverse.harvard.edu/api/access/datafile/6154020 下载
    # adata = sc.read_h5ad("norman_2019.h5ad")
    # 包含:control cells + perturbed cells (gene knockouts)

    # 第 2 步:使用 Census 预训练的 scGPT
    # 模型配置(与 Nature Methods 2024 论文一致)
    model_conevent-blocked= {
        "embsize": 512,       # 嵌入维度
        "nheads": 8,          # 注意力头数
        "nlayers": 12,        # Transformer 层数
        "vocab_size": 60697,  # 基因词汇表大小
        "n_bins": 52,         # 表达值分箱数
        "dropout": 0.0,
        "pad_token": "<pad>",
        "max_seq_len": 4096   # 最大基因数/细胞
    }

    # 第 3 步:扰动预测逻辑
    # 1. 取 control cell 的 tokenized 表达谱
    # 2. 将目标基因的 token 替换为 "knockout" token (表达值=0)
    # 3. 通过 scGPT forward pass 预测扰动后的表达谱
    # 4. 计算 predicted vs actual 的 delta (变化量)

    # 评估指标
    def evaluate_prediction(pred_delta, true_delta):
        """Pearson delta correlation"""
        r, p = pearsonr(pred_delta.flatten(), true_delta.flatten())
        return r, p

    def top_k_recall(pred_delta, true_delta, k=20):
        """Top-K differentially expressed genes recall"""
        pred_top = set(np.argsort(np.abs(pred_delta))[-k:])
        true_top = set(np.argsort(np.abs(true_delta))[-k:])
        recall = len(pred_top & true_top) / k
        return recall

    # scGPT 论文报告的 Norman 数据集结果:
    # - Pearson delta correlation: ~0.85 (top 20 DEGs)
    # - Top-20 recall: ~0.65
    print("scGPT 扰动预测评估指标:")
    print("  Norman 2019 dataset:")
    print("    Pearson delta r (DEG): ~0.85")
    print("    Top-20 recall: ~0.65")
    print("  Adamson 2016 dataset:")
    print("    Pearson delta r (DEG): ~0.75")
    print("    Top-20 recall: ~0.55")

perturbation_prediction_example()

§6.7 跨物种细胞类型比较

"""
跨物种细胞类型比较:利用 Census 多物种数据
"""
import cellxgene_census
import scanpy as sc
import numpy as np

def cross_species_comparison(
    tissue="brain",
    species=["homo_sapiens", "mus_musculus", "macaca_mulatta"]
):
    """跨物种细胞类型比较分析"""
    all_embeddings = {}
    all_metadata = {}

    with cellxgene_census.open_soma() as census:
        for organism in species:
            print(f"\n- {organism} -")
            adata = cellxgene_census.get_anndata(
                census,
                organism=organism,
                obs_value_filter=f"tissue_general == ''''''''''''''''{tissue}''''''''''''''''" if organism == "homo_sapiens"
                                else f"tissue == ''''''''''''''''{tissue}''''''''''''''''",
                obs_embeddings=["scvi"],
                column_names={"obs": ["cell_type", "tissue"]}
            )

            # 仅保留常见细胞类型
            ct_counts = adata.obs["cell_type"].value_counts()
            commonevent-blocked= ct_counts[ct_counts >= 100].index
            adata = adata[adata.obs["cell_type"].isin(common_types)].copy()

            print(f"  细胞数: {adata.n_obs}")
            print(f"  细胞类型数: {len(common_types)}")
            print(f"  scVI 嵌入: {adata.obsm[''''''''''''''''scvi''''''''''''''''].shape}")

            all_embeddings[organism] = adata.obsm["scvi"]
            all_metadata[organism] = adata.obs

    # 跨物种比较:
    # 1. 使用 TranscriptFormer 的跨物种嵌入(tf-sapiens)
    #    TF 在 12 物种 112M 细胞上训练,天然支持跨物种比较
    # 2. 使用直系同源基因 (one-to-one orthologs) 限制基因集后重新计算 scVI
    # 3. 使用 MNN (Mutual Nearest Neighbors) 进行物种间对齐

    # 细胞类型保守性分析
    for ct in ["neuron", "astrocyte", "microglial cell", "oligodendrocyte"]:
        counts = {}
        for org in species:
            if ct in all_metadata[org]["cell_type"].values:
                counts[org] = (all_metadata[org]["cell_type"] == ct).sum()
        if len(counts) > 1:
            print(f"\n{ct}: {counts}")

cross_species_comparison("brain")

§6.8 计算资源需求

任务 CPU 内存 GPU 存储 预计时间
Census API 子集查询 (<1M 细胞) 4 核 16 GB 无 10 GB <5 分钟
Census 全量 obs 元数据读取 8 核 32 GB 无 5 GB ~10 分钟
scGPT 微调 (<100K 细胞) 8 核 64 GB 1× A100 40GB 20 GB 2-4 小时
Geneformer 推理 (<10K 细胞) 4 核 32 GB 1× V100 16GB 5 GB <30 分钟
scVI 自定义训练 (<1M 细胞) 8 核 64 GB 1× A100 40GB 50 GB 4-12 小时
全量 Census 下载 (S3) 4 核 8 GB 无 500 GB+ 2-6 小时
TranscriptFormer 嵌入推理 (1M 细胞) 16 核 128 GB 4× A100 80GB 100 GB 6-12 小时

§7 已知坑点

§7.1 is_primary_data 去重陷阱

问题:Census 中同一细胞可能出现在多个数据集中(如同一研究的数据被多个 Collection 收录)。is_primary_data 字段标识该数据集是否为该细胞的"首次发布"来源。如果不加过滤地使用所有数据,会导致重复细胞污染训练集。

解决方案:

# 始终过滤 is_primary_data=True
adata = cellxgene_census.get_anndata(
    census,
    organism="homo_sapiens",
    obs_value_filter="is_primary_data == True and tissue == ''''''''''''''''blood''''''''''''''''"
)

§7.2 批次效应——数据集间系统性差异

问题:不同数据集来自不同实验室、不同 10x 版本、不同解离方案、不同测序深度,即使相同组织相同细胞类型,表达谱也可能存在系统差异。直接混合训练会导致模型学习批次特征而非生物学信号。

解决方案:

  • 使用 Census 预计算的 scVI 嵌入(已做批次校正)
  • 在自定义训练中加入 batch covariate(如 dataset_id)
  • 使用 scVI/scANVI 进行显式批次建模
  • 评估时使用留一数据集 (leave-one-dataset-out) 验证

§7.3 基因 ID 版本同步问题

问题:Census 使用 Ensembl Gene ID 作为基因主键,但 Ensembl 参考基因组版本会定期更新。不同 Census 版本可能使用不同 Ensembl 版本,导致同一基因 ID 在不同版本间不兼容。

解决方案:

  • 固定使用特定 Census LTS 版本(如 census_version="2025-11-08")
  • 使用 featuremappings 子集进行跨版本基因 ID 映射
  • 始终使用 Ensembl ID(而非 Gene Symbol)作为基因标识

§7.4 Schema 版本间的不兼容变更

问题:Census Schema 持续演进,某些变更可能破坏现有分析代码:

  • Schema 7.0: disease 字段可包含多值("normal || MONDO:0005061"),使用精确字符串匹配 (disease == ''''''''''''''''normal'''''''''''''''') 的查询会遗漏多值细胞
  • Schema 7.0: feature_name 不再保证唯一,同一名(如 MARCH1)可能对应多个 Ensembl ID
  • Schema 6.0: 新增 suspension_type 字段,旧代码可能未处理

解决方案:

  • 查询 disease 时使用 disease_ontology_term_id 而非 disease 文本字段
  • 使用 feature_id (Ensembl ID) 而非 feature_name 作为基因标识
  • 检查 Census schema 版本并适配代码

§7.5 物种和组织的覆盖偏倚

问题:Census 数据覆盖存在系统性偏倚:

  • 物种偏倚:人类占 74.5%、小鼠 21.3%、其他灵长类仅 4.2%
  • 组织偏倚:血液/免疫 (~25%)、脑 (~20%)、肿瘤 (~15%) 过度代表;皮肤、骨骼肌、内分泌组织覆盖不足
  • 疾病偏倚:正常组织占多数 (~60%);罕见病数据稀缺
  • 种族偏倚:欧洲裔供体过代表 (~55%),非洲、亚洲、南美裔代表性不足

影响:在此数据上预训练的基础模型可能对低代表组织/种族的细胞类型注释性能较差。

§7.6 测序技术差异导致的 assay bias

问题:~80% 的细胞来自 10x Chromium 平台。Smart-seq2 数据(全长转录组、更高基因检出率但通量低)和其他平台数据在 Census 中比例很小。不同 assay 间的基因检出率、dropout 模式、UMI vs read count 差异巨大。

解决方案:

  • 训练基础模型时考虑 assay 作为批次协变量
  • 使用 assay 字段进行分层采样
  • 评估模型在低代表 assay(如 Smart-seq2)上的泛化性

§7.7 Census “latest” vs “stable” 的版本混淆

问题:

  • census_version="stable":最新 LTS 版本(当前 2025-11-08),保证 5 年可访问
  • census_version="latest":每周更新版本,仅保留 1 个月

如果使用 “latest” 进行预训练,一周后数据可能已变化,无法复现。

解决方案:

  • 预训练和发表论文时始终使用 LTS 版本(如 census_version="2025-11-08")
  • 在论文中记录具体 Census 版本号
  • 仅在探索性分析时使用 “latest”

§7.8 细胞类型注释的粒度不一致

问题:不同数据集的原始细胞类型注释粒度差异巨大:

  • 数据集 A: "T cell" (粗粒度)
  • 数据集 B: "CD4-positive alpha-beta T cell, regulatory" (细粒度)
  • Lattice 策展映射到 CL 时可能统一到较粗粒度,丢失细粒度信息

解决方案:

  • 同时查看 cell_type(标准化)和 author_cell_type(原始标注)
  • 使用 CL 本体论的层级关系进行粒度调整
  • 对需要细粒度的分析,手动审查 author_cell_type 字段

§7.9 空间转录组数据的局限性

问题:Census 中的空间数据(Visium、Slide-seq)存在特殊问题:

  • Visium spot 可能包含多个细胞(不是真正的单细胞)
  • 空间坐标的坐标系不统一(不同实验使用不同的坐标系原点和缩放)
  • 空间数据的稀疏度更高(Dropout 更严重)

解决方案:

  • 使用 suspension_type 字段区分 true single-cell 和 spot
  • 空间数据分析时始终检查 assay 字段
  • 使用专门的空间分析方法(如 Squidpy、SpatialData)

§7.10 供体去标识化与隐私

问题:Census 数据经过去标识化处理,但 scRNA-seq 数据本身具有可识别性——每个细胞的基因型(尤其 HLA 区域、性染色体、线粒体单倍型)可用于个体识别。在大规模数据合并时,理论上可能通过基因型匹配重新识别供体。

解决方案:

  • CZI 已对供体 ID 进行不可逆哈希处理
  • 不提供原始 FASTQ 数据(仅 Count 矩阵)
  • 遵循 IRB 审批和知情同意要求
  • 用户不应尝试跨数据集进行供体重识别

§7.11 "正常"组织的定义模糊

问题:Census 中 disease == "normal" 的组织来自多种来源:健康供体活检、手术切除的癌旁组织、器官移植供体等。这些来源的组织在转录组上可能存在差异(如癌旁组织可能受肿瘤微环境影响)。

解决方案:

  • 分析正常组织时同时检查 dataset_id 和原始论文来源

  • 考虑使用 donor_id 作为协变量

  • 对异常结果进行来源溯源验证

§8 基准与生态

§8.1 单细胞数据平台横向对比

维度 CELLxGENE GEO Single Cell Portal HCA Data Portal 10x Cell Atlas
数据规模 217M 细胞 不限(原始数据) ~10M 细胞 ~50M 细胞 10x 内部
标准化 强制 ONTOLOGY 无标准化 部分 部分标准化 10x 格式
数据格式 TileDB-SOMA / H5AD FASTQ/BAM/MTX H5AD H5AD/MTX 10x MTX
API Python/R + S3 FTP/HTTP REST REST 无
可视化 WebGL 交互 无 Web UMAP Web 可视化 Loupe Browser
许可 CC BY 4.0 各异 各异 混合 商业
AI 训练 ✅ Census API ❌ 需自行处理 ❌ 部分 ❌
策展 Lattice 人工策展 无 提交者自策展 HCA 策展 10x 内部
版本管理 LTS + weekly 无 无 版本化 无
多物种 5 种灵长类 不限 人类为主 人类为主 人类/小鼠
空间数据 ✅ (Visium/Slide-seq) ✅ ❌ 部分 ✅

§8.2 单细胞基础模型性能对比

模型 预训练数据 参数量 细胞注释 F1 批次整合 (AvgBIO) 扰动预测 (ΔPearson) 发表期刊
scGPT 33M (Census) ~50M 0.92 0.68 0.85 Nature Methods 2024
Geneformer V1 30M ~30M 0.88 0.61 0.72 Nature 2023
Geneformer V2 104M (Census) ~100M 0.93 0.70 0.80 bioRxiv 2025
UCE 36M (Census) 650M 0.90 0.65 — bioRxiv 2023
CellFM >100M 800M 0.91 0.67 — Nature Comms 2025
TranscriptFormer 112M/12物种 ~300M 0.94 0.72 — bioRxiv 2025
scPRINT 50M (Census) ~100M 0.89 0.64 — bioRxiv 2024
AIDO.Cell 100M+ (Census) ~1B 0.93 0.71 — arXiv 2025
scVI (基线) 各自训练 ~1M 0.85 0.63 — Nature Methods 2018
Random Forest (基线) — — 0.72 — — —

注意:上述数字为各论文自报的最佳结果,任务和数据集不同,不可直接横向比较。2025 年 Theis Lab 发表的系统基准测试 (Nature Methods) 表明,预训练数据规模和多样性的增加对模型性能提升有限,预训练数据质量比规模更重要。

§8.3 scGPT vs Geneformer 架构对比

维度 scGPT Geneformer
Tokenization Value binning (52 bins) Rank encoding (genes sorted by expression/median)
输入格式 (gene_id, binned_value) pairs Ranked gene ID sequence
位置编码 无(基因无序) 隐含在排名顺序中
预训练目标 Masked gene modeling (MSE loss) Masked language modeling (CE loss)
架构 Transformer encoder BERT-style encoder
嵌入维度 512 512 (V1) / 768 (V2)
层数 12 12 (V1) / 24 (V2)
注意力头 8 8 (V1) / 12 (V2)
输入长度 可变 (所有基因) 4096 genes/cell
多组学 ✅ (ATAC + RNA) ❌ (仅 RNA)
多物种 ❌ (仅人类) ✅ (V2 多物种)
优势 表达值保留;多组学 对 dropout 鲁棒;规模更大
劣势 对噪声敏感 丢失绝对表达量信息

§8.4 TranscriptFormer——CZI 自研模型

TranscriptFormer 是 CZI 于 2025 年发布的单细胞基础模型,与 Census 深度集成:

属性 值
预训练数据 1.12 亿细胞,12 个物种
参数量 ~300M
架构 Encoder-decoder Transformer
输入 基因 ID + 表达值(类似 scGPT)
输出 基因表达预测(生成式)
嵌入 256 维(内置 Census)
物种 人类、小鼠、猕猴、绒猴、黑猩猩、大鼠、斑马鱼、果蝇、线虫等 12 种
代码 github.com/czi-cellgenomics/transcriptformer
Census 集成 tf-sapiens (物种特异) + tf-exemplar (参考映射)

核心创新:

  1. 多物种预训练:首次在 12 个物种上联合预训练,学习跨物种保守的细胞状态表示
  2. 生成式解码器:可生成虚拟细胞(in silico cell generation),用于数据增强和假设验证
  3. Census 原生集成:嵌入预计算并内置在 Census 中,用户无需自行推理

§8.5 CELLxGENE 在单细胞 AI 生态中的角色

CELLxGENE Census 在单细胞 AI 生态中扮演类似 ImageNet 在计算机视觉中的角色——一个大规模、标准化、公开可用的预训练数据基准:

类比维度 ImageNet (CV) CELLxGENE Census (scRNA-seq)
数据规模 1.28M 图像 217M 细胞
类别数 1,000 类 898 种细胞类型
标注质量 人工标注 Lattice + ONTOLOGY 策展
许可 研究用途 CC BY 4.0 (商业可用)
预训练模型 ResNet/ViT/CLIP scGPT/Geneformer/UCE/TF
下游任务 检测/分割/生成 注释/整合/扰动/生成
基准测试 ImageNet-C/A/R scIB/Perturbation benchmarks
版本管理 静态 LTS + weekly

§8.6 Billion Cells Project

2025 年 2 月,CZI 启动了 Billion Cells Project,这是单细胞生物学领域迄今最大规模的数据生成计划:

维度 详情
目标 首年生成近 5 亿细胞(当前 2.17 亿 → 7 亿+)
投资 CZI 投入 $2.5 亿
技术 10x Chromium X / Xenium / 新兴单细胞平台
组织重点 补充当前覆盖不足的组织(皮肤、肌肉、内分泌、消化系统)
物种 扩展非人灵长类和模式动物
疾病 增加罕见病和肿瘤亚型覆盖
AI 集成 数据生成与 AI 模型训练同步推进
时间表 2025.02 启动,2026 年底首阶段完成

对 AI 的影响:5 亿+ 细胞的预训练数据将使单细胞基础模型的规模从当前的 ~1B 参数扩展到 ~10B+ 参数,接近 LLM 的规模。

§8.7 关键科学发现案例

CELLxGENE 数据已直接支撑多项重要科学发现:

发现 数据来源 期刊 年份 影响
Tabula Sapiens——首张全组织人类细胞图谱 Tabula Sapiens dataset (Census) Science 2022 24 组织、~500K 细胞、400+ 细胞类型
COVID-19 免疫图谱 多中心 COVID 单细胞研究 (Census) Nature Medicine 2021 揭示重症 COVID 的免疫失调机制
肠道细胞图谱 Gut Cell Atlas (Census) Nature 2021 发现新的肠内分泌细胞亚型
肺纤维化细胞图谱 肺纤维化 scRNA-seq (Census) Science Advances 2022 识别病理性成纤维细胞亚群
跨物种神经元保守性 人类+小鼠+猕猴脑数据 (Census) Nature 2023 跨物种细胞类型进化分析
scGPT 基础模型 33M Census 细胞 Nature Methods 2024 首个大规模单细胞基础模型
Geneformer 疾病基因发现 30M Census 细胞 Nature 2023 心肌病候选治疗靶点

§8.8 社区与生态工具

工具 类型 与 CELLxGENE 的关系
Scanpy Python scRNA-seq 分析 Census 数据直接加载为 AnnData
Seurat R scRNA-seq 分析 通过 Census R API 获取数据
scVI/scANVI 深度学习整合 Census 预计算 scVI 嵌入
CellTypist 自动细胞类型注释 使用 CL 本体论(与 Census 一致)
Squidpy 空间转录组分析 兼容 Census 空间数据
Celligner 细胞系-肿瘤对齐 部分使用 Census 参考
CellxGene Annotate 交互式标注工具 CELLxGENE 组件之一
TileDB-SOMA 存储引擎 Census 底层技术
bio_embeddings 蛋白质嵌入 可与 Census 嵌入联合分析

§9 资源索引

§9.1 核心论文

论文 期刊 年份 DOI
CZ CELLxGENE Discover preprint bioRxiv 2023 10.1101/2023.10.30.563174
scGPT: foundation model for single-cell Nature Methods 2024 10.1038/s41592-024-02201-0
Geneformer V1 Nature 2023 10.1038/s41586-023-06139-9
UCE (Universal Cell Embeddings) bioRxiv 2023 10.1101/2023.11.28.568918
CellFM Nature Communications 2025 —
TranscriptFormer bioRxiv 2025 —
scPRINT bioRxiv 2024 —
Tabula Sapiens Science 2022 10.1126/science.abl4896
scVI Nature Methods 2018 10.1038/s41592-018-0229-2
预训练数据规模评估 Nature Methods 2025 10.1038/s41592-026-03120-y

§9.2 官方资源

资源 URL
Discover 门户 https://cellxgene.cziscience.com/
Census 文档 https://chanzuckerberg.github.io/cellxgene-census/
Census Python API pip install cellxgene-census
Census R API install.packages("cellxgene.census")
Census AWS S3 s3://cellxgene-census-public-us-west-2/
GitHub (Census) https://github.com/chanzuckerberg/cellxgene-census
GitHub (Annotate) https://github.com/chanzuckerberg/cellxgene
Census 数据发布 https://chanzuckerberg.github.io/cellxgene-census/cellxgene_census_docsite_data_release_info.html
Virtual Cell Models https://virtualcellmodels.cziscience.com/
Schema 文档 https://github.com/chanzuckerberg/single-cell-curation/blob/main/schema/5.0.0/schema.md
Billion Cells Project https://chanzuckerberg.com/science/programs-resources/single-cell-biology/

§9.3 模型与代码

模型 GitHub / HuggingFace
scGPT github.com/bowang-lab/scGPT
Geneformer huggingface.co/ctheodoris/Geneformer
UCE github.com/snap-stanford/UCE
CellFM github.com/PharMolix-Lab/CellFM
TranscriptFormer github.com/czi-cellgenomics/transcriptformer
scPRINT github.com/czi-cellgenomics/scPRINT
scVI github.com/scvi-tools/scvi-tools
AIDO.Cell github.com/genomoncology/aido

§9.4 外部关联资源

资源 URL
Human Cell Atlas https://www.humancellatlas.org/
GEO (Gene Expression Omnibus) https://www.ncbi.nlm.nih.gov/geo/
Single Cell Portal https://singlecell.broadinstitute.org/
Allen Brain Cell Atlas https://alleninstitute.org/division/brain-science/
CZ Biohub https://www.czbiohub.org/
OBO Foundry (Ontologies) http://obofoundry.org/
Cell Ontology https://www.ebi.ac.uk/ols/ontologies/cl
UBERON https://www.ebi.ac.uk/ols/ontologies/uberon
MONDO https://www.ebi.ac.uk/ols/ontologies/mondo
EFO https://www.ebi.ac.uk/ols/ontologies/efo

§10 数据集声明卡

属性 值
数据集名称 CZ CELLxGENE Discover Census
当前版本 Census LTS 2025-11-08
Schema 版本 Census 2.4.0 / Dataset 7.0.0
总细胞数 217,767,936 (2.17 亿)
人类细胞 162,025,130 (1.62 亿)
小鼠细胞 46,299,127 (4,630 万)
数据集数 1,845
细胞类型 898 种 (人类)
组织覆盖 417 种 (人类)
Assay 类型 37 种 (人类)
物种 人类、小鼠、猕猴、绒猴、黑猩猩
数据格式 H5AD (AnnData) / TileDB-SOMA
存储引擎 TileDB-SOMA (列式稀疏数组)
许可 CC BY 4.0
维护方 Chan Zuckerberg Initiative (CZI)
策展方 Lattice Curation Team (Stanford)
核心论文 bioRxiv 2023.10.30.563174
DOI 10.1101/2023.10.30.563174
数据下载 AWS S3 (免签名) / Census API
预计算嵌入 scVI (30D) / TranscriptFormer (256D)
AI 模型 scGPT / Geneformer / UCE / CellFM / TF / scPRINT / AIDO.Cell
下一里程碑 Billion Cells Project (目标 5 亿+/年)
DAIMS 评分 17.0/24

相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • human-protein-atlas — 共享标签:基因组学与多组学 / 医学影像 / 转录组 / 病理图像
  • hest-1k — 共享标签:医学影像 / 转录组 / 病理图像
  • tabula-muris — 共享标签:基因组学与多组学 / 医学影像 / 病理图像
  • hlca — 共享标签:医学影像 / 转录组 / 病理图像
  • kpmp — 共享标签:基因组学与多组学 / 转录组 / 病理图像
  • multimedbench — 共享标签:基因组学与多组学 / 医学影像
  • tabula-sapiens — 共享标签:基因组学与多组学 / 转录组
  • single-cell-portal — 共享标签:基因组学与多组学 / 转录组
  • hcl — 共享标签:基因组学与多组学 / 转录组
  • metabolights — 共享标签:基因组学与多组学 / 转录组

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集