86 个应激比较集 — ASTRA 应激转录图谱

669 个样本 / 57 个细胞系 / 四大应激类型

来源 https://astra-db.com/发布时间: 2026-10-27最后更新: 2026-10-27 阅读 15
86 个应激比较集 — ASTRA 应激转录图谱

信息速览

数据集名称86 个应激比较集 — ASTRA 应激转录图谱
数据类型多组学,人工标注,元数据
规模不适用(细胞系数据,非患者队列)
接入方式https://astra-db.com/
AI 就绪度

细胞被热到四十二度、被过氧化氢泡上几个小时、被紫外线照一遍、或者被放进百分之一的氧气里,基因组转录出来的东西会变,这是分子生物学的常识。麻烦出在“变成什么样”这一步:这件事在公共数据库里被拆成成千上万个互不相干的小实验,每个实验用自己的细胞系、自己的剂量、自己的时长,各自用一套流程算出差异基因。想回答“哪一组基因在四类应激下都动起来”,你得先把它们拉到同一张表上。

ASTRA 做的就是这张表。它把 NCBI GEO 里与四类应激相关的研究筛过一遍,只留条件说得清、有配对对照的那批,用同一条流程重算,再把结果拆成“一个应激组对一组对照”的比较集。全部内容来自 59 项研究、86 个比较集、669 个样本与 57 个细胞系,覆盖氧化应激、低氧、热休克、UV 照射四类。名字是 atlas of stress response activity 的缩写,2026 年 1 月发表在核酸研究数据库专刊,由希腊色雷斯德谟克利特大学牵头,网站免费,全量扁平表挂在 Zenodo。

这篇要回答的是它在什么场合比 GEO 本身更好用、在什么场合不如直接回 GEO,以及那些看起来能算但实际不该算的地方。一屏速览见下表。

维度 内容
中文名 应激响应活性图谱
英文名 ASTRA(atlas of stress response activity)
建库机构 希腊色雷斯德谟克利特大学分子生物学与遗传学系,联合亚里士多德大学、Alexander Fleming 研究所、MBZUAI
通讯作者 Antonis Giannakakis、Georgios A. Pavlopoulos
发表 Nucleic Acids Research 2026 年 54 卷 D1 期,D938–D948
论文 DOI 10.1093/nar/gkaf1174
官方入口 https://astra-db.com/
数据托管 Zenodo,DOI 10.5281/zenodo.15885686
规模 59 项研究、86 个比较集、669 个样本、57 个细胞系
应激类别 氧化应激、低氧、热休克、UV 照射四类,每类一个分子应激源
细胞状态分组 非疾病参照、癌细胞、类器官三组
定量口径 GRCh38 + STAR 比对 + RSEM 定量(TPM)+ edgeR 差异
技术栈 Streamlit 前端 + PostgreSQL 后端
网站许可 面向学术用户免费开放
数据包许可 CC BY 4.0
更新方式 论文称按月从 GEO 补录

§1 它要解决的具体麻烦

1.1 应激转录组的碎片化是结构性的,不是数据量不够

一个实验室想做“细胞应激的共性响应”,第一步通常是去 GEO 搜。搜出来的结果是几十项到几百项研究,每项的标题都像,每项的表格都不一样。有人给的是 TPM 矩阵,有人给的是作者自己的差异基因清单,有人只交了 counts,有人只交了 FPKM,还有人什么软表都没传,只上传了原始 FASTQ。

接下来你要做的判断,比分析本身更费时间:这个研究的对照是同一个细胞系吗?处理时长是两小时还是二十四小时?剂量是 50 微摩尔还是 500 微摩尔?这些信息散在“overall design”的一段话里,既不统一也不结构化。你把十个研究的数据拼起来做热图,热图上出现的那条“共同上调”,很可能是平台差异或者归一化差异造出来的假象。

碎片化之所以是结构性的,是因为 GEO 是一个归档库而不是一个可比较的库。它的职责是保存研究者提交的东西,不是把它们拉齐。这个定位正确而且必要,但也意味着任何想跨研究比较的需求,都必须在它之上再搭一层。这一层搭得好不好,决定了后面所有的比较是在比生物学,还是在比处理流程。

1.2 三条常见的错误期待

期待一:以为它多收了很多 GEO 里没有的数据。 它一条新数据都没有。59 项研究全部来自 GEO,669 个样本全部能在原始提交里找到。它增加的是组织方式,不是测量本身。如果你的问题是“这个细胞系在热休克下有没有做过转录组”,GEO 的检索能力比它强,因为 GEO 收全量、它只收合格子集。

期待二:以为“统一流程”等于“统一生物学条件”。 流程统一的是比对版本、定量方法与差异检验的实现。剂量、时长、细胞代数、培养基、热休克的方式(水浴还是培养箱)这些仍然来自原作者,ASTRA 没有重做实验。所以两个比较集之间的差异,既可能来自生物学,也可能来自实验操作的细节,而后者在这类数据里从不缺席。

期待三:以为它能直接回答“应激生物标志物是什么”。 它有 86 个比较集,看起来足够做一次系统性筛选。但多数比较集的样本只有两到六个,单个比较集里的差异检验效力很低;而且原文的处理时长从三十分钟到七天不等,把不同时长的结果放在一起看,看到的“共同上调”很可能只是急性期基因的短暂反应。它给的是候选清单的起点,不是结论。§4.4 的案例把这条路径走了一遍,最后停在两三个待验证的候选上,而不是一张确定的功能清单。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
找一组在四类应激下都上调的基因 86 个比较集的 logfc 与 p 值,可按基因号横向拼 够,但要先按细胞状态分层
拿到某个细胞系在热休克下的表达矩阵 TPM 矩阵与样本注释 够
拿到原始 FASTQ 自己重跑 只给 GSE 与 GSM 号 不够,需要去 ENA 取
看长链非编码 RNA 的应激响应 差异结果含 lncRNA,基因注释单独成表 够,这是它相对多数重处理资源多出来的一块
做剂量-响应的曲线 有剂量字段,但每个比较集只有一个剂量点 不够,需要自己合并多个比较集
找到某类应激的全部已发表研究 只收四类、每类一个应激源 不够,去 GEO 检索
训练一个基因-应激关系的预测模型 六万余个基因 × 86 个比较集的稀疏差异表 勉强够,样本层面太稀疏
核对某篇论文结论能否复现 流程与参数透明,可重跑 部分够,但 p 值口径与原文未必一致
比对癌细胞与非疾病细胞系的应激反应 细胞状态三分组,两侧都有样本 够,但组间样本量差很多
拿到电离辐射、亚砷酸盐、镉的数据 不在收录范围内 不够,明确排除

1.4 你的处境与它能帮到的事

1.3b 需求的四条判据

看完上面两张表,可以用四条判据快速判断你的需求该不该用它。

判据 满足时的结论 不满足时的结论
问题涉及应激 可用 不在库的范围,去 GEO 或 Expression Atlas
需要跨研究比较 可用,这是它最强的地方 单研究深入可以回原文
能接受细胞系而非组织 可用 需要人体组织,去 GTEx
结果只用于生成候选 可用 要确证性结论,需独立实验
你的处境 它能帮你什么 下一步该做什么
刚立项,要判断“细胞应激转录组”这个方向值不值得做 一屏看到四类应激各自的规模与细胞系分布,知道哪里样本多、哪里是空白 用它的数据统计页定方向,再回 GEO 补最新研究
手上有一个候选基因,想知道它在应激下是否稳定上调 按基因号查 86 个比较集里的方向与显著性 挑方向一致的少数比较集,回原文核对照设计
要做一个 lncRNA 的功能假设 基因注释表给出 lncRNA 的坐标与类型,差异表给出响应 选 3–5 个候选做实验验证,不要一次铺开
已经在跑自己的 RNA-seq 应激实验 拿它的对照分布当外部参照,看自己的效应量是否离谱 用同细胞系、同时长的比较集做对标
要做药物或毒物的应激模拟物筛选 它有应激响应基因的参考集,可以当作打分基线 自己构建打分函数,ASTRA 只提供参考指纹
需要一个能离线跑的干净小表 Zenodo 七张扁平表,最大的一张约 1.3 GB 直接下载,不经过网站
想复现某篇 2015 年的氧化应激论文 它的流程与原文不同,结论未必重合 先读 §7 的口径差异,再决定用谁的结果

1.5 一句话判断

它是一个把“散在 GEO 里的应激实验”压成“可比小表”的组织层,价值在于横向拼接的便利,不在于新增测量。你要做跨研究比较时它省事,你要做单研究深入分析时它只会挡路。

按四种典型身份各说一句。做机制研究的人,把它当候选目录;做生信分析的人,把它当可复现的参考矩阵;做实验设计的人,把它当剂量与时间的先验;做资源评估的人,把它当同类比较的标尺。四种身份都用同一个库,但用到的部分完全不同。

1.6 不适合谁:四条边界

这四条边界覆盖的是“它不是给你做的”这一类需求,而不是“它做得不好”的地方。

第一条:需要完整时空分辨的人。 它收录的是 bulk RNA-seq,一个样本对应一个时间点一个条件。想看应激过程中的转录动态,得有多个时间点,而多数比较集只给一个末端时间点。想做时间序列建模,这里的数据不够密。

第二条:需要单细胞分辨率的人。 它整库都是 bulk,没有单细胞。应激响应的异质性恰恰是单细胞层面最值得看的东西,这一层它完全没覆盖。如果你的课题是“同一群细胞里为什么只有一部分响应”,这个库从设计上就回答不了。

第三条:把 GEO 当唯一真理的人。 如果你的分析必须严格复现原作者的处理参数(比如原文用的是 HISAT2 加 StringTie,而 ASTRA 用 STAR 加 RSEM),两边数字对不上是必然的。要复现原文,就用原文的流程和原文的矩阵。这一类需求在方法学复核、审稿答辩与专利举证里都很常见,ASTRA 帮不上忙。

第四条:需要法律层面明确商用授权的人。 网站写的是面向学术用户免费开放,论文本身是 CC BY-NC 4.0,只有 Zenodo 数据包标明 CC BY 4.0。三者不完全一致,商用前需要逐项确认,不能默认整站可商用。

§2 数据构成与规格

2.1 四类应激的收录边界

ASTRA 的四类应激不是“细胞能遇到的所有应激”,而是四个在文献里边界最清楚、实验范式最成熟的类别。每类只对应一个分子应激源,这个选择是刻意的:同类里换一个应激源(比如氧化应激里换成亚砷酸盐),剂量单位、响应时间、作用机制都会变,混在一起会稀释可比性。

四类应激的收录边界靠三条规则维持:每条研究必须有明确的单一人源细胞系;每项处理必须能指派给一个分子应激源,且不能跨类别指派;每个比较集必须至少有一个未处理对照。三条规则同时成立才入库,这条筛选标准把 GEO 里数量庞大的“沾边研究”挡在外面,也是库小的直接原因。

四类的剂量区间都由论文给出:氧化应激对应过氧化氢,五十到七百微摩尔;DNA 损伤对应紫外线照射,五到六十焦耳每平方米;热休克对应升温,三十九到四十五摄氏度;低氧对应一点到三个百分比的氧气浓度。研究数依次是三十三、十七、二十、十六项,Zenodo 表里按比较集拆开的行数依次是六十七、五十二、三十九、二十七行。

这张表有两个口径要分清。研究数是论文里的“若干项 GEO 研究”,一个研究可能贡献多个比较集;数据集行数是 Zenodo 的 datasets.tsv 里按“比较集 × 处理条件”拆开的行数。四类加起来研究数是 86,行数是 185,差出来的部分是同一研究里不同剂量或不同时长被拆成了多行。

四类之间的不均衡很明显。氧化应激的研究数与行数都最多,UV 其次,低氧最少。论文自己也写明,氧化应激与低氧两块覆盖较扎实,DNA 损伤这一块还在扩充。做跨类别比较时,最弱的一环是低氧,任何“四类应激共同响应”的结论都会被这一类的样本量拖住。

2.2 字段字典与表结构

这里把 Zenodo 七张表逐张拆开。网站上的模块与这七张表是同一批数据的两种呈现,网站做的是筛选与可视化,表做的是全量导出。七张表不是七个独立数据源,而是一个数据源在四个粒度上的展开——研究、比较集、样本、基因,每一级都能从上一级切下来。

表 粒度 行数 大小 关键列 用途
datasets.tsv 比较集 × 处理条件 185 27 KB record_id, GSE_id, treatment_type 清单,选比较集
study_metadata.tsv GEO 研究 59 127 KB geo_accession, overall_design, pubmed_id 研究级说明与提交信息
sample_metadata.tsv 样本 669 1.9 MB geo_accession, characteristics_ch1, treatment_protocol_ch1 原始样本描述
harmonized_dataset.tsv 样本 669 75 KB record_id, GSM_ID, is_control 标准化后的样本级索引
gene_annotations.tsv 基因 61,424 6.8 MB gene_id, gene_symbol, biotype Ensembl 注释
differential_expression.tsv 比较集 × 基因 139 万余 88 MB record_id, gene_id, logfc, pvalue 差异结果
expression_data.tsv 样本 × 基因 272 万余 1.26 GB 样本号与各基因的 TPM 表达矩阵

datasets.tsv 是骨架,其余六张都靠它里面的 record_id、GSE_id 或 GSM 号挂钩。它自己的字段可以按用途分四组来记。

分组 字段 含义与取值 使用注意
溯源 id / PMID / GEO_id 行号、文献号、系列号 id 不是 record_id,混用会错行
设计 No_of_samples / treatment_type / stress_factor 样本数、条件全名、应激类别 treatment_type 写法极不统一
分组 Control / Treatment / No_of_controls / No_of_treated GSM 清单与两侧样本数 有 56 行对照数为 0
身份 Cell_type / Tissue / Cell_group / Genotype / Genomic_condition 细胞系、组织、状态三分组、基因型、基因型二分 拼写与大小写不一致

分组的细节值得展开。Control 与 Treatment 是两个逗号分隔的 GSM 清单,分隔符后的空格不规范,直接 split 会带出多余空格。No_of_controls 有 0 值,共 56 行,这些行没有差异结果。Cell_type 有个别条目填的是设备编号而不是细胞名。Tissue 存在拼写与大小写不一致。Cell_group 只有三个取值,字符串里带双空格。Genotype 里 141 行是 WT,其余是各类敲低、敲除与突变;Genomic_condition 再把它们二分为 Wild-Type 161 行与 Variants 24 行。

harmonized_dataset.tsv 是把数据集表拆到样本级的结果,一行一个样本,用 is_control 标出对照与处理。它的价值在于:你不必解析 Control 与 Treatment 两个逗号串,直接按 is_control 过滤就能拿到分组。这张表 669 行里 291 行是对照、378 行是处理,与论文的样本总数对得上。它还有一层隐含价值:同一 record_id 下的样本天然构成一个配对组,你不需要再自己写配对逻辑。

gene_annotations.tsv 是 Ensembl 的基因注释快照,六万一千余条,八个字段分别是基因号、基因符号、类型、描述、染色体、起点、终点与链方向。类型构成说明了这张表的取向:

基因类型 条数 是否参与差异分析 备注
protein_coding 两万余 是 传统分析的主体
lncRNA 一万七千余 是 本库的特色覆盖
processed_pseudogene 9,481 是 大量低表达,慎用
misc_RNA 2,207 是 注释较杂
unprocessed_pseudogene 1,955 是 与加工型假基因分列
snRNA 1,901 是 小样本下极不稳定
miRNA 前体基因座 1,877 是 是前体,不是成熟 miRNA
transcribed_unprocessed_pseudogene 1,597 是 —
TEC 1,017 是 待确认编码区

所有类型都进入差异分析,没有单独排除。其中 miRNA 与待确认编码区两类值得单独提醒。gene_annotations 里的 miRNA 是 DICER 剪切之前的基因座,不是成熟的二十二个碱基的 miRNA 分子,用 TPM 或 logfc 去解读它,等于在测一个前体。论文的扩展计划里明确写了未来才整合 miRNA 与环状 RNA,说明当前这版并没有针对小 RNA 做过专门处理。

differential_expression.tsv 是分析的主表,一行是“一个比较集里的一个基因”。它的列只有五个:比较集号、GEO 号、Ensembl 基因号、logfc 与 p 值。没有校正后 p 值,没有效应量置信区间,没有基因符号——要符号必须 join 注释表。这张表 139 万余行,是七张表里最值得先拿的。

2.3 一条记录的完整解剖

取 datasets.tsv 的第一行,把它的每一个字段、每一层关联都摊开看。这一行对应的是热休克 39 ℃ 二十四小时,细胞是 iPSC 来源的三维神经聚集体。

id                 0
PMID               24736721
GEO_id             GSE53667
No_of_samples      4
treatment_type     heat_39c_24h
stress_factor      heat
Control            GSM1298379, GSM1298380
Treatment          GSM1298381, GSM1298382
No_of_controls     2
No_of_treated      2
Cell_type          iPSC-3D neural aggregate
Tissue             Brain
Cell_group         Organoid  Group
Genotype           WT
Genomic_condition  Wild-Type

这一行能拆出四层信息。

第一层是比较集身份:record_id 为 0,来自 GSE53667,对应 PMID 24736721。回到原文可以查到这是用 Mariani 等人的方法做的神经聚集体,四十九天龄的聚集体在 39 ℃ 培养箱里放二十四小时,对照组留在 37 ℃。

第二层是设计:两对两,共四个样本。这就是全文最小的一种设计,也是 ASTRA 里最常见的规模。

第三层是标准化后的元数据:细胞类型被写成 iPSC-3D neural aggregate,组织归到脑,细胞状态归到类器官组,基因型标为野生型。这几个字段不是原作者填的,是建库方按 Cellosaurus 与 DepMap 标准化后填的。注意 Cell_group 字段里的双空格,这是源数据的实际状态,用字符串精确匹配会踩坑。

第四层是关联到别的表:拿 GSM1298379 去 harmonized_dataset.tsv 里查,会得到一行 is_control 为 True 的样本记录;拿 record_id 0 去 differential_expression.tsv 里查,会得到这个比较集下六万多个基因的 logfc 与 p 值。两处关联都只需要一个键,这也是整个库能把七张表拼起来的原因:record_id 定比较集,GSM 号定样本,gene_id 定基因,三者互不重叠。

differential_expression.tsv 中 record_id 0 的两行
record_id  gse_id     gene_id              logfc                pvalue
0          GSE53667   ENSG00000000003      -0.0754021953643218  0.723006949516518
0          GSE53667   ENSG00000000419       0.333403775875148   0.160445822433306

差异表只有五列:比较集号、GEO 号、基因号、logfc 与 p 值。第四列的 p 值是否经过多重检验校正,论文与表头都没有写明,这一点在 §7.3 会单独列出来。

2.4 分布表:四类应激的内部结构

先看四类应激在样本层面的不对称程度。

按样本看四类的内部结构,结果如下。氧化应激有六十七个比较集行,对照与处理的样本数大致是一百三十对一百五十,细胞状态以参照细胞为主、癌细胞系次之,主力细胞系是 MCF7、HeLa 与 PCS-100-013。UV 有五十二行,样本数大致一百对一百二十,参照与癌细胞系数量接近,主力是 HeLa、CS1AN 与 TK6。热休克有三十九行,对照与处理约四十对八十,参照细胞占多数,主力是 MCF7、VH10 与 HCT116。低氧有二十七行,样本约二十对二十八,癌细胞系占比最高,主力是 MCF7、HUVECs 与 K562。四类合计的对照与处理样本数与 harmonized 表的 291 对 378 一致,分类内的分项为四舍五入后的近似。

热休克一类的对照数明显低于处理数,原因在于多个比较集只有处理组,没有同一张表内的对照行。这类比较集在 datasets.tsv 里的 No_of_controls 是 0,共 56 行,它们不产生差异分析结果,只贡献表达量。

再看细胞系的使用集中度。57 个细胞系里,排在前八位的承担了相当比例的样本。

排在前八位的细胞系分别是 MCF7(乳腺,十六行)、HeLa(宫颈,十二行,四类应激都有使用)、PCS-100-013(皮肤成纤维,十一行,原代样的参照细胞)、VH10(皮肤成纤维,九行,热休克研究常用)、K562(骨髓,八行,悬浮细胞)、HCT116(结肠,七行,结直肠癌)、CS1AN(皮肤成纤维,七行,着色性干皮病来源,UV 研究常用)与 U2OS(骨,六行,骨肉瘤)。前八个细胞系承担的比例超过全库一半,这个集中度决定了任何“跨细胞系”的结论都主要由上皮来源的癌细胞系支撑。

细胞状态三分组的样本量差异同样值得记一笔。按数据集行统计,非疾病参照组 110 行、癌细胞组 69 行、类器官组 6 行。参照组内部既有永生化非癌细胞,也有原代细胞与干细胞,异质程度不低,不能当成同一个基线使用。癌组与参照组比较时,组织来源的差异会混进应激效应里。类器官只有 6 行,任何以类器官为一层的比较都只能算探索性的。

处理条件的写法是这批数据里最不整齐的地方。datasets.tsv 的 treatment_type 字段去重后有 90 种不同字符串,覆盖四类应激各自的剂量与时长组合。常见写法如下。

treatment_type 写法示例 含义 写法问题
heat_42c_1h 42 ℃ 一小时 小写 c 表摄氏度
heat_42C_1h 42 ℃ 一小时 同一条件的另一种大小写
heat_43C_1h-recovery_2h 43 ℃ 一小时再恢复两小时 恢复条件写在同一个串里
H2O2_500uM_1h 500 μM 一小时 浓度单位合理
H202_800uM_17h 800 μM 十七小时 数字 0 被写成字母 O
H2O2_100mM_8h 100 mM 八小时 mM 与 μM 差了三个数量级
UV_10 J/m2-recovery_6h 10 J/m² 后恢复六小时 数值里有空格
O2_1%_24h 1% 氧气二十四小时 百分号进入字段名

按 treatment_type 做分组统计之前,必须先归一化。用正则把“应激源 + 数值 + 单位 + 时长”拆开重新拼装,是唯一稳妥的做法。后文的代码段给了一个可以跑的例子。

2.5 与同类资源的字段差异

维度 ASTRA Expression Atlas GEO GTEx
收录范围 四类应激、人细胞系 多物种、多条件 全量归档 人多组织、健康人
是否重处理 是,单一流程 是,单一流程 否 是
记录粒度 比较集 实验 系列 组织样本
差异结果字段 logfc、pvalue log2FC、p 值、t 统计量 作者自定 无
非编码覆盖 mRNA 与 lncRNA 分列 以蛋白编码为主 视提交而定 以蛋白编码为主
对照显式标注 is_control 布尔列 condensed SDRF 无 无
许可 网站学术免费、包 CC BY 4.0 CC BY 4.0 视提交而定 dbGaP 受控
单独下载的扁平表 七张 按实验目录 按系列 按版本包

再加两行看使用层面的差别:同一个基因想查“哪套数据里显著”,在 ASTRA 里是差异表按基因号过滤,在 GEO 里要逐系列下载作者软表再拼,在 GTEx 里根本不存在“显著”这个概念。同一条查询,三个库的答案形态完全不同。另一行是版本控制:ASTRA 以 Zenodo DOI 锁定,Expression Atlas 以加载日期标记,GEO 以系列更新日期标记,GTEx 以版本号标记。四个库四种治理方式,跨库复现时要把这四种日期都记下来。

这张表要说清一件事:ASTRA 的字段设计是围绕“比较集”这个单位来的,而 Expression Atlas 与 GEO 是围绕“实验”与“系列”来的。比较集是一个比实验更细、比样本更粗的单位,它把“处理对对照”这件事显式化了。这个设计是它在四类应激上比通用库好用的直接原因,也是它不能跨出四类应激的直接原因。

§3 它盯的是“哪一组基因动了”,不是“这一个基因表达多少”

3.1 比较集是它的核心抽象

公共表达库里最常见的单位是样本和实验。样本是“一个管子里的 RNA”,实验是“一次提交”。这两个单位都不直接对应研究者真正想问的问题——真正想问的往往是“处理之后,这一组基因相对对照变了没有”。ASTRA 把这个问题做成了第一等公民,给它起名叫比较集。

比较集的定义在论文的方法里写得很硬:一个比较集必须包含一种人源细胞系、一个明确指定的分子应激源、至少一个未处理对照,并且实验条件与处理方案有清楚记录。四个条件同时满足才收录,任一不满足就剔掉。这个定义带来两个直接后果。第一个后果是库小:全库只留下 59 项研究,而 GEO 里与应激沾边的研究远不止这个数。第二个后果是可比性高:每个比较集内部的对照与处理是同一批实验里出来的,混入的批效应最小。

比较集与样本的关系不是一对一。一个比较集下可以有多组样本,一组对照、一组处理,也可能是一对一、一对多、多对多三种配对形态。一对一是最小设计,单样本处理对单样本对照,差异结果可算但没有重复,只当线索不做统计;一对多常见于多剂量共用一个对照,差异可算,但剂量之间共享同一条基线,稍不注意就把伪独立当成生物学重复;多对多是同一条件多个生物学重复,最可靠,遇到了优先选用;还有一种是无对照,只有处理组,这类在库里占 56 行,差异结果不可算,但它们仍进表达矩阵,所以查单个基因的 TPM 时它们会出现。

论文把三类应激源以外的变量也做了统计:四十个不同的处理时间点、二十七个不同的剂量水平、二十六种细胞系基因型。这些数字都不大,说明库的整体尺度就是一个“手工整理的窄集”,而不是一个大体量工程。它的价值不在数量,而在于每个比较集都经过了同一条筛选标准的检验。

3.2 处理与对照的配对关系

配对关系直接决定一个比较集能不能算差异,也决定算出来的差异意味着什么。上面已经把四种配对形态说过,这里换一个角度看同一件事:配对决定了“参照点”在哪里。

同一批实验里的对照,是最干净的参照点,因为它和处理的唯一差别就是应激本身。不同批次的对照,会引入批次效应,这种效应急性应激基因特别容易受影响。而没有对照,参照点就落到了“同细胞系的其他研究”上,跨研究的差异会被误判为应激效应。ASTRA 通过要求配对对照,把第三种情况挡在差异分析之外,但没有完全挡住第二种,因为同一个 record_id 下的对照和处理都是作者同一批交的,批次效应在作者层面就已经存在,ASTRA 无法消除。

这一点在跨细胞系比较时尤其要小心。MCF7 与 HeLa 对同一种应激的响应差异,一部分来自生物学,一部分来自两个细胞系在不同实验室、不同培养基、不同代次下的基线差异。库里能提供的是细胞系身份与处理条件,提供不了培养基配方与细胞代次的完整记录,因为原作者本来就没有系统记录这些。

3.3 时间与剂量的记录方式

三种变量在记录方式上差别很大。处理时长写在 treatment_type 字符串里,大部分有,格式不统一,带 recovery 字段的要单独拆出恢复时长;剂量也写在同一个字符串里,大部分有,但单位混用,mM 与 μM 必须统一;时间点与剂量水平的全局计数是论文给的四十个与二十七个,单个比较集内通常只有一个时间点与一个剂量。细胞代数写在 sample_metadata 的 growth_protocol_ch1 里,视原文而定,多数缺失。

剂量与时长只在字符串里,没有一个独立的数值列。这意味着任何按剂量分箱的分析,都得先自己解析字符串。这是它作为“重处理资源”没有做到位的一处,代价由使用者承担。

3.4 细胞系身份是怎么标准化的

四个处理步骤分别是:按 Cellosaurus 标准名对照合并同一细胞系的不同写法,少数未命中的条目保留原样;用 DepMap 补组织来源,使组织字段可用于分组,但大小写与拼写不统一;把细胞状态归为参照、癌、类器官三组,从而支持“病人对健康”式的对比,代价是原代与永生化被混在同一组;把基因型二分为 WT 与 Variants,支持野生型与变异系的比较,代价是敲低与敲除同属一类。

基因型的归并比较粗。161 行标为 Wild-Type,24 行标为 Variants,后者包括敲除、敲低、突变与 CRISPR 改造。从生物学上看,敲低和点突变不是一回事,但在 ASTRA 的字段里它们同属一类。要做精细的基因型分析,得回到原表逐个看 Genotype 字段的具体值。这个字段的价值在于快速筛出“有基因改造的比较集”,而不在于告诉你改造了什么。

3.5 它标出的“身份”里,哪些能直接用

由此得到的可用性判断可以归纳成一张表:

由此可以排出一个三档清单。能直接用于分组的只有 stress_factor 与 is_control 两个;需要二次清洗才能用的是 Cell_type(个别值是设备编号)、Cell_group(先去双空格)与 Genotype(敲低与敲除混同,只能粗分);不建议直接用于统计的是 Tissue(拼写与大小写不一致)与 treatment_type(九十种写法必须归一化)。

§4 质量:干净的地方与不干净的地方

4.1 统一流程到底统一了什么

流程从 FASTQ 开始。原始数据不在 GEO 取,而是从 ENA 按 SRR 号取——这一步在实践上很重要,因为 GEO 只存元数据与软表,真正的测序文件在 SRA 与 ENA,ENA 的 FTP 路径更直白。

ASTRA 的重处理链由七个环节组成:

七个环节依次是:用 FastQC 评估原始 reads 质量;用 Minion Reaper 识别接头序列;用 Cutadapt 切除接头,得到干净 reads;用 STAR 比对到 GRCh38;用 RSEM 做转录本定量,输出 TPM;用 edgeR 在配对样本上做处理对对照的差异分析;用 biomaRt 映射 Ensembl 基因号。这七个工具全部是领域内通行的公开软件,没有自研组件,意味着整个流程可以被任何有算力的团队复现。

复现一段的速度比想象中快:一个样本的 FASTQ 到 TPM 在普通服务器上几个小时能跑完,669 个样本的核心开销在下载与排队。真正耗时的不是算,而是确认每个比较集的条件与对照是否配得上——这件事 ASTRA 已经做过一遍,你省下的正是这一段。

统一的边界很清楚:比对版本、定量方法、差异检验的软件与实现被拉齐了;样本收集、文库制备、测序平台、剂量与时长没有被拉齐。前者决定数字能不能放在一起,后者决定数字意味着什么。

把这条链拆成八个环节逐个看,是否统一很清楚。测序平台不统一,决定读长与错误谱;文库制备不统一,决定 3′ 偏好与链特异性;去接头与修剪统一,影响比对率;比对与参考基因组统一,消除版本漂移;定量统一为 TPM;差异检验统一为 edgeR;剂量与时长不统一,直接决定生物学含义;细胞代数与培养条件不统一,影响基线表达。

4.2 mRNA 与 lncRNA 分列的代价与收益

把长链非编码 RNA 与蛋白编码基因分开汇总,是 ASTRA 相对多数同类资源最明显的一处加法。收益是直白的:做非编码 RNA 应激响应的人,不必自己从原始数据里重新定量一遍。

代价也直白。lncRNA 的表达量普遍低于蛋白编码基因,TPM 落到个位数甚至零点几的情况很常见。在只有两三个重复的比较集里,低表达基因的差异检验结果非常不稳,p 值的小幅波动就会让一个候选基因在 0.04 与 0.06 之间反复横跳。

两类基因的差别可以用四个维度概括。注释条数上,蛋白编码两万余条、长链非编码一万七千余条,体量相当;典型表达水平上,前者中到高,后者偏低;小样本下的稳定性上,前者较好,后者差;跨平台一致性上,前者较好,后者强依赖文库制备。因此建议的筛选门槛也应不同:蛋白编码基因用 p 小于 0.01 且 logfc 绝对值大于 1 即可起步,lncRNA 还要额外要求方向在多个比较集里一致。

4.3 元数据的完整度

八项元数据的覆盖情况是:细胞系名与组织来源全部齐全,前者来自原研究加标准化,后者由 DepMap 补齐;测序平台全部齐全,来自 sample_metadata;处理时长与剂量大部分可解析,来源是 treatment_type 字符串,缺了就既不能按时间分层也不能做剂量-响应;培养基部分可查,来自 growth_protocol 字段;细胞代数与血清情况只有少数研究写清,缺了就无法评估细胞漂移与血清对基线的缓冲作用。

4.4 案例:MCF7 的氧化应激那一组比较集

MCF7 是库里用得最多的细胞系,十六个比较集涉及它。取其中一个过氧化氢 500 μM 一小时的比较集做解剖,能看到这套数据结构里最典型的一条路径。它是乳腺癌来源、归在癌组、基因组状态为野生型,处理是 500 微摩尔一小时,设计是两对两共四个样本,靠 record_id 贯穿三张表。

这个比较集的 record_id 在 datasets.tsv 里能找到,stress_factor 为 h2o2,treatment_type 形如 H2O2_500uM_1h,Cell_group 为 Cancer Group,Genomic_condition 为 Wild-Type。它有一条配对对照,两个样本对两个样本。

第一步,从 harmonized 表查样本。四个 GSM 号,两个 is_control 为真,两个为假。四个样本在 sample_metadata 里都能找到原始描述:细胞名、处理方式、建库试剂盒、测序平台。这些描述是作者写的,措辞各不相同,但足以判断这是同一批实验。

第二步,从差异表取结果。按 record_id 过滤,得到这个比较集下四万九千多个基因的 logfc 与 p 值。这时会发现两件事:蛋白编码基因与 lncRNA 混在同一张表里,要区分得去 join 基因注释表;p 值没有校正列,得自己套 Benjamini-Hochberg。

第三步,做筛选。这里就碰到 §4.2 提到的问题:如果门槛直接定在 p 小于 0.05 且不校正,候选基因会有数千个;如果加上 BH 校正,候选会掉到几百个;如果再要求 logfc 绝对值大于 1,只剩几十个。三个门槛对应三个完全不同的候选集,而论文没有告诉你该用哪一个。

第四步,横向对照。把这个比较集的候选基因,与同一应激类别下其他 MCF7 的比较集做个交集。如果一条基因在三个以上独立的 MCF7 氧化应激比较集里都同向变化,它的可信度才值得往下走。整个 MCF7 氧化应激案例给出的经验是:不要看单个比较集的名次,要看跨比较集的复现次数。

第五步,回到原始数据。选定两三个候选后,回到 GEO 取对应 GSE 的原始 FASTQ,用原文方法或自己的方法重跑一遍,看方向是否还在。这一步不能省,因为前面这个 MCF7 氧化应激案例的整条路径每一步都有信息损失,损失叠三轮之后,剩下的只是一个假设。

整条路径的信息损失可以逐段列出来:

损失分布在五个路径段上。挑选比较集这一段,从全库收窄到一个 MCF7 氧化应激比较集,丢掉的是其他剂量与时长;取样本这一段,从四个 GSM 号得到两组 TPM,丢掉的是原始读段的质量信息;取差异结果这一段,从差异表子集得到全基因的 logfc 与 p 值,丢掉的是检验细节;阈值筛选这一段,从全基因结果收窄到候选集,代价是阈值主观、结论随阈值漂移;横向对照这一段,从单比较集候选变成跨比较集复现候选,代价是比较集之间不可直接平均。

4.5 网站能做的与表能做的

网站提供三个分析模块:研究选择、基因检索、差异表达。它们对应的是“筛—查—比”三种动作,输出是可下载的表与交互图。这些在数据层面都能用扁平表复现,网站的价值在于快,不在于多。研究选择页给两张同步的表,一张研究一张样本,可以边筛边看;基因检索页按基因号返回它在各比较集里的 TPM 与倍数变化;差异表达页是唯一带统计筛选的地方,可以按 log2 平均倍数变化与平均 p 值设阈值。

按六种动作逐一对照:按细胞状态筛比较集,网站是交互筛选,表是过滤 Cell_group,两者都行、网站更快;单基因跨比较集查询,网站有基因检索页,表要 join 差异表与注释表,网站更快;全库批量计算与自定义统计,网站不支持,表完全支持;出图看趋势,网站内置图表,表要自己画,网站省事;离线复现,网站无法做到,只能用表。分界线很清楚:探索用网站,复算用表。

§5 取数:网站、Zenodo、源码三条路

5.1 网站是 Streamlit 应用,静态抓取拿不到内容

打开 https://astra-db.com/ 返回的是 200,但页面只有不到一 KB 的 HTML,正文靠浏览器端脚本渲染。用 curl 或者任何不执行 JavaScript 的抓取方式,看到的都是空壳。这不影响使用,但影响自动化:想用脚本从网站上批量取数,得走网站的后端,或者干脆用 Zenodo 的表。

5.2 Zenodo 全量包

Zenodo 记录 10.5281/zenodo.15885686 提供七个文件,发布日期是 2025 年 7 月 14 日,许可 CC BY 4.0。七个文件里最大的是表达矩阵,约 1.3 GB,第二大的差异表约 88 MB,其余五个都在 10 MB 以下。

七张表的大小在 §2.2 已经列过。下载策略只分两档:五张小表(清单、研究、样本、索引、注释)合计不到 10 MB,无条件全取;差异表 88 MB,只要做基因层面分析就必须取;表达矩阵 1.3 GB,只有自己重算 TPM 或做定量层面的检查时才需要。下载方式是 Zenodo 的固定路径,不需要令牌。

#-- 建目录并取回体积较小的五张表
mkdir -p astra_data && cd astra_data
base="https://zenodo.org/api/records/15885686/files"
for f in datasets study_metadata sample_metadata harmonized_dataset gene_annotations; do
  curl -fL "$base/$f.tsv/content" -o "$f.tsv"
done
wc -l *.tsv
#-- 差异表 88 MB,需要时再取
curl -fL "$base/differential_expression.tsv/content" -o differential_expression.tsv

下载完先核对行数。datasets.tsv 应当有 185 个数据行,study_metadata.tsv 59 个,sample_metadata.tsv 与 harmonized_dataset.tsv 各 669 个,gene_annotations.tsv 六万一千余个。任何一个对不上,说明快照换了版本。

#-- 行数核对(第一行是表头,所以数据行数要减一)
for f in datasets study_metadata sample_metadata harmonized_dataset gene_annotations; do
  n=$(($(wc -l < "$f.tsv") - 1))
  echo "$f  data_rows=$n"
done

5.3 用 pandas 拼出一张可分析的表

拿到扁平表之后,第一件事是把差异结果、基因注释与样本分组拼在一起。下面的脚本可以在本地跑,不依赖任何私有接口。

import pandas as pd

#-- 读入五张小表,分隔符是制表符
ds = pd.read_csv("datasets.tsv", sep="\t")
harm = pd.read_csv("harmonized_dataset.tsv", sep="\t")
genes = pd.read_csv("gene_annotations.tsv", sep="\t")
de = pd.read_csv("differential_expression.tsv", sep="\t")

#-- 字段值带双空格,先做去空白
ds["Cell_group"] = ds["Cell_group"].str.strip()
harm["Cell_group"] = harm["Cell_group"].str.strip()

#-- 表达矩阵按需读入,只取需要的比较集
expr = pd.read_csv("expression_data.tsv", sep="\t", index_col=0)

print("比较集行", len(ds), "样本", len(harm), "基因", len(genes), "差异行", len(de))
print(ds["stress_factor"].value_counts())
print(harm["is_control"].value_counts())

差异表与表达矩阵都很大,读入时不要一口气全部 join。按 record_id 分批处理,内存压力会小很多。

#-- 分批 join:先缩小基因集,再与差异表合并
coding = genes.loc[genes["biotype"].isin(["protein_coding", "lncRNA"]), "gene_id"]

for rid, sub in de.groupby("record_id"):
    keep = sub.loc[sub["gene_id"].isin(coding)].copy()
    keep = keep.merge(genes[["gene_id", "gene_symbol", "biotype"]], on="gene_id", how="left")
    #-- 其余略:在这里对 keep 做 BH 校正与阈值筛选

5.4 处理条件字符串的归一化

归一化之后还要做一件事:把处理时长从字符串里拆到一个独立列。原因是要做“短暴露对长暴露”的对比时,按字符串排序会把 1h 排在 30min 前面。下面这段把时长统一折算成分钟。

import re

def to_minutes(t):
    """把 1h / 30min / 2days 统一折算为分钟"""
    if not isinstance(t, str) or not t:
        return None
    m = re.match(r"(\d+(?:\.\d+)?)\s*(min|h|hr|hour|hours|d|day|days)", t, re.I)
    if not m:
        return None
    v = float(m.group(1))
    unit = m.group(2).lower()
    if unit.startswith("h"):
        return v * 60
    if unit.startswith("d"):
        return v * 1440
    return v

ds["duration_min"] = ds["duration"].apply(to_minutes)
print(ds["duration_min"].describe())

90 种 treatment_type 写法是这套数据最容易踩的坑。下面这段把字符串拆成四个标准列。

import re
import pandas as pd

def parse_treatment(s):
    """把 treatment_type 拆成 应激源 / 数值 / 单位 / 时长 四段"""
    s = str(s).strip()
    #-- 先修常见编码错误:字母 O 当数字 0,mM 统一视为 mM 保留原单位
    s = re.sub(r"H202", "H2O2", s, flags=re.I)
    m = re.match(r"(?P<agent>[A-Za-z0-9]+)_(?P<val>[0-9.]+)\s*(?P<unit>[a-zA-Z/%]+)?(?:_(?P<time>[0-9]+[a-z]+))?", s)
    if not m:
        return pd.Series({"agent": None, "value": None, "unit": None, "duration": None})
    g = m.groupdict()
    return pd.Series({
        "agent": g["agent"].upper(),
        "value": float(g["val"]),
        "unit": (g["unit"] or "").lower(),
        "duration": g["time"],
    })

ds = pd.read_csv("datasets.tsv", sep="\t")
parsed = ds["treatment_type"].apply(parse_treatment)
ds = pd.concat([ds, parsed], axis=1)
print(ds["unit"].value_counts(dropna=False).head(10))

跑完会看到单位列里同时出现 um、um、µM、mM 几种写法。把它们映射到同一个量纲再比较,是这一步的全部目的。

5.5 跨比较集汇总的三种做法

三种做法各有明确的适用问题。取交集是每个比较集取显著基因再求交,回答“哪些基因在多数比较集里都显著”,风险是样本小的比较集贡献几乎为零。方向投票是每个比较集只记上调或下调再统计票数,回答“方向是否稳定”,风险是忽略效应量大小。分层平均是按应激类别与细胞状态分层再做层内合并,回答“某类应激的平均效应”,风险是层内样本仍不均质。

§4.4 的案例用的是第二种做法,原因是 MCF7 的氧化应激比较集之间剂量跨度太大,直接取平均会把 50 微摩尔与 500 微摩尔的效应混在一起。

三种做法都有人用,但第三种最容易被误用。分层之后如果某一层只有两三个比较集,合并出来的平均值没有统计意义,只是一个加权数。

5.6 常见取数错误

六种取数错误各有代价与正解:把表达矩阵全量读入再 join 会内存溢出,应按 record_id 分批;用 id 列当比较集号会关联错行,应改用 record_id;用 GSE_id 当唯一键会漏掉一个系列拆出的比较集,应改用 record_id 加 treatment_type 的复合键;按 Tissue 精确匹配分组会因拼写差异漏行,应先小写化并去空格;认为 p 值已校正会让候选基因虚高,应自己套 BH;把 No_of_controls 为 0 的行算进差异统计会让分母出错,应只取有对照的比较集。

六种错误里,前三种会让结果错误而不报警,后三种会让结果缩小而看不到报错。它们共同的根源是把一个宽表当成了关系表来用。把七张表当关系表看,键只有三个,其余都是描述字段,出错概率就会降下来。

§6 与库内条目的关系

6.1 关系图谱

ASTRA 站在几个更大的资源之上,同时与几个下游资源形成分工。

八个相关条目分三类关系。上游一组是 GEO、SRA 与 Cellosaurus、DepMap:GEO 存提交、ASTRA 取其中应激子集重算,要全量、最新或原始 FASTQ 就去 GEO;SRA 与 ENA 存 FASTQ,要重跑比对就去那边;细胞系标识与注释由 Cellosaurus 与 DepMap 补出,要查细胞系来历与依赖性直接去原库。平行一个是 Expression Atlas,它同样做重算,但重在处理广度,ASTRA 重在应激纵深。互补一组是 GTEx、TCGA 与 ENCODE:前者给健康人组织的基线表达,用来把应激响应放回组织背景;TCGA 给肿瘤转录组,用来问这个变化在肿瘤里是否也成立;ENCODE 给调控元件与结合位点,用来把差异基因落到调控层上。三者加在一起,才构成从表达变化到机制解释的完整链路。

6.2 检索路径

六条检索路径覆盖绝大多数入口。从一个候选基因出发,差异表按 gene_id 过滤,得到它在哪些比较集里显著;从一类应激出发,datasets 按 stress_factor 过滤,得到该类下所有比较集;从一个细胞系出发,datasets 按 Cell_type 过滤,得到它参与的应激实验;从一篇论文出发,study_metadata 按 pubmed_id 反查,得到对应的比较集与样本;从一个 GEO 系列出发,datasets 按 GSE_id 过滤,得到该系列拆出的比较集;从一个 GSM 样本出发,harmonized 按 GSM_ID 查,得到它属于哪个比较集、是对照还是处理。

从任何一个起点进入,最终都会落到 §4.4 的案例用过的那三张表上:datasets 定比较集,harmonized 定样本,differential 定结果。三张表以 record_id 为轴,这是整个库能横向拼接的前提。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

下面这张表把常见的三种错位评价方式列出来,避免在后面几节里继续误判。它们都不是事实错误,而是评价口径的错位。

常见评价口径 错在哪里 换成什么口径
样本太少,不如公开大库 拿总量比,不看单位 比“可比较的比较集数量”
只收四类应激,太窄 拿广度比,不看纵深 比“同一类应激内的条件颗粒度”
没有单细胞,落后 拿技术形态比,不看问题 比“bulk 层面能否直接对得上”

在给这个库打分之前,先纠正一种常见的错位:把它当成“应激转录组的全量参考”来评价。按这个标准,它必然不及格——只收四类、每类一个应激源、样本总量不到七百。但这种评价方式本身就是误判,因为它从一开始就没打算做全量。

它的自我定位是一个纵深资源:在四类应激这个窄口上,把能收的都收进来,并且收得足够整齐。按这个标准评价,要看的是这四类内部的覆盖是否均匀、标准是否一致、结果是否透明。下面五维打分按后一个标准。

7.1 五维评分

评分按 DAIMS 框架的五维口径,每维给分并写明扣分点。

五个维度的打分与理由分别是:可发现性 4.0 分,有 NAR 论文、稳定域名与 Zenodo DOI,扣分在网站无静态正文、搜索引擎收录的摘要有限;可访问性 4.5 分,网站无需注册、Zenodo 无需令牌、源表直链,扣分在网站依赖脚本渲染;互操作性 3.5 分,TSV 与 Ensembl 基因号是通行格式,但处理条件没有结构化字段,跨库对齐要自己写解析;可复用性 3.5 分,七张扁平表可以离线全量复算,扣分在网站与 Zenodo 快照可能不同步;可信度 4.0 分,流程参数透明、论文可查、来源可溯至 GEO,扣分在 p 值是否校正未写明、部分字段编码不整齐。合计十九点五分,满分二十五,这一档对应的是“方向明确、执行到位、但细节留了口子”的资源。

7.2 与同定位资源的对比

与同类比,强弱是互补的:对 GEO,它强在可直接横向比较,弱在全量、最新与原始文件下载;对 Expression Atlas,它强在应激条件元数据更细、lncRNA 单独成列,弱在物种与条件覆盖以及注释规范度;对各实验室自建的应激数据集,它强在一个入口一套流程,弱在特定条件下的深度与实验控制。

7.3 已知的、可枚举的偏差

偏差 表现 影响 缓解办法
应激源单一 每类只收一个分子应激源 结论不能外推到同类其他应激源 明确写清限定条件
细胞系集中 少数常用细胞系占多数样本 反映的是常用细胞模型,不是人体 按细胞状态分层后再下结论
组织不均 乳腺、肺、皮肤占比高 少见组织的结论样本支撑薄 少见组织结论标为探索性
类器官极少 仅 6 行 三维模型比较无统计意义 不做类器官专项结论
无对照的比较集 56 行 这些行不能进差异统计 差异分析时剔除
p 值口径不明 表中只有 pvalue 一列 直接按 0.05 筛会大量假阳性 自己套 BH 校正
字段编码不一致 H202、mM 与 μM 混用 按字符串分组会漏行 归一化后再统计
非人样本混入 669 个样本里有 1 个物种是小鼠 逐样本统计时出现异常 按 organism 字段过滤
快照滞后 Zenodo 停在 2025-07 网站新增内容不可离线复现 关键分析记录版本与日期
剂量与时长不齐 90 种处理写法,单位混用 同类比较集之间效应量不可直接平均 归一化后按时间分箱
单集样本过少 多数比较集 2–6 个样本 单集差异检验效力低 跨比较集复现投票

7.6 与三份外部参照的对齐检查

偏差不能只靠自己枚举,还要放到外部参照里看是否成立。三个角度各给出一个可以复做的检查方法。

第一个角度是与原始论文对齐。任取一个比较集,把它在 PMID 里对应的原文找出来,看作者自己报告的显著基因方向与 ASTRA 差异表里的方向是否一致。方向不一致的比例越高,说明流程差异对结论的影响越大。这个检查可以批量做,只要原文有可下载的补充表。

第二个角度是与另一套重处理结果对齐。Expression Atlas 里同样收录了部分 GEO 系列,两边对同一批样本的重算结果可以做一致性对比。效应量有系统性偏移是正常的,方向大面积翻转才需要警惕。

第三个角度是与独立实验对齐。如果你手上有同细胞系、同应激源的自测数据,可以把库里的效应量排序与自己的结果做秩相关。相关系数高说明库里的相对排序可用,绝对值仍不可直接用。

三个检查各自独立,任何两个方向一致就能支撑“这个库在你的场景里可用”的判断,三个都反过来,说明你的场景落在库的边界之外。

三个角度的成本差别很大。第一个最便宜,只需要公开数据与脚本;第二个中等,要拿到对方库里的同系列结果并对齐基因号;第三个最贵,需要自己的湿实验数据。建议的顺序是从便宜到贵:先用第一个排除明显离群的比较集,再用第二个确认流程差异的幅度,最后才用第三个确认具体的效应量。

这十一条里,前三条是设计决定带来的偏差,无法修复,只能在报告里写清限定;中间六条是执行层面的瑕疵,可以用脚本绕开;最后两条是时间与版本带来的漂移,靠锁定版本应对。把这九条与 §7.0 的前置校正连起来看,可以得到一条实务结论:这个库适合做假设生成与候选排序,不适合做效应量估计与确证性检验。效应量估计要选同细胞系、同剂量、同时长、且重复数足够的比较集,全库满足这四条的比较集并不多。

7.4 外部验证矩阵

四个外部参照各有边界,下面逐一说清能验证什么、不能验证什么。拿比较集对应的 PMID 与原始论文对比,能看主要结论方向是否一致,但具体 p 值不可比。拿同一 GSE 在 Expression Atlas 中的重算结果对比,能看流程差异带来的效应量差别,但两边的条件覆盖不完全重叠。拿同细胞系同条件的自测数据对比,能看库内结果是否可迁移,但只对单一条件有效。拿已知应激通路的基因集对比,能看已知通路是否富集,但新通路无法通过它验证。

参照 能验证 不能验证
原始论文 主要结论方向 具体 p 值
Expression Atlas 重算 流程差异的效应量幅度 条件覆盖不完全重叠的部分
自测同条件数据 库内结果的迁移性 单一条件以外的情况
通路基因集 已知通路是否富集 新通路

7.5 它为何能持续:一个窄口上的长期策展,靠的是成本可控与需求明确

这类资源最难的不是建,是维护。全量转录组库要跟上所有物种所有条件,成本无上限。ASTRA 把范围锁死在四类应激,每月从 GEO 补录,人力投入可以预估,这是它能持续的机制基础。需求侧同样清楚:做应激生物学的人不多,但队伍稳定,且每个人都要面对同样的碎片化问题。窄口加稳定需求,是这个资源能活下来的现实理由。

§8 生态位与历史

8.1 历史沿革

时间线只有四个节点,每个节点都对应一次定位变化。2015 年团队发表氧化应激下编码与非编码基因组差异表达的研究,奠定了“mRNA 与 lncRNA 分开看”的方法偏好;2024 年发表 KDM7A-DT 与基因毒性应激的研究,延续了非编码 RNA 在应激中角色这条线;2025 年 7 月 Zenodo 发布第一版全量数据包,数据第一次可以离线整包获取;2026 年 1 月 NAR 数据库专刊论文发表,资源身份与引用入口正式确立。

从这条线能看出,ASTRA 不是一次性的数据整理项目,而是一个研究方向的沉积。团队先做了几年应激与非编码 RNA 的具体研究,再把这些研究的分析方法固化成库。这解释了为什么它对 lncRNA 的处理比多数同类资源细。

8.2 生态位:介于通用库与专项库之间

四个相邻位置可以逐一对照。通用归档如 GEO 与 SRA,全量、不重算,ASTRA 的差异是它做重算与筛选。通用重处理库如 Expression Atlas,广覆盖、统一流程,ASTRA 的差异是窄覆盖但应激纵深。专项库如各类通路或疾病专题库,围绕一个生物学问题,ASTRA 与之的区别是它围绕一类刺激而不是一类疾病。项目组自建的应激数据集深但不广,ASTRA 比它广,但仍在一个窄口内。

这个位置有一个隐含的取舍:越靠专项,越容易被领域内的人记住;越靠通用,越容易被当作基础设施。ASTRA 选了前者。

8.3 与相关方向的分工

五个相关方向的接法不同。应激响应基因发现问“哪些基因在应激下变化”,ASTRA 出候选,验证靠实验。应激通路富集问“变化集中在哪些通路”,用它的差异表接通路库。调控机制问“变化由哪些转录因子或元件驱动”,需要接 ENCODE。疾病关联问“应激响应的基因是否与疾病相关”,需要接 TCGA 或 GWAS 汇总。药物应激模拟问“药物是否引发类似响应”,把它的数据当参考指纹用。

8.4 扩展计划与它的含义

论文里列出的扩展方向包括:在既有类别下增加新的处理方式、纳入 miRNA 与环状 RNA、增加 ATAC-seq 与 ChIP-seq 等组学层、加入小鼠与酵母等模式生物、新增内质网应激与渗透应激等类别。

五项计划对当前使用者的含义各不相同:增加处理方式意味着现有四类的单一应激源限制未来会松动,但现在还没松;纳入小 RNA 提醒你当前注释里的 miRNA 只是前体,别当成熟分子用;增加表观层说明现在还没有调控层数据,要做得自己接;加入模式生物说明现在几乎全是人源细胞系;新增应激类别说明内质网应激与渗透应激目前完全不在库内。

§9 使用指引

9.1 三种角色的路径

三种角色的共同前提是:先想清楚你的问题属于“发现”还是“确证”。发现类的任务适合用它,确证类的任务不适合。下面三条路径按这个前提来排。

角色 起点 三步路径 交付物
探索型研究者 一个宽泛问题 先按应激类别看规模,再按细胞状态筛选,最后锁定两三个比较集精读 一份候选基因清单
生信分析者 一个具体基因或基因集 下载五张小表,归一化处理条件,跨比较集算方向一致性 一张带复现次数的表
实验设计者 一个待验证假设 找到同细胞系同条件的比较集,看效应量,设计验证实验 一组带预期方向的候选

9.2 一条最短的可用流程

从零到一张可用候选表,最短路径是下载四张小表加差异表,做三步处理。

#-- 第一步:下载(五张小表约 9 MB,差异表 88 MB)
mkdir -p astra_data && cd astra_data
base="https://zenodo.org/api/records/15885686/files"
for f in datasets harmonized_dataset gene_annotations differential_expression; do
  curl -fL "$base/$f.tsv/content" -o "$f.tsv"
done
import pandas as pd
from statsmodels.stats.multitest import multipletests

#-- 第二步:读表并只保留有对照的比较集
ds = pd.read_csv("datasets.tsv", sep="\t")
harm = pd.read_csv("harmonized_dataset.tsv", sep="\t")
genes = pd.read_csv("gene_annotations.tsv", sep="\t")
de = pd.read_csv("differential_expression.tsv", sep="\t")

with_ctrl = set(ds.loc[ds["No_of_controls"] > 0, "id"].astype(int))
de = de.loc[de["record_id"].isin(with_ctrl)]

#-- 第三步:逐比较集做 BH 校正并筛选
hits = []
for rid, sub in de.groupby("record_id"):
    sub = sub.dropna(subset=["pvalue"]).copy()
    if len(sub) < 1000:
        continue
    sub["padj"] = multipletests(sub["pvalue"], method="fdr_bh")[1]
    sig = sub.loc[(sub["padj"] < 0.05) & (sub["logfc"].abs() > 1)]
    hits.append(sig.assign(record_id=rid))

sig_all = pd.concat(hits, ignore_index=True)
sig_all = sig_all.merge(genes[["gene_id", "gene_symbol", "biotype"]], on="gene_id", how="left")

#-- 第四步:统计每个基因出现在多少个比较集里
votes = (sig_all.assign(direction=sig_all["logfc"] > 0)
         .groupby(["gene_id", "gene_symbol", "direction"])
         .size().rename("n_records").reset_index()
         .sort_values("n_records", ascending=False))
print(votes.head(20))
votes.to_csv("astra_candidates.tsv", sep="\t", index=False)

这段跑完得到的是一张“基因 × 方向 × 出现次数”的表。出现次数在三个以上、方向一致的,才值得往下看。

9.3 三类人群的最短路径

上面那张三种角色的表给的是心智路径,这里给的是可执行的最短路径,按人群分别写。

人群 已有条件 最短步骤 预计产出
临床或湿实验背景的研究者 一个候选基因,无编程 打开网站基因检索页,输入符号,看列表里的应激类型与方向 一张候选清单,标注方向
生信工程师 Python 环境,会 pandas 下五张小表加差异表,跑 §9.2 的脚本 一张基因 × 方向 × 复现次数的表
资源管理或立项评估者 需要比较同类资源 读本文 §2.5、§7.2、§8.2 三处,再核对 Zenodo 与 Expression Atlas 一页选型结论

引用这个资源时需要同时给出三样:数据库论文、数据包 DOI、访问日期。论文是资源身份的依据,数据包 DOI 是版本依据,访问日期是因为网站在更新而数据包不跟。

Tsifintaris M, Grigoriadis D, Sitmalidis M, et al. ASTRA: a comprehensive
resource of stress-induced transcriptional activity in human cell lines.
Nucleic Acids Res. 2026;54(D1):D938-D948. doi:10.1093/nar/gkaf1174

ASTRA data package, version 2025-07-14. Zenodo.
doi:10.5281/zenodo.15885686

9.4 引用方式

§10 AI 使用声明

环节 谁做的 具体内容 需要你复核什么
实体核验 模型执行 检索同名候选,排除公司、试验、光束线、量表等 是否还有未覆盖的同名资源
论文摘要 模型执行 从 Europe PMC 取摘要与全文 XML 摘要之外的设计细节
网站探活 模型执行 对官方域名做 HTTP 请求 网站当前数据库是否更新
数据清单 模型执行 从 Zenodo 取七个文件的元数据与五个小表 快照是否仍为同版本
字段统计 模型执行 按字段计数,与论文口径比对 分类计数是否符合你的定义
正文写作 模型起草 结构、示例、评分、路径 与你领域的实际经验是否相符
事实取舍 人工 哪些数字进正文、哪些标未核实 是否存在过度解读
口径判断 人工 论文与数据包不一致时如何表述 是否与最新共识冲突

常见误读(避坑清单)

下面是十条常见误读。每条的第三列都指向本文的具体出处,便于逐条核对,而不是只记结论。

常见说法 实际 证据
ASTRA 是个大数据集 669 个样本、86 个比较集,规模很小 论文与 sample_metadata 行数一致
它包含所有已知应激源 每类只收一个分子应激源 论文方法节明确单一指派
它的差异 p 值可以直接按 0.05 筛 表中只有原始 p 值一列 differential_expression.tsv 表头
网站上的数据比 Zenodo 新 网站按月更新,包停在 2025-07 论文更新节奏与 Zenodo 发布日期
它是全人源数据 669 个样本里有 1 个物种是小鼠 sample_metadata 的 organism 字段
处理条件字段可以直接分组 90 种写法,含编码错误 datasets.tsv 的 treatment_type 去重
类器官数据够做专项分析 只有 6 行 Cell_group 计数
它是 CC BY 全开放 网站是学术免费,论文是 CC BY-NC 论文版权页与 Zenodo 元数据
一个 GSE 等于一个比较集 一个 GSE 可拆出多个比较集 datasets.tsv 的 GEO_id 重复计数
用它可以省掉读原文 剂量时长都在原文,库里只有串 sample_metadata 的 protocol 字段

FAQ

十二问覆盖的都是实际使用中最常撞上的问题,按“是什么、能不能、怎么用、会不会”四类排列。

Q1:ASTRA 和 GEO 是什么关系?
它是消费方不是生产方。原始测序数据都在 GEO 与 ENA,ASTRA 做的是挑出应激特异的那一批,用统一流程重算,再把结果拆成可以横向比较的小表。要原始 FASTQ 去 ENA,要能直接比的表达量与差异结果来这里。

Q2:能不能拿它当应激生物标志物的一次性筛选平台?
可以当候选清单来源,不能当验证。每个比较集样本数很少,且应激源的剂量与处理时长来自原作者,ASTRA 没有重做实验。筛出来的候选基因必须回到独立实验里复现。

Q3:lncRNA 部分该怎么用?
基因注释表里有近一万八千条 lncRNA,差异表也一起给出,这是它相对多数重处理资源多出来的一块。但 lncRNA 的定量与差异检验对小样本很敏感,建议只取各比较集里方向一致、p 值稳定的少数候选。

Q4:为什么网站打开是空白或者一直在转圈?
它是 Streamlit 应用,页面内容靠浏览器端脚本渲染,静态抓取只能拿到空壳。数据要稳定可得,直接用 Zenodo 的七张扁平表,不需要经过网站。

Q5:同一个基因在不同比较集里的 logfc 可以直接平均吗?
不可以。各比较集的细胞系、剂量、处理时长都不同,logfc 的参照点也不一样。要做跨比较集汇总,先按应激类型与细胞状态分层,再看方向一致性,而不是取算术平均。

Q6:论文说 86 个比较集,为什么下载的表有一百八十多行?
两个口径不同。比较集是“一次处理对一次对照”的设计单元,datasets.tsv 是按“比较集 × 处理条件”拆的,同一个设计里不同剂量或时长会各占一行。

Q7:它收录电离辐射或亚砷酸盐的应激数据吗?
不收录。四类应激各自只对应一个分子应激源,氧化应激用的是过氧化氢,DNA 损伤用的是紫外线。其余应激源不在当前范围内。

Q8:我能不能只用表达矩阵,不用差异表?
可以,但表达矩阵约 1.3 GB,且 TPM 不能直接跨样本比较。没有配对对照与批次信息,自己从 TPM 重算差异,得到的结论未必比直接用作者的差异表更好。

Q9:许可到底是什么?
三个地方三种说法:网站面向学术用户免费,论文是 CC BY-NC 4.0,Zenodo 数据包是 CC BY 4.0。学术用途没有障碍,商业用途要逐项确认。

Q10:它和 Expression Atlas 该选哪个?
问“某类应激下哪些基因在动”,用 ASTRA;问“某个基因在哪些物种哪些条件下表达”,用 Expression Atlas。前者窄而深,后者广而平。

Q11:样本很小,能训练模型吗?
当特征源可以,当训练标签不行。669 个样本撑不起一个有监督的深度学习模型,但可以拿来做基因集的先验权重或者规则式打分。

Q12:它的数据会不会停止更新?
论文说按月从 GEO 补录,但更新依赖团队的项目资助,Zenodo 快照也停在 2025 年 7 月。长期可用的话,建议把关键分析锁定在一个明确版本上。

术语表

附录 F:一句话对照表

你可能想问 一句话答案
它和 GEO 谁更全 GEO 全,它更可比较
它和 Expression Atlas 谁更广 对方广,它更深
数据在哪下 Zenodo 七张表
有没有原始测序 没有,回 ENA 取
p 值要不要自己校正 要,表里是原始 p
能不能只做四类以外的应激 不能,当前不收录
商用行不行 学术可用,商用逐项确认
术语 中文 解释
bulk RNA-seq 批量转录组测序 一组细胞混在一起测,得到平均表达
comparison set 比较集 一个处理组加配对对照,是 ASTRA 的基本单位
control 对照 未施加应激的样本
treatment 处理 施加了应激的样本
stressor 应激源 引起应激的物理或化学因素
oxidative stress 氧化应激 由活性氧引起的应激,库内用 H2O2
hypoxia 低氧 氧气浓度低于常氧,库内用 1%–3%
heat shock 热休克 高于正常培养温度的短时暴露
DNA damage DNA 损伤 库内以 UV 照射代表
logfc 对数倍数变化 处理组相对对照组的表达对数差
pvalue 原始 p 值 未经多重检验校正
padj 校正后 p 值 经 BH 等程序校正,需自己计算
TPM 每百万转录本数 跨样本相对可比的表达量单位
lncRNA 长链非编码 RNA 长度超过二百碱基、不编码蛋白的转录本
pseudogene 假基因 失去编码能力的基因拷贝
cell line 细胞系 体外长期培养的细胞群体
organoid 类器官 三维培养的微型组织结构
Cellosaurus 细胞系资源库 细胞系名称与来历的标准化参考
DepMap 依赖性图谱 提供细胞系组织与依赖性数据
GEO 基因表达综合库 NCBI 的公共表达数据归档
ENA 欧洲核苷酸档案 存原始测序文件的公共库
edgeR 差异分析软件 基于负二项模型的差异检验工具
RSEM 定量软件 转录本水平的表达定量工具
STAR 比对软件 把测序读段比对到参考基因组
CC BY 4.0 知识共享署名 4.0 允许商用,需署名
CC BY-NC 4.0 知识共享署名非商业 4.0 不允许商用

附录 A:核心数字核对表

项 值 来源 来源层级
研究数 59 论文正文与 study_metadata 行数 官方页面 / 数据包
比较集数 86 论文正文 论文摘要
样本数 669 论文正文与 sample_metadata 行数 官方页面 / 数据包
细胞系数 57 论文正文与 Cell_type 去重 论文摘要 / 数据包
时间点数 40 论文正文 论文摘要
剂量水平数 27 论文正文 论文摘要
基因型数 26 论文正文 论文摘要
注释基因数 六万一千余 gene_annotations 行数 数据包
蛋白编码基因 两万余 gene_annotations 计数 数据包
lncRNA 条数 一万七千余 gene_annotations 计数 数据包
datasets 行数 185 datasets.tsv 行数 数据包
无对照行数 56 No_of_controls 计数 数据包
表达矩阵大小 约 1.26 GB Zenodo 文件元数据 官方页面
差异表行数 139 万余 Zenodo 文件行数 数据包
表达矩阵行数 272 万余 Zenodo 文件行数 数据包
差异表大小 88 MB Zenodo 文件元数据 官方页面
发布许可 CC BY 4.0 Zenodo 元数据 官方页面
网站数据库当前条数 未核实 动态渲染,无法静态取得 未核实

附录 B:数字的来源分层

官方页面(Zenodo 记录、论文全文 XML、网站 HTTP 响应):七个文件的大小与行数、样本的物种分布、datasets.tsv 的字段计数、Cell_group 分布、无对照行数、许可声明。这一层的数字可以直接引用,只需注明日期。

论文摘要与正文:59 项研究、86 个比较集、669 个样本、57 个细胞系、40 个时间点、27 个剂量水平、26 种基因型、四类应激的剂量区间。这一层的数字来自作者叙述,未逐项与原始数据核对,可能与数据包存在口径差。

未核实:网站当前数据库条数、网站是否按月更新、差异表 p 值是否已校正、GitHub 仓库最近提交时间。这几项在正文中都标了未核实,使用前建议自行确认。

附录 C:完整参考文献

编号 引用 链接
1 Tsifintaris M, et al. ASTRA: a comprehensive resource of stress-induced transcriptional activity in human cell lines. Nucleic Acids Res. 2026;54(D1):D938–D948. https://doi.org/10.1093/nar/gkaf1174
2 ASTRA 数据包(2025-07-14 版) https://doi.org/10.5281/zenodo.15885686
3 ASTRA 网站 https://astra-db.com/
4 ASTRA 源码仓库 https://github.com/Mtsif/astra-db
5 Barrett T, et al. NCBI GEO: archive for functional genomics data sets—update. Nucleic Acids Res. 2013;41:D991–D995. https://doi.org/10.1093/nar/gks1193
6 Bairoch A. The Cellosaurus, a cell-line knowledge resource. J Biomol Tech. 2018;29:25–38. https://doi.org/10.7171/jbt.18-2902-002
7 Martin M. Cutadapt removes adapter sequences from high-throughput sequencing reads. EMBnet J. 2011;17:10–12. https://doi.org/10.14806/ej.17.1.200
8 Giannakakis A, et al. Contrasting expression patterns of coding and noncoding parts of the human genome upon oxidative stress. Sci Rep. 2015;5:9737. https://doi.org/10.1038/srep09737

附录 D:核验关键词与地点

核验按七步推进。在候选清单 TOP2000 里,astra 一行被归在“组学-其他”;用 ASTRA database 在 Europe PMC 检索得九条,多为附带提及;用 TITLE:ASTRA AND database 检索得十条,含本库论文与若干同名资源;用 Brassica ASTRA 检索命中 2005 年芸薹属基因组库,因站点已不可用而排除;用 ASTRA database AND alternative splicing 检索得两条,均未指向可用实体;对 astra-db.com 做 HTTP 探活返回 200,确认为 Streamlit 应用;对 Zenodo DOI 10.5281/zenodo.15885686 取元数据,得到七个文件与 CC BY 4.0 许可。

附录 E:如果只记五件事

序号 要记住的事
1 它只收四类应激、每类一个应激源,范围窄但有纵深
2 比较集是它的核心单位,一处理对一对照,样本很小
3 它的增量是“统一流程加重算”,不是新测数据
4 差异表只有原始 p 值,校正要自己做
5 Zenodo 七张扁平表比网站更可靠,版本要锁定

编辑说明

本篇的实体核验于 2026-10-27 完成。同名候选包括 Brassica ASTRA 基因组库、ASTRA 蛋白复合体、甲状腺癌 ASTRA 试验、SOLARIS 同步辐射光束线、AStra 听力量表,均与生物医学可查询数据集不符,最终定位到 https://astra-db.com/ 与 NAR 2026 论文。

数字来源分三层:Zenodo 文件元数据与五个小表的实际行数为第一层;论文摘要与正文叙述为第二层;网站动态内容未能静态取得,标为未核实。数据包快照为 2025-07-14 版,若日后版本更新,研究数、比较集数与样本数以新版为准。

正文未覆盖的内容包括:网站三个分析模块的交互细节、edgeR 差异分析的具体参数设置(论文未逐一列出)、源代码仓库的当前状态。这几项若需深入,应直接访问网站与源码。以上核查记录来源于本篇的派发材料与公开接口响应,不构成对第三方数据的独立审计。


相关数据集导航

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

  • geo — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • fantom5 — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • gencode — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • recount3 — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • archs4 — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • ddbj-gea — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • gtex-legacy — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • gtex — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • tcga-luad — 共享标签:基因组学与多组学 / 转录组 / 测序数据
  • cellxgene-census — 共享标签:基因组学与多组学 / 转录组 / 测序数据

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

返回 AI-Ready 数据集