结构变异(SV)的矩阵化与基因家族层面的信息熵分析。
SVDomainEntropy
00 Remarks
分析思路(参考 sv_entropy.md):
- 把SV结构变异的结果组织成两个矩阵:行是基因家族、列是基因组, 矩阵元素分别是该家族在该基因组之中的 SV CopyNumber 与 SV Median;
- 对矩阵的每一行计算香农信息熵:CopyNumber 熵衡量该家族的拷贝数 在各个基因组之间的多样性(分布均匀性),Median 熵衡量其结构特征的离散程度;
- 以这两个信息熵作为坐标绘制散点图,并且使用 KMeans 划分出具有不同演化特征的 基因家族类群(对应"僵化保守型/剂量调谐型/混沌快速进化型/结构微调型"四类象限)。
只有存在SV事件的基因家族才会进入矩阵(共线性断裂这一类没有家族归属的事件会被排除), 同时按照 sv_entropy.md 的建议,在聚类之前过滤掉出现频率过低(默认低于5%)的家族, 并对两个信息熵做 Z-score 标准化,避免方差大的维度主导聚类结果。
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| GetSVMatrices | 1 | 获取SV结构变异的 CopyNumber / Median 矩阵(缓存为空的时候惰性重建) |
| BuildSVMatrices | 1 | 由结构变异事件构建 SV CopyNumber / Median 矩阵 |
| GetSVEntropy | 1 | 获取SV信息熵散点图与聚类结果(缓存为空的时候惰性计算) |
| BuildSVEntropy | 1 | 计算SV矩阵的信息熵散点图数据并且做KMeans聚类 |
| RunKMeans | 1 | 执行KMeans聚类,并且把簇编号按照簇中心的位置重排为确定性的顺序 |
| ClusterMean | 1 | 计算簇在指定维度上面的均值 |
| QuadrantLabel | 1 | 根据两个信息熵的"高/低"位置给出四象限进化模型的解读名称(参考 sv_entropy.md) |
| EntropyOfCounts | 1 | 按"各基因组拷贝数占比"的离散概率分布计算香农信息熵(自然对数) |
| EntropyOfCategories | 1 | 以取值的精确大小作为离散类别统计频率,计算香农信息熵(自然对数) |
| ZScores | 1 | 计算 Z-score 标准化之后的数值序列 |
03 Fields
| Name | Overloads | Summary |
|---|---|---|
| MinPresenceFrequency | 2 | 参与聚类分析的最低出现频率:某个家族存在SV事件的基因组比例低于这个值的时候, 认为该家族的数据过于稀疏、信息熵容易受到噪声干扰,因此不参与聚类 (参考 sv_entropy.md 的实施建议) |
| DefaultClusterCount | 2 | KMeans 聚类的默认簇数:对应 sv_entropy.md 之中的四类进化模式象限 |
| CopyNumberEntropyLabel | 1 | 散点图X轴标题 |
| MedianEntropyLabel | 1 | 散点图Y轴标题 |
04 Members
获取SV结构变异的 CopyNumber / Median 矩阵(缓存为空的时候惰性重建)
矩阵可以完全由分析结果之中的结构变异事件与基因组列表确定性地重建出来, 因此没有写入归档文件;在基因组数量非常多的时候这两个矩阵会占用比较大的内存, 所以只在真正需要(生成报告、导出表格)的时候才构建一次并缓存下来。
| Name | Type | Description |
|---|---|---|
result | PanGenomeResult | 泛基因组分析结果 |
由结构变异事件构建 SV CopyNumber / Median 矩阵
行只包含"至少存在一个SV事件"的基因家族,列是全部基因组。 已验证在真实的结构变异事件之中,同一个 家族x基因组 最多只会有一条记录 (PAV_Absence / PAV_Presence / CNV_Gain|Loss 三类判定互斥),因此矩阵是良定义的。
| Name | Type | Description |
|---|---|---|
result | PanGenomeResult | 泛基因组分析结果 |
Int32)获取SV信息熵散点图与聚类结果(缓存为空的时候惰性计算)
如果结果对象之中已经存在缓存,则直接返回缓存(此时k会被忽略), 这样子可以保证报告页面与外部脚本拿到的是完全同一份聚类结果。
| Name | Type | Description |
|---|---|---|
result | PanGenomeResult | 泛基因组分析结果 |
k | Int32 | KMeans 的簇数 |
Int32)计算SV矩阵的信息熵散点图数据并且做KMeans聚类
任何数据不足(没有SV事件、有效家族数量不足)或者聚类失败的情况都会返回一个空数据集, 由前端显示"数据不可用",保证SV熵分析不会导致整个报告生成流程失败。
| Name | Type | Description |
|---|---|---|
result | PanGenomeResult | 泛基因组分析结果 |
k | Int32 | KMeans 的簇数(默认4) |
List(Of SVDomainEntropyPoint), Int32, List(Of SVEntropyCluster))执行KMeans聚类,并且把簇编号按照簇中心的位置重排为确定性的顺序
KMeans 的初始聚类中心是随机选取的(RandomExtensions.seeds 是按照时间播种的),因此每一次运行得到的簇编号都可能不一样。 这里在聚类完成之后按照簇中心在标准化空间之中的 (zCopyNumber, zMedian) 位置 做一次确定性的重排,保证同一份数据多次运行得到的簇编号是稳定可复现的, 报告页面与导出的CSV表格因此不会在重跑之后发生标签漂移。
| Name | Type | Description |
|---|---|---|
points | List(Of SVDomainEntropyPoint) | 参与聚类的基因家族数据点 |
k | Int32 | 簇数 |
clusters | List(Of SVEntropyCluster) | 输出的簇摘要 |
KMeansCluster(Of SVEntropyEntity), Int32)计算簇在指定维度上面的均值
Boolean, Boolean)根据两个信息熵的"高/低"位置给出四象限进化模型的解读名称(参考 sv_entropy.md)
| Name | Type | Description |
|---|---|---|
highCopyNumber | Boolean | 该簇的 CopyNumber 熵是否高于整体平均 |
highMedian | Boolean | 该簇的 Median 熵是否高于整体平均 |
Double())按"各基因组拷贝数占比"的离散概率分布计算香农信息熵(自然对数)
p_i = CN_i / ΣCN,H = -Σ p_i * ln(p_i)。
熵越高说明该基因家族的拷贝数在各个基因组之间的差异越大(经历了频繁的拷贝数扩张/收缩); 熵越低说明其拷贝数在群体之中非常一致(剂量受到严格的纯化选择)。
取值为0的列不会影响结果:它们的 p 都是0,既不参与求和也不会改变其它列的概率。
| Name | Type | Description |
|---|---|---|
row | Double() | 某一行SV CopyNumber矩阵的数值(列=基因组) |
Double())以取值的精确大小作为离散类别统计频率,计算香农信息熵(自然对数)
本项目之中的 Median 是"拷贝数中位数",取值是很小的离散值(0/1/2/3...)而不是bp长度, 因此不需要像 sv_entropy.md 之中建议的那样先做分箱,直接使用精确取值作为类别即可。
行内为0的单元格表示该基因组没有对应的SV事件,它同样是一种"结构状态", 因此这里会把0也作为一个离散类别参与频率统计。
注意:在当前的结构变异数据模型之中,同一个基因家族的所有SV事件共享同一个 Median 值(Median 是"该家族在有SV事件的基因组之中的拷贝数中位数",是家族级别的常量), 因此这一行的取值实际上只有 {0, median} 两种,Median 熵刻画的是 "SV 状态在各个基因组之间分布的均衡程度":
- 熵越高 -> 该家族的SV事件既不是普遍存在、也不是普遍缺失(高度多态);
- 熵越低 -> 该家族的SV状态在所有基因组之中高度一致(几乎全部有、或者几乎没有)。
如果后续在SV检出的上游把每个基因组各自的SV尺寸/断裂点记录下来, 这个熵就会退化为 sv_entropy.md 之中所描述的"结构特征的离散程度",无需修改本模块。
| Name | Type | Description |
|---|---|---|
row | Double() | 某一行SV Median矩阵的数值(列=基因组) |
Double())计算 Z-score 标准化之后的数值序列
当标准差为0(全部取值相同、或者只有一个样本)的时候直接返回全0的序列,避免除零。
| Name | Type | Description |
|---|---|---|
values | Double() | 原始数值 |
参与聚类分析的最低出现频率:某个家族存在SV事件的基因组比例低于这个值的时候, 认为该家族的数据过于稀疏、信息熵容易受到噪声干扰,因此不参与聚类 (参考 sv_entropy.md 的实施建议)
KMeans 聚类的默认簇数:对应 sv_entropy.md 之中的四类进化模式象限
散点图X轴标题
散点图Y轴标题