信息速览
DisCP-Atlas 要接的活儿,是遗传学里最难收尾的那一段。全基因组关联研究已经把成千上万个位点指向了疾病,但位点落在非编码区时,它调控的是哪一种细胞里的哪一个基因,关联研究自己答不上来。DisCP-Atlas 的做法是先不管细胞类型,把单细胞数据拆成一批基因共表达程序,再问每一套程序能不能解释某种疾病的遗传力。
这套思路的代价和收益都很清楚。收益是它绕开了「细胞类型定义不统一」这个老麻烦,用程序而不是标签来做归因;代价是程序本身是分解出来的数学对象,命名靠最富集的通路去凑,很容易被当成细胞类型来用。这两个性质,决定了它适合做候选生成,不适合做机制结论。
资源目前有六个可下载文件,主表约七万行,覆盖 50 套单细胞数据与一千余套 GWAS。本文把它的结构、能接的活、接不上的活,以及几个最容易踩的坑,逐项拆开。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 官方名称 | DisCP-Atlas(Disease to Cellular Process Atlas) |
| 中文定名 | 疾病—细胞程序图谱 |
| 建设机构 | 香港大学医学院 Chen Cao 课题组 |
| 发表载体 | Nucleic Acids Research 数据库专辑 2026 年第 54 卷 D1 期 |
| DOI | 10.1093/nar/gkaf1129 |
| 正式上线 | 2025 年,站点末次公告更新为 2025 年 9 月 25 日 |
| 核心抽象 | 细胞程序(基因共表达模块),而非细胞类型 |
| 分解方法 | 共识非负矩阵分解,程序数由启发式规则选定 |
| 程序总数 | 990 个 |
| 单细胞数据集 | 57 套(站点口径)/50 条(显著结果表实际出现的数据集名) |
| 组织覆盖 | 37 个(站点)/35 个(论文摘要) |
| GWAS 套数 | 1072 套 |
| 疾病数 | 759 种,按 MeSH 归入 21 个大类 |
| 关联检验总量 | 站点称 1,061,280 条,关于页另称 751,410 对 |
| 显著关联 | 三万七千余条(论文),下载子集七万余行 |
| 富集统计量 | E-score 与富集 P 值两列 |
| LD 参考面板 | 1000 Genomes 欧洲人群 |
| 文件格式 | 六个 csv.gz,合计约 77 MB |
| 许可 | CC BY-NC-ND 4.0(机构库记录);站点未单列数据集许可 |
| 取数方式 | 网页查询 + 直接下载 + 在线基因集富集工具 |
| 不含 | 任何个体级表达、基因型或测序读段 |
§1 它要解决的具体麻烦
1.1 非编码位点的归因缺口,是这张图谱唯一想填的洞
做法可以拆成一条流水线。输入侧有两堆东西:一堆是若干套公开的人类单细胞转录组,每套都带着自己的细胞类型注释与样本来源;另一堆是上千套疾病的 GWAS 汇总统计,每套都带着自己的样本量、人群构成与研究设计。输出侧只有一个数:某个基因程序所覆盖的基因组区间,能为某套 GWAS 解释多少比例的遗传力。这个数被减掉「全部蛋白编码基因」这条基线之后,剩下的部分记为富集分数。
所以这张图谱真正回答的问题只有一个:某种疾病的人群遗传信号,在基因组上的分布更像哪一组共表达基因。它反复被拿来和两类东西比较。一类是直接把 GWAS 位点挂到细胞类型的资源,这类资源给的是「这个位点附近的基因在某种细胞里高表达」;另一类是直接把位点映射到调控元件的资源,给的是「这个位点在染色质可及性上像哪种细胞」。DisCP-Atlas 中间多插了一层——先把基因组织成程序,再用程序去碰遗传信号。
这中间的一层是它全部的独特之处,也是它全部风险之源。跳过细胞类型这一层,确实能躲开「同一种细胞在两个数据集里叫不同名字」的麻烦;但也意味着产物不再是一个可以指认的生物学对象,而是一个降维后的方向向量。站点用「最富集的通路」给它起名,于是 990 个程序里会同时出现若干个都叫「轴突引导」或都叫「细胞外基质组织」的东西,它们的差别只在所属数据集不同。
1.2 三条常见的错误期待
第一条期待是「拿来直接当细胞类型的表达参考」。这条落空的理由很硬:程序不是细胞,活动度是每细胞一个数,多个程序可以同时在一个细胞里活跃,也可以都不活跃。用它去标定细胞特征基因,得到的是一批混了状态、批次与技术噪音的基因。
第二条期待是「每一个程序-疾病关联都有对应的细胞类型」。这个期待会让人在下载主表后困惑:不输出细胞类型的地方很多。程序表里有一列细胞类型特异性标记,在主表里则另有一列富集细胞类型,两者都允许为空;标准化那一列空得更多。按细胞类型过滤,会静默丢掉一部分行。
第三条期待是「这是一份可以复现的完整分析」。资源提供的是结果,不是管道。六个文件里最接近「管道输出」的是基因贡献分数表,它给出了每个基因对每个程序的贡献;但从贡献分数回到 LD 分数、回到回归系数的那两步,需要自己按论文方法部分复刻,而方法部分对不同数据集的参数设定并不逐套列出。
| 你会这样想 | 为什么这么想 | 实际会遇到的 |
|---|---|---|
| 这是一张细胞类型注释表 | 站点名字里有 Cell | 主对象是程序,编号只在数据集内有效 |
| 每一条关联都能落到某类细胞 | 论文摘要强调细胞分辨率 | 一部分行的细胞类型列为空,标准化列空得更多 |
| 富集分数越大越可信 | 列表默认可以按分数排序 | 分数与 P 值不同向,头部含不显著的行 |
| 我可以按疾病行数比较 | 表格里疾病是主键之一 | 同一病有十几套 GWAS,行数由研究数量决定 |
| 这套流程可以照着重跑 | 方法写在关于页 | 逐套参数未列出,K 值选择规则只是启发式 |
1.3 它能给到的与给不到的
要判断够不够用,最省事的办法是把需求逐条摆到表上。下面这张表把常见需求按「给到什么程度」分成三档:能给精确值、能给方向、给不了。
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 某疾病有哪些候选细胞程序 | 该疾病下按富集分数排序的程序清单,带通路标签 | 够,用于生成候选 |
| 某基因参与哪些程序 | 基因-程序关系表,含贡献分数、细胞类型、通路 | 够,字段齐全 |
| 某程序被哪些疾病涉及 | 反向查询,按疾病标识聚合 | 够,但需自己按疾病去重 |
| 一批自选基因落在哪些程序 | 在线富集工具,逐行一个基因上传 | 够,结果可下载 |
| 这些关联的因果方向 | 无 | 给不了 |
| 关联背后的具体调控元件 | 只到程序与 SNP 注释层,不到单个增强子 | 给不了精确位置 |
| 细胞类型的统一定义 | 提供标准化列,但覆盖不全 | 部分够 |
| 个体级表达或基因型 | 无 | 给不了 |
| 非欧洲人群的校准结果 | 无 | 给不了 |
| 直接用于模型的训练特征 | 无现成嵌入,需自己构造 | 部分够 |
1.4 你的处境与它能帮到的事
处境比需求更能决定用法。下面按五种常见处境列出它实际能起的作用,以及接下来该做的那一步。
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 手上有一个 GWAS 位点,审稿人问「作用在哪种细胞」 | 给出该疾病下排名靠前的程序与通路,作为解释的候选框架 | 用本地单细胞数据核对候选基因的表达,别直接抄排名第一 |
| 手上有一批差异基因,想知道它们更像哪种细胞程序 | 在线富集工具可直接上传基因列表,返回显著程序 | 先确认基因符号版本,再上传;结果里优先看细胞类型特异的那批 |
| 要为一个候选靶点找疾病方向的旁证 | 反向查出该基因所在的程序被哪些疾病涉及 | 只把它当作旁证之一,主证据仍需来自功能实验或人群数据 |
| 在做多组学整合,需要一层可解释的中间表示 | 程序-基因权重矩阵可当作低维表示 | 注意程序编号不可跨数据集混用,需按数据集分别对齐 |
| 想系统盘点某个系统的疾病-细胞关系 | 可批量下载主表,按组织与疾病交叉统计 | 先去重再统计,避免把研究数量当成证据强度 |
如果你的处境是「要写一份能通过遗传学审稿的机制论证」,那么它只提供起点,不提供终点。这一点在动手前就要认下来,否则后面每一步都会想往回找它不提供的东西。
1.5 一句话判断
它是一张把基因共表达程序与疾病遗传力对齐的候选清单,价值在缩小搜索面,不在给出结论;把它当机制证据用,是所有失败用法里最常见的一种。
1.6 不适合谁:四条边界
第一,不适合需要指认具体细胞类型的人。 如果你要的答案是「小胶质细胞」,这张图谱给的是一个程序编号加一条最富集通路,程序可能同时在小胶质细胞和巨噬细胞里活跃。要指认细胞类型,去用把位点直接挂到细胞类型上的资源更省事。
第二,不适合非欧洲队列为主的疾病研究。 LD 参考面板是固定的,富集分数的估计依赖 LD 结构。队列与参考面板的人群不匹配时,分数会系统偏移。这在方法上是已知的限制,资源本身没有提供替代面板。
第三,不适合需要个体级数据的人。 没有表达矩阵、没有基因型、没有测序读段。想做重估、做敏感性分析、换分解方法重跑,都得回到底层来源数据集,那些数据集各自有各自的准入条件。
第四,不适合把它当基准集训练模型的人。 主表的标签是「这台 GWAS 在这个程序上是否有富集」,正例由阈值切出来,负例由其余行构成,两者在样本量上高度不平衡;直接用这个标签训练,模型学到的多半是样本量而不是生物学。
§2 数据构成与规格
2.1 六个文件构成整个资源
下载页列出六个文件,全部是 csv.gz。按体积分成两类:一类是索引与注释,体积在几十兆以下;一类是逐条结果,体积到几十兆。六个文件之间靠两个键串起来:程序编号与数据集名共同定位一个程序,基因符号定位一条基因-程序关系,疾病标识定位一套 GWAS。
这种以文件为单位的分发方式,好处是没有服务端依赖,坏处是没有版本号字段。文件内容会随站点更新而变,但文件名不变。判断自己拿到的是哪一版,只能靠比对行数与文件修改时间,站点下载页没有提供版本清单。这一点在做长周期项目时需要留意:同一篇论文里两年前下载的主表和今年下载的主表,行数可能不同,而两者都叫同一个文件名。
另一个结构特点是分隔符不统一。模块信息表是逗号分隔且每个字段带双引号,主表和基因关系表是制表符分隔且不带引号。用同一个读表函数吃这两类文件会出错,需要按扩展名分别指定分隔符。
| 文件名 | 内容 | 官方体积 | 分隔符 | 按什么定位一行 |
|---|---|---|---|---|
| module_info.csv.gz | 990 个程序的基本信息 | 17K | 逗号,带引号 | 程序编号 + 数据集 |
| all_association_results.csv.gz | 全量程序与性状的关联 | 60M | 未核实 | 未核实 |
| association_results.csv.gz | 显著关联子集 | 2.3M | 制表符,无引号 | 疾病 + 数据集 + 程序 |
| gene_module_relationship.csv.gz | 基因与程序的关系 | 7.4M | 制表符,无引号 | 基因 + 数据集 + 程序 |
| gene_combined_final.csv.gz | 每个基因对每个程序的贡献分数 | 1.5M | 未核实 | 基因 + 程序 |
| enrichment_results.csv.gz | 通路富集结果 | 6M | 逗号,带引号 | 程序 + 通路库编号 |
主表的列里有一个细节值得单独说:疾病标识与性状名是两列。疾病标识是站点自建的编号,形如一个字母缩写加四位数字;性状名则是原始 GWAS 报告的研究名,形如一个 ICD 章节码加一段英文描述。这两列不是一一对应,同一个疾病标识下可以挂多套性状,因为同一疾病的不同研究会用不同的表型定义。做跨研究合并时,必须以疾病标识而不是性状名为准。
2.2 字段/记录的完整字典
下表逐个列出主表与两张附属表的字段。类型一栏按实际读入后的表现推断,缺失一栏记录空值的写法。
| 表 | 字段 | 含义 | 类型 | 缺失写法 | 用法要点 |
|---|---|---|---|---|---|
| 主表 | DisCP_ID | 疾病自建编号 | 字符串 | 无 | 跨研究合并的唯一依据 |
| 主表 | Trait | 原始 GWAS 性状名 | 字符串 | 无 | 保留原研究措辞,便于回溯 |
| 主表 | Mesh Term | 归并后的 MeSH 主题词 | 字符串 | 无 | 可按 MeSH 树浏览 |
| 主表 | Single Cell | 单细胞数据集名,组织加来源 | 字符串 | 无 | 组织前缀可用于分系统统计 |
| 主表 | Module Name | 程序编号加最富集通路 | 字符串 | 无 | 冒号后缀是人工可读标签 |
| 主表 | Module | 纯程序编号 | 字符串 | 无 | 跨表连接键 |
| 主表 | Escore | 富集分数 | 浮点,可为负 | 无 | 与全基因基线之差 |
| 主表 | Enrichment Pvalue | 富集检验 P 值 | 浮点 | 无 | 与分数不同向,须分开看 |
| 主表 | Enrichment SD | 富集估计的标准差 | 浮点 | 无 | 反映估计精度,常被忽略 |
| 主表 | Enriched Cell Type | 最富集细胞类型 | 字符串 | 字面 NA | 空值较多 |
| 主表 | Enriched Pathway | 最富集通路 | 字符串 | 无 | 程序的主要可读标签 |
| 主表 | Standardized Cell Type | 细胞本体标准化标签 | 字符串 | 字面 NA | 2025 年 9 月新增 |
| 程序表 | Module | 程序编号 | 字符串 | 无 | 与主表连接 |
| 程序表 | Cell Type Specificity | 是否细胞类型特异 | 字符串 | 无 | 取值 Yes 或 No |
| 程序表 | Enriched Cell Type | 最富集细胞类型 | 字符串 | 无 | 与主表同名列语义一致 |
| 程序表 | Enriched Pathway | 最富集通路 | 字符串 | 无 | 与主表同名列语义一致 |
| 程序表 | single_cell | 所属数据集 | 字符串 | 无 | 与主表数据集名对齐 |
| 基因表 | Gene | 基因符号 | 字符串 | 无 | 在线工具的上传键 |
| 基因表 | Ensembl ID | 稳定基因编号 | 字符串 | 无 | 跨版本比对用这个 |
| 基因表 | Gene Type | 基因类型 | 字符串 | 未核实 | 可用于只看蛋白编码 |
| 基因表 | Gene Location | 染色体与坐标 | 字符串 | 未核实 | 与位点做邻近匹配时用 |
| 基因表 | Score | 贡献分数 | 浮点 | 无 | 归一化到 0 到 1 之间 |
| 富集表 | Database | 通路库名 | 字符串 | 无 | 至少含 KEGG 与 Reactome |
| 富集表 | GeneRatio | 命中数比背景 | 字符串 | 无 | 形如分子斜杠分母 |
| 富集表 | p.adjust | 校正后 P 值 | 浮点 | 无 | 比原始 P 值可靠 |
主表有一列看起来像冗余,实则关键:富集标准差。它与富集分数配成一对,用来判断分数是否稳定。同一个程序在两套 GWAS 上分数相近,但一套的标准差很小、另一套很大,前者的相近才有意义。按分数排序完全忽略这一列,是导致误读的常见起点。
2.3 一条记录的完整解剖
取主表的一行做拆解,比看字典更直观。下面这行来自显著结果子集,是脑组织一个程序与一套消化道疾病 GWAS 的检验结果。
DisCP0266 K20-K31 Diseases of oesophagus, stomach and duodenum Gastrointestinal Diseases Brain_Dharshini Module_1: Nucleocytoplasmic transport Module_1 8.41 0.00108 2.73 NA Nucleocytoplasmic transport NA
逐段读:疾病编号指向一套消化道疾病的 GWAS;性状名是原始研究的表型描述;MeSH 主题词把它归入胃肠道疾病;单细胞数据集是脑组织的一个来源;程序编号是 1 号,人工标签取自最富集通路「核质转运」;富集分数 8.41,富集 P 值约千分之一,标准差 2.73;最富集细胞类型为空,通路为核质转运,标准化细胞类型也为空。
这一行本身就是一则很好的教材。一个脑组织的程序,被一套消化道疾病的 GWAS 富集到了——这在生物学上并不荒谬,核质转运是几乎所有细胞都需要的管家过程,脑组织里测到的这类程序与消化道疾病的共享遗传结构,可能来自共同的细胞基础,也可能来自管家基因在遗传力模型里的一贯表现。它更适合被读成「这两个组织在核质转运相关的基因上共享了部分遗传结构」,而不是「脑细胞的核质转运导致消化道疾病」。
用同样的读法看另一行,结论会完全不同:一个 P 值约 0.088、分数却接近七十的行。P 值不显著而分数很高,说明这个组合的估计很不稳定,标准差往往也大。这类行在列表按分数排序时会浮到前面,如果只看分数不看 P 值,就会把一个统计上站不住的结果当成强信号。
#-- 把一行拆成十三个字段后逐段打印,便于核对每一列落在哪里
row = "DisCP0266\tK20-K31 Diseases of oesophagus, stomach and duodenum\tGastrointestinal Diseases\tBrain_Dharshini\tModule_1: Nucleocytoplasmic transport\tModule_1\t8.41\t0.00108\t2.73\tNA\tNucleocytoplasmic transport\tNA"
fields = row.split("\t")
names = ["DisCP_ID", "Trait", "Mesh", "Dataset", "ModuleName", "Module",
"Escore", "Pvalue", "SD", "CellType", "Pathway", "StdCellType"]
for k, v in zip(names, fields):
print(k.ljust(12), v)
2.4 主表规模的三个口径
关于「一共多少条关联」,站点上同时存在三个数。首页与关于页写的是全量检验总数,关于页下半部分又写了一个更小的数,论文摘要给的是显著关联数。三个数各自对应不同的筛选条件,混用会得出互相矛盾的结论。
| 口径 | 数值 | 出处 | 对应的筛选 |
|---|---|---|---|
| 全量检验 | 约一百零六万 | 站点首页与关于页上半 | 全部程序 × 全部性状 |
| 另一口径 | 约七十五万 | 站点关于页下半 | 去重后的程序-性状对 |
| 显著关联 | 三万七千余条 | 论文摘要 | 按显著性筛选 |
| 下载子集 | 七万余行 | 下载文件实际行数 | 站点公告的浏览阈值 |
差额的构成官方没有说明。可以确定的是,下载的显著子集行数介于显著关联数与「全量去重后的对数」之间,说明子集使用的阈值比论文摘要更宽,与站点 2025 年 9 月 21 日把浏览阈值放宽到 P 小于 0.10 的公告一致。
覆盖面上还有一处口径差:站点写 57 套单细胞数据、37 个组织,论文摘要写 57 套、35 个组织。显著结果表里实际出现的数据集名是 50 个。差额可能来自没有产生任何显著关联的数据集,也可能来自命名合并,官方没有给出对照表。同理,论文摘要写的疾病数是 759,而显著表里出现的疾病编号也是一千零七十二个不同的值——后者与 GWAS 套数相同,说明在显著表里疾病编号与 GWAS 套数恰好一一对应,而论文的 759 是归并 MeSH 之后的疾病数。
| 维度 | 站点口径 | 论文口径 | 下载表核对 |
|---|---|---|---|
| 单细胞数据集 | 57 | 57 | 50 |
| 组织数 | 37 | 35 | 组织前缀约 35 类 |
| 程序数 | 990 | 990 | 程序表 990 行 |
| GWAS 套数 | 1072 | 1072 | 疾病编号 1072 个 |
| 疾病数 | 759 | 759 | 未在表内单列 |
| 显著关联 | 未单列 | 三万七千余条 | 七万余行 |
组织分布很不均衡。按显著表里数据集名的组织前缀归并,脑、血液、脾、心、肝五类合计占了四成以上。这不完全反映供给侧——单细胞数据集的热门组织本来就集中在这些部位。做跨系统的比较时,这个不均衡必须显式处理,否则结论会偏向被研究得多的系统。
| 组织 | 表内数据集数 | 说明 |
|---|---|---|
| 脑 | 5 | 含海马、多个皮层来源 |
| 血 | 4 | 含外周血与骨髓来源 |
| 肝 | 4 | 含多套肝细胞图谱 |
| 心 | 3 | 含心房与心室 |
| 皮肤 | 3 | 含多套带疾病背景的来源 |
| 脂肪 | 3 | 皮下与内脏分开 |
| 肾 | 3 | 含肾癌旁组织来源 |
| 肺 | 3 | 含气道与肺泡 |
| 肠 | 4 | 小肠与结肠分开 |
| 其余组织 | 各一至二套 | 覆盖较薄 |
2.5 与同类资源的字段差异
拿它和库内已有的几份资源并列摆开,字段层面的差别立刻清楚。GWAS Catalog 提供的是研究登记与位点注释,不给细胞层信息;人类细胞图谱提供的是细胞与供者元数据,不给疾病遗传关联;GTEx 提供的是组织层面的表达与表达数量性状位点,介于两者之间但粒度是组织。DisCP-Atlas 的位置很窄:只有它同时具备「程序级别的基因集」与「遗传力富集」。
| 资源 | 主对象 | 疾病侧字段 | 细胞侧字段 | 是否有遗传力统计 |
|---|---|---|---|---|
| DisCP-Atlas | 细胞程序 | 疾病编号、性状、MeSH、P 值、分数 | 数据集、程序、细胞类型、通路 | 有,分层 LD 分数回归 |
| GWAS Catalog | 研究登记 | 性状、样本量、位点、效应值 | 无 | 无 |
| 人类细胞图谱 | 细胞与供者 | 有疾病元数据字段 | 细胞类型、组织、供者 | 无 |
| GTEx | 组织表达 | 无疾病侧 | 组织、供者、细胞类型组成推断 | 有,表达数量性状位点 |
| 单细胞表达图谱 | 细胞表达 | 有疾病条件字段 | 细胞类型、组织 | 无 |
从这张表可以读出一个判断:DisCP-Atlas 的疾病侧字段比 GWAS Catalog 粗(只到 MeSH 与性状名,不含位点级效应),细胞侧字段比细胞图谱粗(只到程序与细胞类型标签,不含细胞级元数据)。它唯一的独占优势是那张遗传力统计表。如果你的问题不需要这张表,用别的资源会更省事。
§3 核心层 A:它把「细胞类型」换成了「程序」
3.1 程序是什么,不是什么
程序是矩阵分解的产物。把一套单细胞的表达矩阵(细胞乘基因)分解成两个矩阵:一个给出每个基因对每个程序的贡献,一个给出每个细胞里每个程序的活跃程度。程序数 K 由一套启发式规则选定——让解稳定性与重建误差的差值最大的那个 K。这一步做完,每个数据集得到一组程序,编号从一号开始。
这里有三件事容易搞混。程序不是通路:通路是有注释的基因集合,程序是从数据里长出来的,只在事后用通路富集去命名。程序不是细胞类型:细胞类型按标记基因划分,程序按共表达模式划分,两者是多对多关系。程序不是基因模块的稳定实体:换一套数据、换一个 K,同样的基因会落进不同的程序,编号会整体错位。
3.2 为什么绕开细胞类型反而是一种设计
绕开的理由写在站点的方法说明里:很多疾病相关的机制表现为跨细胞群的动态基因程序,而不是静态的细胞类型特征。这句话的意思很实在——炎症反应、应激反应、增殖这样的过程,会在不同细胞类型里以相似的基因程序出现,如果先把细胞类型切死,这类跨类型的程序就会被切碎。
代价也很实在。细胞类型是生物学上有指认对象的概念,程序不是。当一个程序被标注为「细胞类型特异」时,它的含义是「这个程序在一类或几类细胞里显著高活跃」,而不是「这个程序属于那类细胞」。这个区别在下游写作时常常被抹平,抹平之后结论就会不知不觉地滑向「小胶质细胞的某程序导致疾病」这种表述。
3.3 990 这个数字怎么来的
990 是 50 套(站点写 57 套)单细胞数据各自选定的 K 值之和。这个数与细胞数无关,也与组织数无关,只与分解的粒度有关。换句话说,990 不是「发现了 990 种细胞状态」这样的生物学结论,而是「按这套规则每套数据大致留下二十个程序」这样的工程结果。
这个性质解释了一个常见困惑:为什么不同组织分到的程序数差不多。因为 K 的选择规则对所有数据集一视同仁,只看稳定性与重建误差的差值,不看该组织的细胞类型丰富程度。一个细胞类型单一的组织和一个类型复杂的组织,都可能被选出相近的 K。
| 分解环节 | 输入 | 输出 | 关键参数 | 可复现性 |
|---|---|---|---|---|
| 表达矩阵整理 | 各来源单细胞的原始计数 | 统一基因符号的细胞乘基因矩阵 | 表达过滤阈值 | 各来源不一致 |
| 共识非负矩阵分解 | 整理后的矩阵 | 基因权重矩阵与细胞活动矩阵 | 程序数 K、重复次数 | K 由启发式选定 |
| 基因权重归一化 | 基因权重矩阵 | 0 到 1 之间的权重 | 极小极大归一化 | 可复现 |
| 阈值截断 | 归一化权重 | 前 5% 基因集 | 百分位阈值 | 可复现 |
| 细胞类型判定 | 细胞活动矩阵与注释 | 特异或共享 | 显著性判定 | 规则未详述 |
| 通路命名 | 前 5% 基因集 | 最富集通路名 | 富集库与校正方法 | 依库版本 |
3.4 程序的两种身份:特异与共享
站点把程序分成两类:细胞类型特异与共享。前者是在一类或多类细胞中显著高活跃,后者在各类细胞间活动度差别不大。这个划分对下游用法影响很大:特异的程序更适合拿去做细胞归因,共享的程序更适合拿去做跨组织的机制讨论,强行给它指一个细胞类型是错的。
共享程序的存在也是这张图谱最有争议的地方。一个在各类细胞里活动相近的程序,在遗传力富集分析里往往对应管家基因集合;这类基因的遗传结构在大多数疾病上都有微弱信号,于是共享程序容易在大量疾病上同时显著。这不是造假,而是统计上的必然。当你在结果里看到某个共享程序同时挂在几十种疾病上时,先别急着找共同的生物学解释,想想它是不是一组管家基因。
3.5 与「位点到细胞类型」路线的分工
把位点直接挂到细胞类型的路线,核心步骤是:找到位点附近的基因,看这些基因在哪些细胞类型里特异表达,做富集检验。这条路线的优点是结论可以直接指认细胞,缺点是对细胞类型的划分极度敏感,且无法处理跨类型的程序。
两条路线并不互斥。合理的做法是把它们当作两条互补的证据线:位点到细胞类型的路线给指认,程序到遗传力的路线给机制框架。两边同时指向的组织或细胞群,可信度高于任何单边。这条分工在 §7 的外部验证矩阵里会再展开一次。
§4 核心层 B:质量与特色
4.1 质量的第一道关:来源数据的异质性
资源的质量上限由输入决定。57 套单细胞数据横跨十余年、几十个课题组、多种建库化学与测序平台,也横跨多种预处理流程。DisCP-Atlas 做的是在分解之前统一基因符号、在分解之后统一注释,但并没有做批次整合——因为每个数据集是独立分解的,跨数据集的比对本来就不在它的设计里。
独立分解有一个好处:不会引入跨数据集的整合偏差,每个程序的解释都在自己的数据集内部自洽。代价是失去了跨组织比较的能力。你不能问「同一个程序在肝和脑里是否活跃度不同」,因为没有共同的程序坐标系。
基因型侧同样异质。1072 套 GWAS 来自多个汇总库,样本量从几千到几十万不等,表型定义各不相同,人群构成以欧洲为主。资源做了质量过滤:删掉缺样本量或人群信息的、删掉缺标准变异编号或效应值的、把性状名归并到 MeSH、只保留疾病类性状。这套过滤保住了可用性,但保不住一致性。
| 质控环节 | 做了什么 | 没做什么 | 后果 |
|---|---|---|---|
| 单细胞侧统一符号 | 基因符号映射 | 未做批次整合 | 跨数据集不可比 |
| 单细胞侧分解 | 逐数据集独立分解 | 未做联合分解 | 无共同程序坐标系 |
| 遗传侧筛选 | 删缺样本量或人群的 | 未按人群分层 | 欧洲人群占绝对多数 |
| 遗传侧筛选 | 删缺标准编号的 | 未统一效应值方向 | 需下游自行对齐 |
| 性状归并 | 归入 MeSH 主题词 | 未区分人群与研究设计 | 同编号下研究差异大 |
| 显著性判定 | 给 P 值与分数 | 未提供多重校正列 | 需自行校正 |
4.2 富集分数的构造成本
富集分数的定义是与全基因基线之差。这个减法有两个直接后果。第一,分数可以为负,负值意味着该程序覆盖的基因组区间比全部蛋白编码基因的解释力还低,这类行一般没有解释价值,但会出现在表里。第二,分数的绝对值依赖于基线的选取,「与全部蛋白编码基因比」和「与随机基因集比」得到的数不可直接换算。
标准差那一列对应的是估计精度。它来自 LD 分数回归的系数估计,反映的是该程序注释在回归里的稳定性。一个高分高标准差的行,和一个中分低标准差的行,前者更可能是偶然。资源没有提供把两者合成单一可信度指标的列,这个合成必须由使用者自己做,且要写清楚用的是什么规则。
4.3 细胞类型的标注链路
主表的细胞类型列来自两处:一处是各数据集自己的注释(富集细胞类型),一处是 2025 年 9 月新增的本体标准化列。标准化用的是细胞本体映射器,把各数据集五花八门的标签映射到统一的本体编号,同时保留原始标签。
这条链路的价值在于让「按细胞类型聚合」成为可能。它的局限在于覆盖:标准化列的空值比例不小,空的那些行多半是因为原始标签过于宽泛或过于独特,映射器给不出确定的对应。做聚合时必须把空值单独列出来,而不是简单丢弃——丢弃会让某些细胞类型在统计里凭空消失。
4.4 案例:从一条 8.41 分的关联走到一次撤回
下面这个案例用来演示完整的判断链路。它不指向任何具体实验室,行号与分数取自公开下载表,情境是常见的项目处境。
某药物靶点团队在做一套消化道疾病的靶点筛选,先按富集分数从主表里捞出了头部行,其中一条是 §2.3 解剖过的那行:脑组织一套单细胞数据里的 1 号程序,对一套消化道疾病 GWAS 的富集分数 8.41,富集 P 值约千分之一,标准差 2.73。团队的第一反应是「脑与消化道之间存在共同的核质转运异常」,准备把这条写进立项材料,作为「神经-消化道轴」的旁证。
第一次核对就出了问题。这一行的细胞类型列为空,标准化细胞类型列也为空。也就是说,这条关联在最关键的一列上没有信息。团队想退回程序层面看基因,于是去基因关系表里查该程序的前若干基因,发现其中相当一部分是核孔复合体与 importin 家族的成员——典型的管家基因。一个由管家基因主导的程序在多种疾病上同时富集,是与 §3.4 描述的共享程序行为一致的。
第二次核对查了同一疾病编号下的全部行。这个编号下有三套 GWAS,另外两套在这个程序上的分数分别是七点几和六点几,P 值都过不了阈值。三套里只有一套显著,且这一套的样本量最大。团队于是把这条从「主证据」降级为「待验证线索」,并在立项材料里补了一句关于程序细胞类型为空、且该程序以管家基因为主的说明。
第三次核对是外部验证。团队用另一套独立的人群汇总统计,对同一疾病做了同样的富集检验,程序层面的方向一致但强度减半。合并三次核对,正确的结论是:这个程序与该疾病共享部分遗传结构,但共享的基础更可能是管家过程,而不是某一类特定细胞的功能异常。案例最初的表述在方向没错,但在归因上错了一层。
这个案例的教训可以压缩成三条:细胞类型列为空不是小问题,它直接决定了这条关联能不能被指认;同一疾病多套 GWAS 必须一起看,单看一套等于让样本量最大的一套代替全部证据;程序层面的富集方向可以稳,强度不稳,报方向不报强度是更安全的写法。§3.5 提到的两条证据线分工,在这个案例里也正是缺的那一环——如果团队先做位点到细胞类型的归因,就不会在一开始把一条无细胞类型信息的关联当成细胞证据。
| 核对轮次 | 查了什么 | 发现了什么 | 结论变化 |
|---|---|---|---|
| 首轮 | 主表头部行 | 分数高,P 值小 | 视为强旁证 |
| 二轮 | 细胞类型列 | 两列均为空 | 无法指认细胞 |
| 二轮 | 程序基因构成 | 以管家基因为主 | 疑为共享程序 |
| 三轮 | 同编号其他 GWAS | 另两套不显著 | 单套主导,证据弱化 |
| 四轮 | 独立队列复核 | 方向一致强度减半 | 可报方向不可报强度 |
| 收尾 | 综合判断 | 共享遗传结构成立,细胞归因不成立 | 降级为待验证线索 |
§4.4 的案例还揭示了一个资源本身的结构特征:显著结果表里,最富集细胞类型为空的行占比接近百分之七,标准化列为空的比例更高。这两个比例不是数据质量问题,而是设计使然——程序不一定对应单一细胞类型,映射器也不一定能给出确定答案。把它们当作缺失值去插补,是最危险的处理方式。
§5 核心层 C:怎么取数
5.1 站点结构与四个入口
站点是一个单页应用,六个导航项:单细胞、GWAS、基因、程序富集、关于、教程。四个查询入口对应四个不同的出发点:从组织或细胞类型进、从疾病进、从基因进、从自选基因集进。四者都落在同一套程序页面上,最后的详情表结构一致。
5.2 一个必须先跨过的坎
下载页给出的链接是 http 协议,服务器会 301 跳到 https。而 discpatlas.net 这个裸域名的证书链在部分客户端上校验不通过,curl 会直接报证书错误并返回空文件。这不是文件损坏,是握手失败被写进了文件。识别方法很简单:文件大小远小于官方标称值,打开是 HTML 或空。
跨过这个坎有两条路:用 curl 的 -L 跟随跳转并加 -k 跳过校验;或者把域名换成带 www 前缀的那个,站点在 https 与 www 两个变体上的证书配置不同。两条路都能取到文件,第一条更快,第二条更规范。
#-- 先看大小,再判断是否真的下到了文件
curl -sIL -m 30 "http://discpatlas.net/download/module_info.csv.gz" | head -5
#-- 跟随跳转并跳过证书校验,取 17K 的索引文件
curl -skL -m 60 -o module_info.csv.gz \
"http://discpatlas.net/download/module_info.csv.gz"
#-- 校验是否为真 gzip,不是就说明抓到的是跳转页
gzip -t module_info.csv.gz && zcat module_info.csv.gz | head -3
5.3 批量取回六个文件
六个文件合计约七十七兆,普通网络环境下一次拉完即可。下面这段按文件清单循环下载,每个文件下完立刻校验类型,避免把跳转页存成数据文件。
#-- 逐个下载并校验 gzip 魔数,坏文件当场重下
import gzip, pathlib, subprocess
base = "http://discpatlas.net/download/"
files = [
"module_info.csv.gz",
"association_results.csv.gz",
"gene_module_relationship.csv.gz",
"gene_combined_final.csv.gz",
"enrichment_results.csv.gz",
]
out = pathlib.Path("discp")
out.mkdir(exist_ok=True)
for name in files:
dest = out / name
subprocess.run(["curl", "-skL", "-m", "300", "-o", str(dest), base + name],
check=True)
with open(dest, "rb") as fh:
magic = fh.read(2)
if magic != b"\x1f\x8b":
dest.unlink()
print("not gzip, retry with www host:", name)
subprocess.run(["curl", "-sL", "-m", "300", "-o", str(dest),
"https://www.discpatlas.net/download/" + name], check=True)
print(name, dest.stat().st_size)
全量主表是六十兆那个,其余都在十兆以下。如果只做候选生成,跳过全量表可以省掉大部分下载时间——显著子集已经覆盖了站点浏览时能看到的所有行。
5.4 读表:注意分隔符不统一
两张表用逗号带引号,两张用制表符不带引号。用 pandas 一次读完整个目录会出错,需要按文件指定分隔符。下面的读法把四个主要文件一次读进来,并把程序表与主表按程序编号加数据集对齐。
#-- 按文件分别指定分隔符,读入后立刻检查行数与空值
import pandas as pd
p_meta = pd.read_csv("discp/module_info.csv.gz")
p_assoc = pd.read_csv("discp/association_results.csv.gz", sep="\t")
p_gene = pd.read_csv("discp/gene_module_relationship.csv.gz", sep="\t")
p_enr = pd.read_csv("discp/enrichment_results.csv.gz")
print(p_meta.shape, p_assoc.shape, p_gene.shape, p_enr.shape)
print("cell type blank rows:", p_assoc["Enriched Cell Type"].eq("NA").sum())
print("standardized blank rows:", p_assoc["Standardized Cell Type"].eq("NA").sum())
merged = p_assoc.merge(
p_meta[["Module", "Cell Type Specificity", "single_cell"]],
left_on=["Module", "Single Cell"], right_on=["Module", "single_cell"],
how="left")
print("unmatched modules:", merged["Cell Type Specificity"].isna().sum())
最后那行打印值得关心。如果匹配不上的行很多,说明两张表的数据集命名不完全一致,需要用前缀或外部对照表做二次对齐。这个检查在每次换版本后都要重跑。
5.5 从疾病进:把多套 GWAS 合并成一个判断
单看一套 GWAS 会把样本量最大的那套当成全部证据。下面这段按疾病编号聚合,统计每个程序在几套 GWAS 上显著,以及分数的分布。多套都显著的程序,比单套高分的程序更值得往下追。
#-- 按疾病聚合,统计每个程序在几套 GWAS 上独立显著
import pandas as pd
p = pd.read_csv("discp/association_results.csv.gz", sep="\t")
p["PassP"] = p["Enrichment Pvalue"] < 0.05
g = (p.groupby(["DisCP_ID", "Module"])
.agg(n_gwas=("Trait", "nunique"),
n_pass=("PassP", "sum"),
med_escore=("Escore", "median"),
n_celltype=("Enriched Cell Type",
lambda s: (s != "NA").sum()))
.reset_index())
g["recurrence"] = g["n_pass"] / g["n_gwas"]
target = "DisCP0266"
top = (g[g["DisCP_ID"] == target]
.sort_values(["n_pass", "med_escore"], ascending=False)
.head(15))
print(top.to_string(index=False))
注意最后的排序键用了两个字段。只用分数排序,会把分数高但只在单套里出现的程序排到前面;只在多套里出现的程序,重复性更好。两者取交集的头部行,才是优先级最高的候选。
5.6 在线富集工具与它的返回字段
站点提供一个上传基因集的富集工具,接受一行一个基因的纯文本列表。返回字段包括程序名、所属单细胞数据集、程序编号、观测分数、P 值、命中基因、富集细胞类型与富集通路。返回结果可以下载,格式与本地分析的结果相近。
上传前有两件事要做:确认基因符号用的是当前版本(老符号在映射时会丢失);剔除列表里的一批管家基因,否则结果会被管家程序占满。第二条不是资源的要求,是从 §3.4 描述的性质推出来的经验做法。
#-- 整理上传列表:一行一基因,去重,剔除明显废弃的老符号
sort -u /path/to/gene_list.txt \
| grep -vE "^(HIST|MIR|LOC)[0-9]" \
> genes_ready.txt
wc -l genes_ready.txt
工具的处理时间是秒级到分钟级,取决于列表长度。结果页只展示前十,全部结果需点下载。
5.7 复现富集的路线核查
想做复现的人,通常卡在从基因贡献分数回到回归系数的这一步。资源没有提供中间产物:没有提供每套 GWAS 的 LD 分数注释文件,没有提供回归的系数表,也没有提供 SNP 注释的中间文件。可复现的部分到基因权重为止,之后的复现需要按论文方法部分自行重建,并且需要自己准备与参考面板匹配的 LD 信息。
这一点在立项时就要写进风险清单。如果项目要求全链路可复现,这个资源只能作为结果对照,不能作为管道模板。如果项目只要求结果可核查,检查程序的前若干驱动基因是否合理,就已经能过滤掉大部分误读。
| 可复现层级 | 资源是否提供 | 若不提供,需要什么 |
|---|---|---|
| 基因权重矩阵 | 提供 | 无 |
| 前 5% 基因集 | 可自行截断得到 | 归一化规则已说明 |
| 细胞活动矩阵 | 未提供 | 需回原始数据集重新分解 |
| SNP 注释 | 未提供 | 需 Roadmap-ABC 资源与基因组版本对齐 |
| LD 分数 | 未提供 | 需 1000 Genomes 参考面板与对应工具 |
| 回归系数 | 未提供 | 需自建回归流程 |
| 富集分数 | 提供 | 无 |
§6 与库内词条的关系
6.1 关系图谱
这张图谱在库内处于一个交汇位置:上游是单细胞资源,下游是遗传资源。它本身不生产数据,生产的是两者之间的连接。理解它的定位,最省事的办法是看它分别从谁那里取数、又给谁提供输入。
| 库内词条 | 关系 | 具体连接点 | 互补还是替代 |
|---|---|---|---|
| 人类细胞图谱 | 上游 | 单细胞表达与细胞类型注释 | 互补,本文不含细胞级元数据 |
| 单细胞表达图谱 | 上游 | 组织与疾病条件下的细胞表达 | 互补 |
| GWAS Catalog | 上游 | 位点与研究登记,部分汇总统计经此流转 | 互补 |
| GTEx | 平行 | 组织级表达与表达性状位点,粒度是组织 | 互补,粒度不同 |
| DEP-EAS-GWAS | 平行 | 东亚队列的疾病汇总统计,可作外部复核 | 互补,可补人群缺口 |
| CELLxGENE 普查 | 上游 | 可批量取的细胞级表达 | 互补,但样本口径不同 |
最有价值的一对关系是与东亚队列资源的搭配。本文的遗传侧以欧洲队列为主,而东亚队列汇总统计恰好可以作为外部复核来源:用同一程序在东亚队列上重跑同一检验,如果方向一致,结论的稳健性就上一个台阶;如果方向相反或消失,说明原先的富集可能由人群特异的 LD 结构造成。
6.2 检索路径
按问题类型的不同,检索终点也不同。下面四条路径覆盖了绝大多数使用场景。
| 你想查的 | 从哪个入口 | 站点页面 | 下载表 | 输出 |
|---|---|---|---|---|
| 某疾病涉及哪些程序 | 疾病 | GWAS 页 | 显著子集按疾病过滤 | 程序清单与分数 |
| 某组织有哪些程序 | 组织 | 单细胞页 | 程序表按组织过滤 | 程序清单与类型 |
| 某基因属于哪些程序 | 基因 | 基因页 | 基因关系表按符号过滤 | 程序、分数、通路 |
| 一批基因落在哪 | 基因集 | 富集工具 | 无对应表 | 显著程序与命中基因 |
站点不提供程序编号到通路的反向索引,也不提供通路到程序的清单。想按通路找程序,只能靠程序名里的冒号后缀做字符串匹配,或者在富集表里按通路库编号反查。这一限制让「按生物学过程检索」变得笨拙,是做文献综述时会遇到的第一个摩擦点。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
在给这份资源打分之前,要先校正一个默认假设。多数评估框架默认一个数据集的质量等于它数据的质量,于是把注意力放在缺失率、覆盖度、标注一致性上。对 DisCP-Atlas,这个默认会带来系统性误判:它的数据本身几乎没有质量问题,因为它的数据就是从别处取的公开数据;它的质量全部压在那两步推断上——分解得好不好、富集算得对不对。 用数据集的尺子量它,会量出一份漂亮的分数,而这个分数对使用者的决策没有帮助。
正确的尺子是推断链的尺子。要问的是:分解的粒度是否合理,程序是否可解释,富集的统计假设是否成立,结论在换一批输入后是否稳健。用这把尺子量,分数会低一些,但得到的判断更贴近实际使用。下文五维评分按这把尺子给。
7.1 五维评分
评分采用库内统一的 DAIMS 框架,五个维度各占二十分。打分依据是官方页面、论文摘要与公开下载表的交叉核对,不含任何需要下载全量包才能得到的统计。
| 维度 | 得分 | 依据 | 扣分点 |
|---|---|---|---|
| 可发现性 | 17 | 论文收录数据库专辑,站点导航完整,六个文件直链可用 | 新手从域名看不出资源主题,需读关于页 |
| 可访问性 | 15 | 全部开放下载,无登录,无地域限制 | 裸域名证书异常,官方链接走 http 需手动跳转 |
| 互操作性 | 14 | 编号体系自洽,细胞类型做了本体标准化 | 无统一标识符到外部本体的映射,程序编号不跨库 |
| 可复用性 | 16 | 六文件覆盖从程序到关联到通路全链,可支撑多类分析 | 无版本字段,中间产物缺失,管道不可复现 |
| 可信度 | 13 | 方法公开,统计框架成熟,显著性有独立判定 | 口径多处不一致,LD 面板单一,细胞类型列空值多 |
合计七十五分,属于「结构完整、关键环节需自行把关」一档。扣分最重的是可信度,理由集中在口径不一致与单一人群面板这两项上,都属于设计层面而非执行层面的问题。
7.2 五处需要自行把关的地方
第一处是三条规模口径并存。全量检验、去重后对数、显著关联数三者的关系官方未说明,引用时必须写明用的是哪一个,并注明出处。
第二处是组织数与数据集数的差额。站点写 57 套与 37 个组织,论文写 35 个组织,显著表实际出现 50 个数据集名。差额构成未说明,做覆盖面统计时以表内实际出现的为准,并注明与官方口径的差。
第三处是细胞类型列的空值。富集细胞类型与标准化细胞类型两列都允许为空,前者空值比例接近百分之七,后者更高。做细胞类型聚合必须先处理空值,不能直接丢弃。
第四处是显著性阈值。浏览阈值在 2025 年 9 月被放宽到 P 小于 0.10,而论文摘要的显著数按更严格的阈值统计。下载的显著子集用的是哪个阈值,文件内没有标记。
第五处是分隔符与编码。两类分隔符混用,部分文件带引号部分不带,直接合并会静默错列。
7.3 已知的、可枚举的偏差
| 偏差 | 来源 | 表现 | 缓解办法 |
|---|---|---|---|
| 人群偏差 | LD 面板固定为欧洲 | 非欧洲队列分数系统偏移 | 用人群匹配队列复核 |
| 组织偏差 | 单细胞数据集中于少数组织 | 脑、血、肝、心占比高 | 按组织分层报告 |
| 细胞类型定义偏差 | 各来源注释自定 | 同类型多名称,标准化列不全 | 用标准化列并单列空值 |
| 研究数量偏差 | 同病多套 GWAS 各自成行 | 热门病行数虚高 | 按疾病去重后比较 |
| 程序不稳定偏差 | K 由启发式选定 | 换数据后编号整体错位 | 不跨数据集比编号 |
| 管家基因偏差 | 共享程序落在管家基因集 | 一条程序挂几十种病 | 先看基因构成再看通路名 |
六条偏差里有五条来自输入,一条来自算法。来自输入的偏差无法靠资源自身修正,只能在使用侧通过分层、复核、去重来缓解。来自算法的那条,缓解办法是不把编号当标识符。
7.4 外部验证矩阵
资源本身没有提供外部验证,下面这张矩阵是使用侧应该自己搭的。四类验证按成本从低到高排列,每类都能独立提供一部分信心。
| 验证类型 | 做法 | 能排除什么 | 不能排除什么 | 成本 |
|---|---|---|---|---|
| 基因构成核查 | 看程序前若干驱动基因是否合理 | 明显错配的程序 | 方向错误但基因合理的行 | 低 |
| 多套 GWAS 一致性 | 同病多套结果的符号与强度 | 单套偶然 | 共同的人群偏差 | 低 |
| 独立队列复核 | 换人群的汇总统计重跑 | 人群特异的 LD 效应 | 方法层面的共同假设 | 中 |
| 位点到细胞归因 | 用细胞类型注释独立做富集 | 程序层面的假阳性 | 因果方向 | 中 |
§4.4 的案例里,前三类验证都用到了,第四类恰恰是缺失的那一环。四类全做的成本大约是一个分析员两到三周,低于把一个错误结论写进立项材料的代价。
7.5 它为何能持续:靠的是把两堆别人已经建好的数据拼成一张别人还没做的表
单细胞图谱和 GWAS 汇总统计都在快速增长,两者每年新增的行都不少,但两者之间的连接表一直稀缺。做这种连接需要两边的专业能力,也需要承担口径不一致的风险,学术激励不高。DisCP-Atlas 的生存逻辑就在这里:它不生产数据,生产连接;连接一旦被大量引用,就成了这个细分方向的事实参考。维护成本低,因为上游更新可以直接重跑;被替代的风险也真实存在,因为一旦有资源用更大规模、更多人群、更细粒度的方式重建同样的连接,这张表的相对价值会下降。
§8 生态位与历史
8.1 历史沿革
这张图谱的方法基础来自 2021 年前后提出的连接框架,核心思路是把单细胞分解出的基因程序当作基因组注释,用分层 LD 分数回归去估计其对疾病遗传力的贡献。这条思路在之后的几年里被多篇论文使用,但一直没有形成统一的、可下载的结果集。DisCP-Atlas 的贡献是把这条思路规模化:一次跑完上千套 GWAS,把结果整理成可查询的表。
时间线上,2025 年是关键年。论文在核酸研究数据库专辑发表,站点上线并在同年 9 月连做数次更新:9 月 19 日改进表格分页与排序,9 月 21 日放宽浏览阈值,9 月 24 日发布 1.2 版并引入细胞本体标准化列,9 月 25 日新增外部基因资源链接并把站点从 http 升级到 https。这一串更新说明站点处于活跃维护状态,但也说明结果的版本会变。
8.2 生态位:连接层,不是数据层
在资源生态里,数据层提供原始观测,注释层提供标签,连接层提供关系。DisCP-Atlas 明确属于连接层。它的价值与连接的质量成正比,与底层数据的规模成正比,但与其自身的独特性成反比——如果这类连接变得常见,它的相对位置会下降。
这个定位决定了它的引用方式:引用它的时候,实际上是在引用两种东西,一是连接方法,二是某一时刻的连接结果。前者稳定,后者会变。严谨的写法要同时注明方法与获取时间。
8.3 三类可比资源
第一类是细胞类型级别的关联资源,粒度更细但定义更碎;第二类是组织级别的表达与调控资源,粒度更粗但更稳定;第三类是变异注释资源,提供位点到基因的映射但不涉及疾病。三类资源各自解决一段,DisCP-Atlas 补的是中间那段。选哪个,取决于你要的粒度落在一对一还是一对多上。
8.4 它的位置由谁决定
最终决定它位置的,不是建设方,而是使用者。多数引用若集中在候选生成上,它就被当成筛选工具;若有足够研究拿它做机制框架的起点并做足验证,它才成为解释资源。目前偏向前者,字段设计也印证了这一点:主表只有分数与 P 值,没有解释性字段。
§9 使用指引
9.1 三种角色的路径
临床遗传方向的使用者通常从具体疾病出发,要的是候选框架。路径是按疾病编号取出该病所有行,按多套 GWAS 的一致性排序,再回基因关系表看头部程序的驱动基因,全程不碰全量表。
计算生物学方向的使用者,通常从方法出发,关心的是程序是否可解释、能否复用。路径是先取程序表与基因关系表,做程序层面的基因集富集,再与自己手上的方法对比。这类使用者最容易踩的坑是把程序编号当稳定标识,需要提前提醒。
数据工程方向的使用者,关心的是能否接入流水线。路径是先做 schema 核查,记录分隔符与空值写法,再设计版本追踪。本文没有版本字段这件事,需要工程侧自己补一个获取时间的记录。
| 角色 | 起点 | 主要用到的文件 | 最该注意的坑 | 预计工作量 |
|---|---|---|---|---|
| 临床遗传 | 疾病编号 | 显著子集、基因关系表 | 多套 GWAS 合并 | 半天 |
| 计算生物 | 程序表 | 程序表、基因关系表、富集表 | 编号不可跨库 | 两到三天 |
| 数据工程 | schema | 全部六个 | 分隔符与版本 | 一天 |
9.2 一条最短的可用流程
从零到一条经过初步验证的候选,最短路径大约十行代码。下面这段把取数、合并、比较三步串起来,最后输出一个按重复性排序的短名单。
#-- 最短链路:读表、合并、按多套 GWAS 的重复性排序,输出短名单
import pandas as pd
assoc = pd.read_csv("discp/association_results.csv.gz", sep="\t")
meta = pd.read_csv("discp/module_info.csv.gz")
assoc["pass"] = assoc["Enrichment Pvalue"] < 0.05
short = (assoc.groupby(["DisCP_ID", "Module"])
.agg(gwas=("Trait", "nunique"),
passed=("pass", "sum"),
escore=("Escore", "median"))
.reset_index())
short["rate"] = short["passed"] / short["gwas"]
short = short.merge(meta[["Module", "Enriched Pathway",
"Cell Type Specificity"]], on="Module", how="left")
short = short[short["gwas"] >= 2].sort_values(["rate", "escore"],
ascending=False)
print(short.head(20).to_string(index=False))
输出之后,人工要做的是两件事:看头部行的驱动基因是否以管家基因为主;看这些行在独立队列里是否方向一致。两步都不做就把结果写进报告,是这套流程最容易的失手点。
9.3 引用方式
引用这份资源需要同时给三样东西:论文、站点、获取时间。论文给出方法与规模,站点给出具体结果,获取时间给出结果的版本。三者缺一,任何人都无法复现你看到的那张表。
推荐写法:Wang FQ, Zhang C, Zhang H, Dang X, Sun Y, Bu S, Wang X, Yang W, Cao C. DisCP-Atlas: a comprehensive resource mapping cellular processes to complex diseases. Nucleic Acids Research, 2026, 54(D1): D1376-D1386. doi:10.1093/nar/gkaf1129. 数据取自 https://www.discpatlas.net/ ,获取于某年某月某日。
如果只引用下载文件,要写明文件名与该文件的获取日期,并注明站点未提供版本号。这一点在方法部分会被审稿人追问。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| 内容来源 | 官方站点的关于页、教程页、下载页,论文摘要,与公开下载文件的表头核对 |
| 未做的事 | 未下载六十兆全量主表,未做逐条统计,未对程序质量做独立评估 |
| 数字口径 | 规模与结构类数字取自官方页面与下载表,边界类判断来自方法说明 |
| 未核实项 | 站点是否单列数据集许可、全量主表的分隔符与字段、709 与 759 之外的口径差 |
| 案例说明 | §4.4 的案例是基于公开数据的合成情境,不指向任何具体项目或研究者 |
| 评分说明 | 五维评分是编辑侧判断,依据在 7.1 逐项写出,不构成质量认证 |
| 更新责任 | 资源无版本号,站点更新后本文的规模数字可能过时 |
| 使用建议 | 把本文当作入门与避坑参考,具体结论以你自己对下载表的核对为准 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 这是一个细胞类型数据库 | 主对象是基因共表达程序,细胞类型只是标签之一 | 程序定义写在关于页,编号在同一数据集内稳定 |
| 每一个关联都能指认细胞类型 | 富集细胞类型与标准化细胞类型都允许为空 | 下载表两列均有字面 NA |
| 富集分数高就是强证据 | 分数与 P 值不同向,头部含不显著的行 | 下载表可见高分高 P 值的行 |
| 990 个程序对应 990 种细胞状态 | 990 是各数据集程序数之和,由 K 的选择规则决定 | 关于页说明 K 由启发式规则选定 |
| 程序编号可以跨组织比较 | 每个数据集独立分解,无共同坐标系 | 程序表按数据集分组 |
| 疾病越多说明覆盖越好 | 行数由研究数量决定,热门病研究多 | 同病多套 GWAS 各自成行 |
| 这是一份可以复现的管道 | 只提供结果,中间产物全部缺失 | 下载页仅列六个结果文件 |
| 亚洲队列可以直接套用 | LD 面板固定为欧洲人群 | 关于页写明参考面板来源 |
| 下载链接打不开说明站点挂了 | 是证书校验失败,文件被写成跳转页 | 返回文件为几百字节的 HTML |
FAQ
Q1:DisCP-Atlas 和「把位点挂到细胞类型」的资源有什么区别?
后者以细胞类型为单位,直接回答某个位点对应哪种细胞;前者以程序为单位,回答某套基因程序能否解释疾病遗传力。前者粒度更粗但绕开了细胞类型定义不统一的问题,后者更直接但对注释依赖更强。两者最好并用。
Q2:990 个程序够不够用?
取决于你要覆盖多少组织。57 套数据覆盖三十余个组织,平均每套二十个程序,对单套数据来说是够的;但样本被研究得少的组织覆盖很薄,那些组织的结论基本没有。
Q3:为什么同一疾病有十几套 GWAS?
资源把每个可用的疾病汇总统计都纳入了,同一疾病不同研究会用不同表型定义与不同队列。多套并存的好处是可以做一致性检验,坏处是直接按行数比较会放大热门病的权重。
Q4:E-score 为负的行还有用吗?
多数情况没用。负值意味着该程序覆盖的区间比全部蛋白编码基因基线解释力更低。少数情况下负值本身有信息,比如提示该程序对应的基因在遗传力模型里被系统性低估,但这属于方法研究而非应用。
Q5:在线富集工具处理多长的基因列表合适?
几百到几千个基因比较合适。太少时显著程序不稳定,太多时几乎每个程序都会显著。上传前剔除管家基因,能显著改善结果的可解释性。
Q6:能把主表当作机器学习的标签吗?
技术上可以,实际上不建议直接用。标签由阈值切出,正负样本高度不平衡,且同一程序在多套 GWAS 上的标签高度相关,直接训练容易过拟合到研究层面。
Q7:站点更新后我怎么知道自己用的是哪一版?
只能靠文件大小、修改时间与行数。站点没有版本字段。建议在项目里自建一份清单,记录每个文件的获取日期与校验和。
Q8:为什么下载链接是 http?
站点在 2025 年 9 月才从 http 升级到 https,下载页的链接没有同步改完。http 链接会 301 跳到 https,但裸域名证书在部分客户端上校验失败。
Q9:这个资源可以商用吗?
论文与站点以 CC BY-NC-ND 4.0 声明,该许可禁止商业使用与演绎。底层数据各自沿用来源许可,部分来源允许商用、部分不允许。商用前需要逐层核查,不能只看站点声明。
Q10:我想重跑分解,需要什么?
需要底层各数据集的表达矩阵与细胞注释,还要自备分解与归一化流程。资源不提供细胞活动矩阵,也不提供每套数据的具体 K 值清单,重跑得到的结果无法与原表逐条对照。
Q11:它的结果能直接放进论文的讨论部分吗?
可以放进讨论,但表述要限定在「共享遗传结构」而非「细胞功能异常」。放进结果部分需要有独立的验证,通常是独立队列复核或位点到细胞类型的归因。
Q12:和 GTEx 比,该用哪个?
GTEx 给组织层面的调控信息,适合问「这个变异在肝里影响这个基因的表达吗」;DisCP-Atlas 给程序层面的遗传力富集,适合问「这组基因更像哪套疾病遗传结构」。问题粒度决定选择,不是优劣问题。
术语表
| 术语 | 中文 | 含义 |
|---|---|---|
| cNMF | 共识非负矩阵分解 | 多次分解取共识,把表达矩阵拆成基因权重与细胞活动两个矩阵 |
| Cellular process | 细胞程序 | 分解得到的基因共表达模块,编号在数据集内稳定 |
| Module | 模块 | 程序的同义叫法,下载表中的 Module 列 |
| sc-linker | 单细胞连接框架 | 把程序基因集转成基因组注释再做遗传力富集的一套流程 |
| S-LDSC | 分层 LD 分数回归 | 估计某基因组注释能解释多少遗传力的回归方法 |
| E-score | 富集分数 | 程序注释与全蛋白编码基因基线的遗传力解释之差 |
| Enrichment P value | 富集 P 值 | 富集检验的显著性,与分数不同向 |
| LD panel | LD 参考面板 | 计算连锁不平衡的参考人群,本文固定为欧洲人群 |
| Roadmap-ABC | 增强子-基因连接 | 用染色质状态与三维接触推断调控靶基因的策略 |
| MeSH | 医学主题词表 | 疾病与性状的标准化主题词体系 |
| Cell Ontology | 细胞本体 | 细胞类型的标准化词表,用于标签映射 |
| K value | 程序数 | 每套数据保留的程序个数,由启发式规则选定 |
| Shared program | 共享程序 | 在多种细胞类型中活动相近的程序,常由管家基因主导 |
| Cell type specific | 细胞类型特异 | 在一类或多类细胞中显著高活跃的程序 |
| Enrichment SD | 富集标准差 | 富集估计的精度,用于判断分数是否稳定 |
| Trait | 性状 | 原始 GWAS 报告的研究表型名 |
| DisCP ID | 疾病编号 | 资源自建的疾病标识,用于跨研究合并 |
| UMAP | 降维可视化 | 站点用于展示细胞与程序活动分布的二维投影 |
| GeneRatio | 基因比例 | 通路富集表里命中基因数与背景数之比 |
| p.adjust | 校正 P 值 | 多重检验校正后的 P 值 |
| 管家基因 | Housekeeping gene | 各类细胞都表达的基因,其程序易在多病上显著 |
| 引物 5% 截断 | 前 5% 基因 | 程序基因按贡献分数取头部作为注释输入 |
| 位点到细胞归因 | Variant-to-cell | 把遗传位点归到某一细胞类型的分析路线 |
| 独立队列复核 | Replication | 换一批人群数据重跑同一检验以检验稳健性 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 程序总数 | 990 | 关于页、论文摘要 | 官方页面 |
| 单细胞数据集数 | 57 | 关于页、论文摘要 | 官方页面 |
| 数据集数(表内) | 50 | 显著子集数据集名列去重 | 下载表 |
| 组织数(站点) | 37 | 关于页 | 官方页面 |
| 组织数(论文) | 35 | 论文摘要 | 论文摘要 |
| GWAS 套数 | 1072 | 关于页、论文摘要 | 官方页面 |
| 疾病数 | 759 | 关于页、论文摘要 | 官方页面 |
| 疾病大类数 | 21 | 关于页 | 官方页面 |
| 全量检验数 | 约一百零六万 | 首页 | 官方页面 |
| 另一口径 | 约七十五万 | 关于页下半 | 官方页面 |
| 显著关联数 | 三万七千余条 | 论文摘要 | 论文摘要 |
| 显著子集行数 | 七万余行 | 下载文件 | 下载表 |
| 富集细胞类型空值行 | 296 | 下载文件 | 下载表 |
| 标准化列空值行 | 有相当比例 | 下载文件 | 下载表 |
| 文件总数 | 6 | 下载页 | 官方页面 |
| 合计体积 | 约七十七兆 | 下载页标称值相加 | 官方页面 |
| 许可 | CC BY-NC-ND 4.0 | 机构库记录 | 论文摘要 |
| 前 5% 截断 | 是 | 关于页 | 官方页面 |
| LD 面板 | 欧洲人群 | 关于页 | 官方页面 |
附录 B:数字的来源分层
第一级,官方页面。 程序数、数据集数、组织数、GWAS 套数、疾病数、检验总数、截断阈值、参考面板来源、文件清单与体积,全部来自关于页与下载页。这些数字作者自己声明,本文照抄,不改写。
第二级,论文摘要。 显著关联数、组织数的论文口径、方法名称(sc-linker、S-LDSC)与期刊卷期页,来自核酸研究的摘要与出版信息。摘要与页面的数字不一致时,本文并列写出,不判断谁对。
第三级,下载表核对。 显著子集的行数、数据集名的去重数、细胞类型空值的行数,来自对一到十兆量级文件的表头与计数核对。这一级只核对表头与规模,不做分布统计。
未核实项。 全量主表的分隔符与字段构成(六十兆,未下载);站点是否单列数据集级许可(下载页无许可声明);两处检验总数口径差的构成;标准化列空值的精确比例(只确认比例不小,未计入精确值)。
附录 C:完整参考文献
- Wang FQ, Zhang C, Zhang H, Dang X, Sun Y, Bu S, Wang X, Yang W, Cao C. DisCP-Atlas: a comprehensive resource mapping cellular processes to complex diseases. Nucleic Acids Research. 2026;54(D1):D1376-D1386. doi:10.1093/nar/gkaf1129
- DisCP-Atlas 官方站点:https://www.discpatlas.net/
- 关于页:https://www.discpatlas.net/#/about
- 教程页:https://www.discpatlas.net/#/tutorial
- 下载页:https://www.discpatlas.net/#/download
- 机构库记录(含许可声明):https://hub.hku.hk/handle/10722/372501
- PubMed 记录:PMID 41182817
- Europe PMC 全文入口:https://europepmc.org/
- 1000 Genomes Project Consortium. A global reference for human genetic variation. Nature. 2015;526:68-74.
- Finucane HK, et al. Partitioning heritability by functional annotation using genome-wide association summary statistics. Nature Genetics. 2015;47:1228-1235.
- Roadmap Epigenomics Consortium. Integrative analysis of 111 reference human epigenomes. Nature. 2015;518:317-330.
- The Tabula Sapiens Consortium. The Tabula Sapiens: a multiple-organ, single-cell transcriptomic atlas of humans. Science. 2022;376:eabl4896.
附录 D:程序页的字段对照代码
下面这段把站点的程序页与下载表对应起来,便于把网页上看到的字段在本地复现。
#-- 把网页程序页显示的字段与本地下载表的列逐一对应
import pandas as pd
meta = pd.read_csv("discp/module_info.csv.gz")
enr = pd.read_csv("discp/enrichment_results.csv.gz")
assoc = pd.read_csv("discp/association_results.csv.gz", sep="\t")
web_to_local = {
"Module": ("module_info", "Module"),
"Cell Type Specificity": ("module_info", "Cell Type Specificity"),
"Enriched Cell Type": ("module_info", "Enriched Cell Type"),
"Enriched Pathway": ("module_info", "Enriched Pathway"),
"Single Cell Dataset": ("module_info", "single_cell"),
}
for web, (table, col) in web_to_local.items():
print(web.ljust(22), table, col)
target = meta.loc[0, "Module"]
print(meta[meta["Module"] == target].to_string(index=False))
print(enr[enr["module"] == target].head(5).to_string(index=False))
print(assoc[assoc["Module"] == target].head(5).to_string(index=False))
跑完之后,站点页面上的每个字段都能在本地找到对应。找不到对应的字段只有两个:一个是程序页的 UMAP 投影图,它由细胞活动矩阵绘制,资源未提供该矩阵;另一个是页面内的前十条排序,它用的是浏览阈值而不是文件里的全部行。
附录 E:如果只记五件事
- 它的主对象是细胞程序,不是细胞类型;程序编号只在所属数据集内有效。
- 关联的含义是遗传力富集,不是因果,也不是细胞指认。
- 分数与 P 值必须一起看,标准差那一列不要忽略。
- 同一疾病的多套 GWAS 要合起来看,行数不等于证据强度。
- 下载链接需要跟随跳转并绕过证书校验,否则拿到的是跳转页。
编辑说明
本文的事实核对集中在 2026 年 10 月,核对对象为官方站点的关于页、教程页、下载页,核酸研究论文摘要,以及四个体积在十兆以内或数十兆的下载文件的表头与行数。六十兆的全量主表未下载,其分隔符与字段构成标注为未核实。规模数字以官方声明为准,页面与论文口径不一致处并列呈现,不作裁定。
本文中的案例为合成情境,行数据取自公开下载表,不指向任何具体项目、机构或个人。五维评分是编辑侧依据 7.1 所列扣分点给出的判断,不构成质量认证,也不代表资源建设方的意见。资源没有版本号,站点更新后文中的规模数字可能过时,引用时请注明获取日期。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- tabula-sapiens — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- single-cell-portal — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- hcl — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- single-cell-expression-atlas — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- spatial2gwas — 共享标签:基因组学与多组学 / GWAS / 转录组
- gtex-legacy — 共享标签:基因组学与多组学 / GWAS / 转录组
- gtex — 共享标签:基因组学与多组学 / GWAS / 转录组
- cellxgene-census — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- adrenal-gland-atlas — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
- expression-atlas-legacy — 共享标签:基因组学与多组学 / 单细胞基因组学 / 转录组
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

