想象你坐在维也纳金色大厅里,一支交响乐团正在演奏。小提琴声部如丝绸般顺滑,管乐组磅礴而出,打击乐在尾音处轻声点缀。作为乐评人,你要写的不是某个声部的独奏评价,而是整支乐团如何共同演绎作品——哪些旋律是所有声部共同推进的主旋律?哪一段是单簧管独奏的华彩段?每个声部对主旋律的贡献又有多大?这正是多组学因子分析(MOFA)在做的事。生物学家手里握着同一批病人的多类分子数据——转录组、甲基化、蛋白组——就像乐团的一个个声部。MOFA 像一位敏锐的乐评人,从这片嘈杂的交响中分离出“共享因子”(各声部共同演奏的主旋律)和“特异因子”(独门声部的华彩段),并告诉你每个基因分子在每条旋律里的贡献权重。这篇文章就用这场音乐会的比喻,带你拆解 MOFA 与 MOFA+ 的模型设定、因子解释、组学权重与稀疏约束,让你听懂隐藏在生物数据背后的旋律。

岗位关联

职业价值:掌握 MOFA 与 MOFA+ 的原理,你就拿到了多组学整合分析的钥匙——在精准医疗与生物信息学岗位上,能用共享/特异因子一眼看穿复杂数据背后的关键驱动机制,让分析结论直击要点。

目录
  1. 可视化演示
  2. 多组学背景
  3. MOFA模型理论
  4. 模型参数设定
  5. 因子解释方法
  6. 组学权重解析
  7. 稀疏约束机制
  8. MOFA+扩展
  9. 设计权衡取舍
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示多组学数据整合流程、贝叶斯因子分解模型、ARD稀疏权重约束热力图及MOFA与MOFA+版本功能对比,含星座网络背景和发光动画。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多组学背景

想象乐团里的小提琴、管乐与打击乐同时发声。如果只录下小提琴轨,你会漏掉管乐与打击乐之间的呼应;只有同时倾听全团,才能理解整首作品。多组学数据正是如此——同一批肿瘤病人的组织样本,既测了转录组(RNA 表达)、又测了甲基化谱与蛋白组。每种数据都像乐团的一个声部,虽然量纲、噪声和特征维度都不同,但它们毕竟来自同一批组织,必然受同一套生物学程序驱动。

于是,声部之间出现了“协同变异”:癌基因激活时,往往同时在 RNA 层面看到表达上调、在蛋白层面看到蛋白丰度增加、在甲基化层面看到调控区域甲基化异常。这种跨组学联动就是分析的核心对象。传统做法是把每个组学单独建模,相当于只听单一声部,会错过重要的协变信号;而把所有组学直接拼接成一个超长矩阵,又会让量纲差异最大的那个组学主导模型。MOFA 的处理方式是:让所有组学共享一个低维的“因子得分矩阵”,再给每个组学配备独立的“载荷矩阵”,从而既保留共性又兼顾个性。

Xg=WgZ⊤+Eg,g=1,2,…,GX_{g} = W_{g} Z^{\top} + E_{g}, \quad g = 1, 2, \dots, G

1. X_g 数据矩阵:第 g 个组学的观测数据,n 行代表样本、p_g 列代表特征(如基因或甲基化位点),是乐评人听到的“声部原声”。

Xg∈Rn×pgX_{g} \in \mathbb{R}^{n \times p_{g}}

2. Z 因子得分矩阵:n × K 的潜变量矩阵,所有组学共享,代表每个样本在 K 条“旋律线”上的坐标,是隐藏在主旋律中的样本差异。

Z∈Rn×KZ \in \mathbb{R}^{n \times K}

3. W_g 载荷矩阵:K × p_g 的载荷矩阵,决定第 g 个组学如何由 K 条旋律线性叠加而成,相当于“每个声部对每条旋律的演奏音量”。

Wg∈RK×pgW_{g} \in \mathbb{R}^{K \times p_{g}}

4. E_g 噪声残差:捕获各组学独立的测量噪声与生物学特异波动,是乐谱之外的即兴杂音。

Eg∈Rn×pgE_{g} \in \mathbb{R}^{n \times p_{g}}

回到乐团:MOFA 不是把三个声部的录音简单叠在一起,而是先承认“大家共同演绎了主旋律”,再允许每个声部有自己的独奏片段。这样,后续的因子解释与分子筛选才有了清晰的对象。

MOFA模型理论

乐评人该怎么拆解一场演出?他不会逐秒记录每个音符,而是抓住几条反复出现的旋律线索。MOFA 的建模思路如出一辙:把庞大的多组学矩阵压缩成 K 个因子,每个样本在这 K 个因子上都有自己的“坐标”,称为因子得分。某个样本在因子得分上接近,就说明它在对应的生物学程序上状态相似。

因子得分矩阵 Z 是全体组学共享的,因为样本是同一样的;但每个组学对因子的响应方式不同,于是 MOFA 为第 g 个组学设置独立的载荷矩阵 W_g。载荷值衡量“因子 k 对特征 j 的影响强度”。例如调控代谢的共享因子,在转录组的某些代谢酶基因上载荷很高,在甲基化组的启动子区域载荷可能相对温和,这正体现了不同分子层对同一程序的响应差异。

xij=∑k=1Kzikwkj+εijx_{ij} = \sum_{k=1}^{K} z_{ik} w_{kj} + \varepsilon_{ij}

1. x_ij 观测值:第 i 个样本第 j 个特征的表达量,例如病人 i 的基因 j 的 RNA 丰度。

xij∈Rx_{ij} \in \mathbb{R}

2. z_ik 因子得分:样本 i 在因子 k 上的投影,描述“这个样本离主旋律 k 有多近”。

zik∈Rz_{ik} \in \mathbb{R}

3. w_kj 载荷系数:因子 k 对特征 j 的贡献强度,相当于旋律线 k 在乐器 j 上的音量大小。

wkj∈Rw_{kj} \in \mathbb{R}

4. 残差 ε_ij:模型未能解释的部分,来自噪声或独立于因子的生物波动。

εij∼N(0,σg2)\varepsilon_{ij} \sim \mathcal{N}(0, \sigma_{g}^{2})

理解拆解之后,你会明白 MOFA 的优势:因子是“共享”的,所以不同组学的信息被拉到同一坐标系下比较;载荷是“独立”的,所以每个分子层保留了自身的响应特色。这就是“共享潜变量 + 独立载荷”的巧妙之处。

模型参数设定

乐评人下笔前要确定写几条旋律线索:太多,点评变得支离破碎;太少,又遗漏重要主题。模型设定阶段要回答同样的问题——先验怎么选、方差怎么分、因子数 K 取几。MOFA 采用概率框架,假设观测值由因子信号叠加高斯噪声生成。对载荷 W_g 施加零均值高斯先验,相当于在写乐评前“默认每个乐器与旋律关系不大”,除非数据给出强证据,否则权重不会轻易离开零。

方差分解是理解因子解释力的关键。整体变异同时包含“因子信号”和“噪声”两部分。若某个因子能解释某组学的大部分方差,说明它是该组学的重要驱动者;若所有因子加起来只能解释很小比例,说明这个组学与共享程序关系微弱。因子数 K 通常通过“方差解释率曲线”确定:绘制 K 从 1 到最大值时总解释方差的变化曲线,寻找拐点——曲线由陡变缓的位置,就是主旋律与杂音的边界。

Var(Xg)=∑k=1KVar(wgkzk)+Var(Eg)\text{Var}(X_{g}) = \sum_{k=1}^{K} \text{Var}(w_{g k} z_{k}) + \text{Var}(E_{g})

1. 方差分解含义:左侧是第 g 个组学的整体变异,右侧第一项是所有因子贡献之和,第二项是噪声残留。

Var(Xg)=Var(WgZ⊤)⏟因子信号+Var(Eg)⏟噪声\text{Var}(X_{g}) = \underbrace{\text{Var}(W_{g} Z^{\top})}_{\text{因子信号}} + \underbrace{\text{Var}(E_{g})}_{\text{噪声}}

2. 单个因子项:因子 k 的方差贡献由载荷 w_gk 的平方与因子得分 z_k 的方差共同决定,两者越大,解释力越强。

Var(wgkzk)=wgk2⋅Var(zk)\text{Var}(w_{g k} z_{k}) = w_{g k}^{2} \cdot \text{Var}(z_{k})

3. 解释率 VAF:因子解释方差占总方差的比例,是评估因子重要性的标准尺。

VAFg=∑kwgk2Var(zk)Var(Xg)\text{VAF}_{g} = \frac{\sum_{k} w_{g k}^{2} \text{Var}(z_{k})}{\text{Var}(X_{g})}

好的模型设定就像一份详尽的乐评底稿:既不自作聪明地预设太多旋律,也不遗漏真正的主调。因子数 K 不是越大越好,而是让每条旋律都有明确意义、能稳定复现。

因子解释方法

终于到了乐评的核心段落:哪些旋律是全团的共同主题?哪些是某声部的独奏华彩?在 MOFA 中,这两种角色分别由共享因子与特异因子扮演。共享因子在多个组学上都有可观的方差贡献,例如“细胞增殖程序”在转录组与蛋白组上同步激活;特异因子则只在一个组学中显现,例如某个组织特有的甲基化修饰模式,在 RNA 层面几乎看不到对应信号。

识别方法很直观:对每个因子,分别计算它在各组学的平均载荷强度。如果多个组学的平均载荷都明显高于本底,则判为共享因子;如果只有一个组学强烈响应,其余组学接近零,则是特异因子。随后,取出每个因子载荷绝对值最高的那些特征做功能富集——比如对转录组因子取高权重基因做 GO/KEGG 通路分析,就能给这条旋律贴上“炎症应答”或“氧化磷酸化”等生物学标签。

wˉg=1pg∑j=1pg∣wgj∣\bar{w}_{g} = \frac{1}{p_{g}} \sum_{j=1}^{p_{g}} |w_{g j}|

1. 绝对值载荷:取绝对值是为了避免正负载荷相互抵消,只看实质贡献。

∣wgj∣=wgj2|w_{g j}| = \sqrt{w_{g j}^{2}}

2. 组内平均:把第 g 个组学所有特征上载荷的绝对值求平均,得到因子在该组学的整体活跃度。

wˉg=1pg∑j=1pg∣wgj∣\bar{w}_{g} = \frac{1}{p_{g}} \sum_{j=1}^{p_{g}} |w_{g j}|

3. 跨组学比较:比较 \bar{w}_1, ……, \bar{w}_G,若多个值都高则是共享因子,若只有一个高则是特异因子。

wˉ1≈wˉ2≫wˉ3⇒共享\bar{w}_{1} \approx \bar{w}_{2} \gg \bar{w}_{3} \quad \Rightarrow \quad \text{共享}

给因子命名之后,抽象的数字矩阵就变成了有生物学意义的叙事:因子 1 是“跨组学的增殖主旋律”,因子 3 是“甲基化独有的沉默华彩”。这样的解读,正是多组学整合相对单组学分析最迷人的地方。

组学权重解析

知道旋律还不够,乐评人还要点评每个声部的贡献度。组学载荷 W_g 就是这份“贡献清单”。特征 j 在因子 k 上的权重 w_kj 绝对值越大,说明该特征越直接地参与这条因子驱动的生物程序。因此,载荷权重是筛选关键分子的第一线索:对转录组数据,高权重基因常常就是该程序的核心效应分子;对甲基化数据,高权重位点往往定位在关键的调控区域。

跨组学比较权重还有额外收获。同一因子在不同组学上的载荷分布,能揭示“调控层级”的线索:如果 DNA 甲基化位点载荷高、但对应基因的转录组载荷低,说明该程序主要在表观层面调控;如果转录组和蛋白组载荷同步升高,则提示从 mRNA 到蛋白质的传递效率很高。这种跨层级的权重对比,是单组学分析永远看不到的风景。

VAFgk=∑jwgkj2∑izik2∑j∑ixgij2\text{VAF}_{g k} = \frac{\sum_{j} w_{g k j}^{2} \sum_{i} z_{i k}^{2}}{\sum_{j} \sum_{i} x_{g i j}^{2}}

1. 载荷能量:因子 k 在组学 g 上的所有载荷平方和,反映该因子在特征空间的总作用强度。

∑jwgkj2\sum_{j} w_{g k j}^{2}

2. 得分能量:因子 k 在所有样本上的得分平方和,反映该因子在样本间的区分度。

∑izik2\sum_{i} z_{i k}^{2}

3. 总体变异:组学 g 的全体数据平方和,作为归一化基准。

∑j∑ixgij2\sum_{j} \sum_{i} x_{g i j}^{2}

4. VAF_gk:两者相乘除以总变异,得到因子 k 对组学 g 的方差解释率,是分子筛选的“重要性排行榜”。

权重的意义不在数字本身,而在于它把“有没有关系”量化成了“关系有多强”。生物学家根据这份榜单,既能在海量基因里圈定少数关键分子用于后续验证,也能从跨组学载荷差异中读出深层的调控机制。

稀疏约束机制

一场演出如果所有乐器始终齐奏,听众反而什么都记不住。优秀的编曲会让每条旋律只由少数关键乐器承担,形成干净、鲜明的音色。稀疏约束正是这一思想的数学实现:它要求每个因子只由少数特征驱动,其余特征的载荷被强制压向零,从而滤除不相关的噪声特征,让因子更聚焦、更可解释。

MOFA 实现稀疏性的关键机制是 ARD(自动相关性确定)先验。每个权重 w_gkj 被赋予零均值高斯先验,但精度参数 α_gkj 由 Gamma 超先验控制。当数据不支持某个特征与因子存在关联时,α 会自适应地变得很大,反向方差 α^{-1} 趋近于零,将权重“拉”向零;反之,真正重要的特征其 α 保持在较小水平,权重得以保留。整个过程由变分推断自动完成,用户只需设定超参数,模型就在数据中自行学会“哪些乐器该闭嘴”。

wgkj∼N(0,αgkj−1),αgkj∼Gamma(a0,b0)w_{g k j} \sim \mathcal{N}(0, \alpha_{g k j}^{-1}), \quad \alpha_{g k j} \sim \text{Gamma}(a_{0}, b_{0})

1. 零均值高斯先验:权重默认围绕 0 分布,绝对值越大的权重需要越强的数据证据。

p(wgkj∣αgkj)=N(0,αgkj−1)p(w_{g k j} \mid \alpha_{g k j}) = \mathcal{N}(0, \alpha_{g k j}^{-1})

2. 精度参数 α:α 越大,对应高斯分布越窄,权重被越强地压缩到 0 附近。

αgkj→∞  ⇒  wgkj→0\alpha_{g k j} \to \infty \;\Rightarrow\; w_{g k j} \to 0

3. Gamma 超先验:α 本身也服从 Gamma 分布,模型在训练中从数据更新 α,而非人工固定。

p(αgkj)=Gamma(a0,b0)p(\alpha_{g k j}) = \text{Gamma}(a_{0}, b_{0})

4. 稀疏结果:大量 α 收敛到较大值,对应权重为零;只有少数特征保留非零载荷,构成因子的“精简编制”。

稀疏约束如同指挥家果断地让部分乐器在特定段落休止。这样处理之后,每个因子的高权重基因数量大大减少,实验验证的目标更明确,因子之间的区分度也显著提升,这就是“少即是多”的建模智慧。

MOFA+扩展

原版 MOFA 处理的是“一个时间点、一群样本”的快照。但真实研究往往是纵向追踪——同一批病人在不同治疗阶段多次采样,或来自不同组织部位。这就像乐团开启多城巡演,每个城市(时间点/分组)的演出有全场共通的曲目风格,也会因地制宜地调整华彩段。MOFA+ 正是为这种复杂设计而生。

MOFA+ 的核心扩展是:保留共享的载荷矩阵 W_g,让每个时间点或分组拥有自己的因子得分 Z^{(t)}。由于载荷跨条件共享,因子的生物学含义在时间点之间保持一致,我们就能追踪同一因子如何随着治疗进程而激活或抑制。例如,某免疫浸润因子在基线、治疗中、缓解后三个时间点的得分逐渐下降,就提示免疫信号的动态变化与疗效相关。这种“载荷不变、得分变化”的结构,让纵向多组学分析真正可行。

Xg(t)=WgZ(t)⊤+Eg(t)X_{g}^{(t)} = W_{g} Z^{(t)\top} + E_{g}^{(t)}

1. 上标 (t):代表第 t 个时间点或分组,例如治疗后第 3 个月的采样。

Xg(t)∈Rnt×pgX_{g}^{(t)} \in \mathbb{R}^{n_{t} \times p_{g}}

2. 共享载荷 W_g:载荷跨所有时间点保持相同,保证因子在时间轴上“是同一个概念”。

Wg∈RK×pgW_{g} \in \mathbb{R}^{K \times p_{g}}

3. 时序得分 Z^{(t)}:每个时间点有自己的因子得分矩阵,展示样本在该时刻的因子状态。

Z(t)∈Rnt×KZ^{(t)} \in \mathbb{R}^{n_{t} \times K}

4. 动态追踪:比较不同 t 的 z 值,即可描画因子的时间轨迹。

Δzk=zk(t2)−zk(t1)\Delta z_{k} = z_{k}^{(t_{2})} - z_{k}^{(t_{1})}

如果说 MOFA 是为单场音乐会写乐评,MOFA+ 就是为整轮巡演写长篇评论:既能识别每站共同的曲目风格,又能捕捉各站的即兴变化。这种灵活的建模方式,让多组学分析从静态描述走向动态机制研究。

设计权衡取舍

最后,任何乐评人都要面对现实限制:篇幅有限、精力有限,必须决定重点分析哪几条旋律、评价到什么深度。MOFA 的使用同样充满权衡。首先是因子数 K:K 太小会遗漏重要信号,K 太大则因子碎片化、难以解读、甚至过拟合噪声。常用做法是观察方差解释率曲线,在拐点附近取 K,并辅以交叉验证保证因子可重复。

其次是稀疏强度。稀疏约束过强,弱但真实的信号会被当作噪声抹掉;过弱则因子被大量零碎特征包裹,难以聚焦。实践中通常用若干候选超参数跑同类数据,比较因子的稳定性和富集显著性,再选择恰到好处的强度。最后是共享与特异的侧重:如果研究目标是跨组学共性机制,就把注意力放在共享因子上;如果目标是发现某个分子层的特异调控,则特异因子是主角。两者没有绝对优劣,取决于科学问题。

VAF(K)=1−∑g∥Xg−Wg(K)Z(K)⊤∥F2∑g∥Xg∥F2\text{VAF}(K) = 1 - \frac{\sum_{g} \left\| X_{g} - W_{g}^{(K)} Z^{(K)\top} \right\|_{F}^{2}}{\sum_{g} \left\| X_{g} \right\|_{F}^{2}}

1. 残差平方和:用 K 个因子重建数据后的误差,衡量未解释部分。

∥Xg−Wg(K)Z(K)⊤∥F2\left\| X_{g} - W_{g}^{(K)} Z^{(K)\top} \right\|_{F}^{2}

2. 总变异:所有组学的原始数据能量之和,作为对比基准。

∑g∥Xg∥F2\sum_{g} \left\| X_{g} \right\|_{F}^{2}

3. VAF(K):K 个因子贡献的解释方差比例,随 K 增大而单调递增。

VAF(K)∈[0,1]\text{VAF}(K) \in [0, 1]

4. 拐点法则:当曲线从陡增变为平缓时取 K,即“再增加因子也只是锦上添花”。

∂VAF∂K→0  ⇒  K∗\frac{\partial \text{VAF}}{\partial K} \to 0 \;\Rightarrow\; K^{\ast}

设计权衡的本质,是在解释力、简洁性与可重复性之间寻找平衡点。就像乐评人不会把每个装饰音都写进文章,好的 MOFA 分析也有节制——选择适当的 K、适度的稀疏与清晰的因子侧重,才能让结论既深刻又可信。

AI 应用场景

肿瘤多组学亚型发现

阶段:多组学数据整合与降维建模

解决的问题:传统方法分别分析转录组、甲基化、蛋白组,得到的亚型分类彼此冲突,难以形成统一的患者分层。MOFA 通过共享因子把所有组学拉到同一坐标系,让亚型划分反映真实的跨层生物学差异。

具体案例:某癌症中心对 300 例乳腺癌患者同时测了三类组学数据,运行 MOFA 后提取 6 个因子,其中因子 2 在转录组与蛋白组同时高载荷,对应“上皮间质转化”程序。依据因子 2 得分将患者分为高、低两组,发现高风险组的总生存期显著缩短,且两组在免疫治疗响应率上差异明显。这为临床分层提供了可解释的多组学生物标志物组合。

慢性病药物响应预测

阶段:纵向多组学特征提取与预测

解决的问题:药物疗效往往随时间动态变化,单一时间点的转录组难以捕捉响应轨迹。MOFA+ 的时间序列扩展能追踪因子得分动态,提前识别耐药拐点。

具体案例:一项糖尿病用药研究中,研究者跟踪 50 名患者用药前、用药 1 个月、3 个月、6 个月的转录组与代谢组数据。MOFA+ 识别出一个“肝脏脂质代谢”共享因子,其得分在 3 个月时发生的早期偏移,能提前预测 6 个月时是否出现血糖控制失败。医生据此将预测高风险患者及时换药,显著改善治疗结局。

Python 演示

python58 行
import numpy as np def soft_threshold(X, lam):    return np.sign(X) * np.maximum(np.abs(X) - lam, 0.0) def generate_multi_omics(n_samples=120, n_features=(300, 240, 180), K=3):    rng = np.random.default_rng(42)    Z_true = rng.normal(0, 1, size=(n_samples, K))    X_list = []    for g, nf in enumerate(n_features):        W_g = rng.normal(0, 1, size=(K, nf))        mask = rng.random((K, nf)) < 0.4        W_g[~mask] = 0.0        X_g = Z_true @ W_g + 0.3 * rng.normal(0, 1, size=(n_samples, nf))        X_list.append(X_g)    return X_list def sparse_factor_analysis(X_list, K=3, lam=0.2, max_iter=100):    rng = np.random.default_rng(7)    n_samples = X_list[0].shape[0]    Z = rng.normal(0, 1, size=(n_samples, K))    W_list = []    for X_g in X_list:        W_g = np.zeros((K, X_g.shape[1]))        W_list.append(W_g)    for it in range(max_iter):        for g, X_g in enumerate(X_list):            A = Z.T @ Z + 1e-6 * np.eye(K)            B = Z.T @ X_g            W_list[g] = soft_threshold(np.linalg.solve(A, B), lam)        S = np.zeros((K, K))        T = np.zeros((n_samples, K))        for g, X_g in enumerate(X_list):            S += W_list[g] @ W_list[g].T            T += X_g @ W_list[g].T        Z = T @ np.linalg.inv(S + 1e-6 * np.eye(K))    return Z, W_list def main():    X_list = generate_multi_omics()    K = 3    Z, W_list = sparse_factor_analysis(X_list, K=K)    print("因子得分矩阵形状:", Z.shape)    for g, W_g in enumerate(W_list):        non_zero = int(np.sum(np.abs(W_g) > 1e-6))        print("组学{} 权重矩阵: {}, 非零权重: {}".format(g + 1, W_g.shape, non_zero))    var_explained = []    for g, X_g in enumerate(X_list):        total_var = float(np.sum(X_g ** 2))        res = float(np.sum((X_g - Z @ W_list[g]) ** 2))        var_explained.append(round(1 - res / total_var, 3))    print("各组件方差解释率:", var_explained)    for k in range(K):        top_weights = [np.argsort(np.abs(W_list[g][k]))[-3:].tolist() for g in range(3)]        print("因子{}各组件高权重特征列:".format(k + 1), top_weights) if __name__ == "__main__":    main()
目的:用交替最小二乘 + 软阈值实现一个简化版 MOFA,模拟三组学数据并提取共享因子,同时输出方差解释率与高权重特征,帮助理解稀疏因子分解的完整流程。
  1. generate_multi_omics()模拟三个组学数据,每个组学由共享因子得分 Z_true 与稀疏权重矩阵相乘生成,内置 40% 的零权重模拟真实稀疏性。
  2. soft_threshold(X, lam)软阈值算子,将绝对值小于 λ 的元素置零,是稀疏约束在优化中的直接体现,对应 ARD 的最终效果。
  3. A = Z.T @ Z + 1e-6 * np.eye(K)给加性正则项,避免矩阵奇异无法求逆,稳定性技巧。
  4. W_list[g] = soft_threshold(np.linalg.solve(A, B), lam)固定 Z 后解析更新各组学权重,再施加软阈值实现特征选择。
  5. T += X_g @ W_list[g].T跨组学累积信息,让 Z 的更新同时接收所有组学的“投票”,保证是共享因子得分。
  6. Z = T @ np.linalg.inv(S + 1e-6 * np.eye(K))固定所有 W 后重新估计因子得分,完成一轮交替迭代。
  7. top_weights = ...对每个因子取各组学中权重绝对值最大的特征索引,模拟“高权重基因筛选”的下游分析。

常见误区

误区共享因子既然横跨多个组学,那它在每个组学里肯定都排在权重最前列。我只要把每个组学 top 表达的基因拿过来就能找到共享因子的核心基因。

正解共享因子关注的是“跨组学协变”,其权重绝对值相对高但不必是每个组学的最大值。比如肿瘤增殖信号在转录组载荷 0.8、甲基化载荷 0.3,仍然算共享因子,因为它在多个组学上都一致地贡献了方差。判断共享因子要看联合方差贡献与跨组学一致性,而不是单看某个组学的峰值排序。

为何常见:日常语言中“共享”容易被理解为“到处都很强”,忽略了因子分析的本质是协变结构,而不是平均强度。

误区稀疏约束后,大量特征的权重被压成 0。那这零权重基因一定不参与任何生物学过程,可以直接从后续研究中丢弃。

正解稀疏约束是建模工具,把对当前因子协变模式没有贡献的特征权重压缩为零,目的是让因子聚焦、可解释。被压成 0 的基因很可能只是在该因子的协变结构中不活跃,换一个因子、换一批样本或换一个数据集,它依然可能扮演重要角色。

为何常见:看到“0“就联想到”不存在”,混淆了统计建模中的稀疏性与生物学功能的真实有无。

误区K 设大一点,多抓几个因子,信息一定更全、模型也更细致。于是有的分析直接把 K 设为特征数的一半,发现因子多得没法看。

正解K 过大会让模型过拟合噪声,提取出的因子可重复性差、难以解读;K 过小又会丢失重要的生物学信号。实践中应使用方差解释率曲线、交叉验证等策略,在解释方差与模型复杂度之间找平衡点。K 的意义不是多,而是每个因子都稳定、可解释、可复现。

为何常见:受“信息越多越好”的直觉影响,忽略了统计模型中复杂度与泛化能力的基本权衡。

误区PCA 也是矩阵分解,MOFA 无非是把多组学矩阵拼在一起跑一遍 PCA,没什么本质区别。

正解MOFA 的核心是“共享潜变量 + 各组学独立载荷 + 稀疏先验”三层设计。它显式建模组学间的共享与特异结构,并用方差分解量化每个因子对每个组学的贡献。直接把多组学拼接后做 PCA,会让量纲最大的组学主导结果,既无法分离特异信号,也无法比较各因子在不同组学的载荷模式。

为何常见:两者都是低秩近似,表面形式相似,容易忽略 MOFA 对组学结构的概率建模带来的本质差异。

面试题

Q1. MOFA 中最核心的建模思想是什么?

单选题 · easy

  • A.各组成组学拼接后直接聚类
  • B.用共享潜变量解释组间协同变异← 正确答案
  • C.仅保留方差最大的几个特征
  • D.各组学独立 PCA 后合并结果

答案:B。MOFA 的核心是让所有组学共享同一个因子得分矩阵,再由各组学独立的载荷矩阵解释各自变异,从而刻画组学间的协同变异。A、D 没有“共享”概念,C 只是特征筛选而非因子建模。

Q2. 共享因子在多个组学上的典型表现是什么?

单选题 · easy

  • A.在所有组学上权重都最大
  • B.在该因子驱动的组学上协变明显← 正确答案
  • C.只在某一个组学上有非零权重
  • D.各组学权重全部为负值

答案:B。共享因子的标志是多个组学对它有一致的协变响应,而不是在每个组学都排第一。C 是特异因子的特征,D 出现负权重并不代表共享。

Q3. 为什么通常优先研究因子权重绝对值大的基因?

单选题 · mid

  • A.它们是数据中最嘈杂的干扰分子
  • B.它们与其他因子高度相似
  • C.代表该因子驱动的核心分子特征← 正确答案
  • D.它们在所有样本中表达量最高

答案:C。因子分析中,权重的绝对值衡量特征与因子的关联强度。高权重基因是该因子代表的生物学程序的关键执行者,因此值得优先验证。注意高权重不等于表达量最大,也不等于噪声。

Q4. 关于稀疏约束的作用,下列说法正确的是?

多选题 · mid

  • A.使每个因子仅由少数特征驱动← 正确答案
  • B.让因子抗噪声且更可解释← 正确答案
  • C.将所有组学权重强制完全相等
  • D.通过 ARD 先验自适应调整精度← 正确答案

答案:ABD。稀疏约束通过让弱相关特征权重归零,让因子聚焦于少数关键特征,同时提高抗噪声能力与可解释性。ARD 是 MOFA 中实现稀疏的主要机制。C 说法与稀疏完全相反。

Q5. 因子数 K 的常用选择策略是什么?

单选题 · mid

  • A.越大越好,保证信息不丢失
  • B.取满所有特征的个数
  • C.依据方差解释率曲线拐点← 正确答案
  • D.固定永远取因子数为十

答案:C。K 的选择需要在解释力与复杂度之间权衡。方差解释率曲线的拐点表示继续增加因子只能解释少量额外变异,是实用的选择依据。固定取 10 或取满特征数都会导致过拟合。

Q6. MOFA+ 相比原始 MOFA 有哪些扩展能力?

多选题 · mid

  • A.支持时间序列纵向样本建模
  • B.能纳入多分组结构样本
  • C.可生成新的组学观测数据
  • D.不需要设置任何先验分布← 正确答案
  • E.按表达量高低直接删除低值基因
  • F.对所有权重施行固定阈值截断
  • G.先聚类后挑选类中心代表性基因
  • H.自适应精度参数将无效权重推向零

答案:D。ARD 为每个权重配备精度参数 α,数据不支持时 α 变大,反向方差 α^{-1} 趋近零,权重被拉向零。整个过程是自适应的,无需人工固定阈值或按表达量删基因,因此 A、B、C 均不对。

Q7. 运行 MOFA 前,各组学数据通常需要做什么预处理?

单选题 · easy

  • A.将所有组学拼接为一个超大矩阵
  • B.每个组学分别标准化为 Z 分数← 正确答案
  • C.删除所有低方差基因不保留
  • D.转换为单一基因表达量数值

答案:B。各组学量纲差异大,需要分别标准化(如 Z 分数)让方差可比,MOFA 才能公平地提取跨组学因子。拼接成超大矩阵会让量纲主导结果,直接删除低方差基因过于粗暴。

Q8. 以下关于方差解释率 VAF 的理解,正确的是?

多选题 · hard

  • A.可用于评估因子对特异组学的贡献← 正确答案
  • B.方差解释率越高因子一定越可用
  • C.反映因子对该组学变异的总占比← 正确答案
  • D.可辅助筛选主效因子与次要因子← 正确答案

答案:ACD。VAF 衡量因子解释了某组学变异的比例,可用来比较因子的重要程度,也能体现因子对某个特异组学的贡献。但 VAF 高不代表因子生物学上可解释,可能只是拟合了噪声,因此 B 错误。

Q9. 识别特异因子时,最关键的依据是什么?

单选题 · hard

  • A.在全部组学上均匀分布高载荷
  • B.每个组学载荷值都恰好为零
  • C.因子得分与样本分组无关
  • D.仅少数组学上有较强且一致的载荷← 正确答案

答案:D。特异因子的特征是只在少数组学(通常一个)上有一致且较强的载荷,其他组学载荷接近零。A 是共享因子的表现,B 意味着因子不存在,C 与因子识别无关。