GEARS:基于图神经网络的基因表达调控网络虚拟扰动实验
GEARS
00 Remarks
本类是整个算法的门面(facade),把 readme 中的五个步骤串联为一条完整的实验流水线:
- Step 1:由先验调控网络 GEARS.priorNetwork 构建基因-基因调控图(GeneRegulatoryGraph);
- Step 2:以 control 基线表达 + 基因身份嵌入 + 扰动标记 + 扰动集合向量构成初始节点特征;
- Step 3:多层边类型感知消息传递,让扰动信号沿调控边向下游级联传播;
- Step 4:解码器输出 Δ表达,预测
x̂^pert = x^input + Δx̂; - Step 5:用(仿真或实测的)Perturb-seq 样本做监督训练,之后即可泛化到未见过的扰动。
使用方式:
Dim gears As New GEARS(exprData, priorNetwork)
Dim ko = gears.KnockoutGene("codY")
Dim combo = gears.PredictCombination({"codY", "luxR"}, InterventionMode.Knockout)
本类实现了 InsilicoPerturbationExperiment 接口, 因此可以与 BNLearn 中已有的贝叶斯网络虚拟扰动实现互换使用。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| .ctor | 2 | 创建 GEARS 虚拟扰动实验 |
| SelectBaselineSamples | 1 | 选取用于估计 control 基线的样本列索引 |
| ComputeBaseline | 2 | 用构造时选定的样本集合估计 control 基线 |
| GenerateTrainingSamples | 1 | 用内置仿真器生成伪 Perturb-seq 训练样本 |
| BuildPerturbationCandidates | 1 | 构建可作为扰动目标的候选基因列表(转录因子优先) |
| NewGeneSpec | 1 | 构造一个干预定义 |
| SetTrainingSamples | 2 | Set Perturb-seq training sample from a given gene expression matrix |
| BuildGeneRowMap | 1 | 建立「基因名 → 表达矩阵行索引」的映射,并校验 GEARS 所需的基因全部存在 |
| BuildSampleIndex | 2 | 建立「样本列名 → 列索引」的映射 |
| ResolveSampleColumns | 1 | 把一组样本列名解析为矩阵列索引,任一列名不存在时抛出友好异常 |
| ResolvePerturbedGenes | 1 | 从样本信息对象中解析出被扰动基因集合与干预模式 |
| ParseInterventionMode | 1 | 把文本解析为 InterventionMode 枚举 |
| SyncBaselineSamples | 1 | 当 control 列名同时存在于主表达矩阵时,同步更新基线样本索引 |
| Save | 1 | Save current model as zip file |
| Load | 1 | Load model from a zip file |
| ToExpressionMatrix | 1 | 把内部的基因表达数据还原为 Matrix 对象 |
| PackBaseline | 1 | 把野生型均值与标准差打包为单个向量,便于写入一个 zip 条目 |
| RestoreBaseline | 1 | 从打包向量中还原野生型均值与标准差 |
| Train | 1 | 训练 GNN 模型 |
| Predict | 1 | 执行一次(组合)虚拟扰动预测 |
| CreateUndefinedResult | 1 | 构造「目标基因不存在、未执行虚拟扰动」的降级结果 |
| KnockoutGene | 1 | 虚拟基因敲除:把目标基因表达置为 0,预测全网络的级联响应 |
| OverexpressGene | 1 | 虚拟基因过表达:把目标基因表达提升到 control 均值 + 3 倍标准差 |
| KnockDownGene | 1 | 虚拟基因下调:把目标基因表达降低到 control 均值 − 2 倍标准差 |
| PredictWithBaseline | 1 | 单次预测的便捷入口(可临时指定用于估计基线的样本数量) |
| RecomputeBaseline | 1 | 使用指定数量的样本重新估计 control 基线(原地修改 GEARS.WildtypeMeans 与 GEARS.WildtypeSDs) |
| PredictCombination | 1 | 组合扰动预测:同时扰动多个基因,捕捉非加性的协同/拮抗效应 |
| BatchPerturbation | 1 | 批量执行虚拟扰动 |
| ToString | 1 | 输出实验配置与结果的摘要 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| GraphData | 1 | 基因调控图 |
| Model | 1 | GNN 模型 |
| GeneNames | 1 | 基因名称列表(顺序与表达矩阵行序一致) |
| WildtypeMeans | 1 | control(野生型)表达均值 |
| WildtypeSDs | 1 | control(野生型)表达标准差,用于归一化、Z-score 与显著性判定 |
| Options | 1 | 当前实验使用的超参配置 |
| TrainingSamples | 1 | 训练样本集合(默认由内置仿真器生成,可用实测数据覆盖) |
| LossCurve | 1 | 最近一次训练得到的损失曲线(每个 epoch 的平均 MSE) |
| Trainer | 1 | 训练器实例;尚未训练时为 Nothing |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| exprData | 1 | 基因表达数据(行=基因,列=样本) |
| priorNetwork | 1 | 先验调控网络 |
| config | 1 | 超参配置 |
| baselineSamples | 1 | 用于估计 control 基线所选取的样本列索引 |
| metadata_perturbed_genes | 1 | SampleInfo.metadata 中记录「本样本被扰动了哪些基因」的键名 |
| metadata_intervention_mode | 1 | SampleInfo.metadata 中记录「本样本使用哪种干预模式」的键名 |
05 Members
创建 GEARS 虚拟扰动实验
| Name | Type | Description |
|---|---|---|
expression | GeneExpressionData | 基因表达数据(行=基因,列=样本) |
prior | PriorNetwork | 先验调控网络 |
gearsConfig | GEARSConfig | 超参配置;为 Nothing 时使用默认配置 |
nSamples | Int32 | 用于估计 control 基线(均值/标准差)的样本数量; 小于等于 0 或大于总样本数时使用全部样本 |
创建 GEARS 虚拟扰动实验(直接由表达矩阵构造)
| Name | Type | Description |
|---|---|---|
matrix | Matrix | 表达矩阵(行=基因,列=样本) |
prior | PriorNetwork | 先验调控网络 |
gearsConfig | GEARSConfig | 超参配置;为 Nothing 时使用默认配置 |
nSamples | Int32 | 用于估计 control 基线的样本数量;0 表示使用全部样本 |
Int32)选取用于估计 control 基线的样本列索引
| Name | Type | Description |
|---|---|---|
nSamples | Int32 | 请求的样本数量 |
样本列索引数组
用构造时选定的样本集合估计 control 基线
Int32())用指定的样本集合估计 control 条件下每个基因的表达均值与标准差
| Name | Type | Description |
|---|---|---|
sampleIdx | Int32() | 参与统计的样本列索引 |
用内置仿真器生成伪 Perturb-seq 训练样本
优先挑选在先验网络中作为转录因子出现的基因(它们拥有下游靶基因, 扰动效应更容易在网络中传播),数量不足时再用其余基因补齐。
生成的样本数量
构建可作为扰动目标的候选基因列表(转录因子优先)
基因名列表
String, InterventionMode)构造一个干预定义
| Name | Type | Description |
|---|---|---|
geneName | String | 目标基因名 |
mode | InterventionMode | 干预模式 |
干预定义对象
IEnumerable(Of PerturbSeqSample))注入外部的真实 Perturb-seq 训练样本(覆盖内置仿真样本)
| Name | Type | Description |
|---|---|---|
samples | IEnumerable(Of PerturbSeqSample) | 实测扰动样本集合 |
Matrix, String(), SampleInfo())Set Perturb-seq training sample from a given gene expression matrix
| Name | Type | Description |
|---|---|---|
samples | Matrix | 基因表达矩阵对象 |
control | String() | 基线样本名称列表,计算出mean/sd作为共享野生型基线 |
perturbed | SampleInfo() | 扰动后的样本名称列表,每一个 |
Matrix)建立「基因名 → 表达矩阵行索引」的映射,并校验 GEARS 所需的基因全部存在
| Name | Type | Description |
|---|---|---|
samples | Matrix | 表达矩阵 |
基因名到行索引的映射(大小写不敏感)
Matrix)建立「样本列名 → 列索引」的映射
| Name | Type | Description |
|---|---|---|
samples | Matrix | 表达矩阵 |
列名到列索引的映射(大小写不敏感)
String())建立「样本列名 → 列索引」的映射
| Name | Type | Description |
|---|---|---|
sampleNames | String() | 样本名数组 |
列名到列索引的映射(大小写不敏感)
Matrix, String(), String)把一组样本列名解析为矩阵列索引,任一列名不存在时抛出友好异常
| Name | Type | Description |
|---|---|---|
samples | Matrix | 表达矩阵 |
names | String() | 样本列名 |
paramName | String | 抛异常时使用的参数名 |
列索引数组
SampleInfo, InterventionMode)从样本信息对象中解析出被扰动基因集合与干预模式
解析优先级:
- 基因集合:
metadata[metadata_perturbed_genes]的 JSON 数组 → 回退到从样本 ID 解析; - 干预模式:
metadata[metadata_intervention_mode]→ 回退到样本 ID 的模式后缀 → 默认InterventionMode.Knockout。
| Name | Type | Description |
|---|---|---|
info | SampleInfo | 样本信息对象 |
mode | InterventionMode | 解析得到的干预模式;无法识别时保持调用方传入的默认值 |
被扰动基因名数组;解析失败返回 Nothing
String, InterventionMode)把文本解析为 InterventionMode 枚举
| Name | Type | Description |
|---|---|---|
text | String | 原始文本,大小写不敏感,支持 ko / kd / oe 等简写 |
mode | InterventionMode | 解析得到的枚举值 |
解析成功返回 True,否则返回 False
String())当 control 列名同时存在于主表达矩阵时,同步更新基线样本索引
保持 GEARS.baselineSamples 与新的野生型基线同一口径, 使 GEARS.RecomputeBaseline() 与接口方法的 nSamples 分支行为一致。
| Name | Type | Description |
|---|---|---|
control | String() | control 样本列名 |
Stream)Save current model as zip file
zip 包内包含 manifest.json、prior.csv、expression.bin、 baseline.bin、model.bin 五个条目,完整保存配置、先验网络、表达矩阵、 图结构(按同样入参重建)、模型参数、基线与损失曲线,加载后可继续训练。
| Name | Type | Description |
|---|---|---|
file | Stream | 目标可写流;调用方负责其生命周期,本方法不会关闭它 |
Stream)Load model from a zip file
| Name | Type | Description |
|---|---|---|
file | Stream | zip 包的可读流;调用方负责其生命周期,本方法不会关闭它 |
还原出来的 GEARS 实例,其推理结果与保存前一致,且可继续训练
把内部的基因表达数据还原为 Matrix 对象
表达矩阵(行=基因,列=样本)
把野生型均值与标准差打包为单个向量,便于写入一个 zip 条目
长度为 2×基因数 的向量,前一半为均值,后一半为标准差
Double())从打包向量中还原野生型均值与标准差
| Name | Type | Description |
|---|---|---|
packed | Double() | 长度为 2×基因数 的向量 |
训练 GNN 模型
训练样本;为 Nothing 时使用 GEARS.TrainingSamples若为空则先调用 GEARS.GenerateTrainingSamples() 生成)
损失曲线
IEnumerable(Of InterventionSpec))执行一次(组合)虚拟扰动预测
预测流程:先按 InterventionSpec.GetInterventionValue() 把被扰动基因的表达 改写为干预值(这一步是扰动信号进入网络的"入口"),再交给 GNN 预测全网络的 Δ 响应。
| Name | Type | Description |
|---|---|---|
specs | IEnumerable(Of InterventionSpec) | 干预定义集合;单个元素为单基因扰动,多个元素为组合扰动 |
干预分析结果
InterventionSpec)构造「目标基因不存在、未执行虚拟扰动」的降级结果
| Name | Type | Description |
|---|---|---|
spec | InterventionSpec | 干预定义 |
所有变化量均为 0 的结果对象,其 InterventionResult.Undefined 为 True
String, Int32)虚拟基因敲除:把目标基因表达置为 0,预测全网络的级联响应
| Name | Type | Description |
|---|---|---|
geneName | String | 目标基因名 |
nSamples | Int32 | 用于估计 control 基线的样本数量;0 表示使用全部样本 |
干预分析结果
String, Int32)虚拟基因过表达:把目标基因表达提升到 control 均值 + 3 倍标准差
| Name | Type | Description |
|---|---|---|
geneName | String | 目标基因名 |
nSamples | Int32 | 用于估计 control 基线的样本数量;0 表示使用全部样本 |
干预分析结果
String, Int32)虚拟基因下调:把目标基因表达降低到 control 均值 − 2 倍标准差
| Name | Type | Description |
|---|---|---|
geneName | String | 目标基因名 |
nSamples | Int32 | 用于估计 control 基线的样本数量;0 表示使用全部样本 |
干预分析结果
String, InterventionMode, Int32)单次预测的便捷入口(可临时指定用于估计基线的样本数量)
| Name | Type | Description |
|---|---|---|
geneName | String | 目标基因名 |
mode | InterventionMode | 干预模式 |
nSamples | Int32 | 基线样本数量;小于等于 0 时沿用构造时确定的基线 |
干预分析结果
Int32)使用指定数量的样本重新估计 control 基线(原地修改 GEARS.WildtypeMeans 与 GEARS.WildtypeSDs)
| Name | Type | Description |
|---|---|---|
nSamples | Int32 | 样本数量 |
IEnumerable(Of String), InterventionMode)组合扰动预测:同时扰动多个基因,捕捉非加性的协同/拮抗效应
| Name | Type | Description |
|---|---|---|
geneNames | IEnumerable(Of String) | 同时扰动的基因名集合 |
mode | InterventionMode | 干预模式,默认敲除 |
干预分析结果
IEnumerable(Of String), InterventionMode)批量执行虚拟扰动
| Name | Type | Description |
|---|---|---|
geneNames | IEnumerable(Of String) | 待扰动的基因名集合 |
mode | InterventionMode | 干预模式,默认敲除 |
每个基因对应的干预分析结果
输出实验配置与结果的摘要
多行摘要文本
基因调控图
GNN 模型
GEARSModel 实例
基因名称列表(顺序与表达矩阵行序一致)
基因名数组
control(野生型)表达均值
可写:GEARS.SetTrainingSamples() 会用显式指定的 control 列 重算并覆盖它;GEARS.Load() 则从 zip 包中还原保存时的取值。
每个基因的表达均值
control(野生型)表达标准差,用于归一化、Z-score 与显著性判定
可写,语义同 GEARS.WildtypeMeans。
每个基因的表达标准差
当前实验使用的超参配置
返回的是实际生效的配置对象引用,读取其中的字段是安全的; 一般不建议在训练中途修改,但允许在重新训练前调整轮数、学习率等参数。 (VB 标识符不区分大小写,故不能与私有字段 config 同名,这里取名为 Options。)
GEARSConfig 实例
训练样本集合(默认由内置仿真器生成,可用实测数据覆盖)
训练样本列表
最近一次训练得到的损失曲线(每个 epoch 的平均 MSE)
损失数组;尚未训练时为空数组
训练器实例;尚未训练时为 Nothing
GEARSTrainer 实例
基因表达数据(行=基因,列=样本)
先验调控网络
超参配置
用于估计 control 基线所选取的样本列索引
该字段不是只读的:GEARS.SetTrainingSamples() 指定了显式的 control 列名后会更新它,从而让 GEARS.RecomputeBaseline() 与接口方法的 nSamples 分支 与新的野生型基线保持同一口径。
SampleInfo.metadata 中记录「本样本被扰动了哪些基因」的键名
对应值是一个 JSON 字符串数组,例如 ["codY","luxR"]。
SampleInfo.metadata 中记录「本样本使用哪种干预模式」的键名
对应值为 InterventionMode 的枚举名(大小写不敏感),例如 Knockout、Knockdown、 Overexpression、Custom。缺失时回退到从样本 ID 的后缀解析,仍解析不出则取 InterventionMode.Knockout。