第2章:MOFA数学模型 – 因子分析基础与概率图模型
聊到MOFA,很多人第一反应是“又是一个黑盒工具”。其实不是,它的数学骨架非常清晰。说白了,MOFA就是把经典的因子分析(Factor Analysis)硬生生推广到了多视图场景。我个人习惯,在讲任何算法前,先把它的假设讲透。否则后续调参、诊断全凭运气,那就麻烦了。
2.1 从经典因子分析说起
因子分析的基本假设很简单:我们观测到的高维数据,其实是由少数几个不可观测的“潜在因子”线性组合,再加上一些噪声生成的。你想想看,测了上万基因的表达量,很多基因其实是共表达的,它们的波动背后是少数几个生物学过程(比如细胞周期、免疫应答)在调控。因子分析要做的,就是把那层窗户纸捅破。
用数学来表示,对于单视图数据 \( \mathbf{X} \in \mathbb{R}^{N \times D} \)(N个样本,D个特征),因子分析模型是:
X = Z W^T + E
- Z:因子得分矩阵,维度 N×K。K就是你设定的因子个数。每一行是样本在K个因子上的“坐标”。
- W:因子载荷矩阵,维度 D×K。每一列定义了某个因子如何“加权”组合原始特征。
- E:噪声项,通常假设为各向同性高斯分布,即每个特征的噪声独立同分布。
为什么叫“载荷”?我在项目中遇到过,有的同学总把这个跟“权重”混淆。权重是预测模型里的概念,载荷在这里是“因子和特征之间的协方差结构”。它告诉我们,哪个特征在哪个因子上“挂了多大的重量”。
核心思想:因子分析是降维,但它不做PCA那样的旋转变化。它找的是能够解释特征间相关结构的潜在变量。去相关,才是它的目标。
2.2 MOFA如何推广?——给每个视图一个专属空间
MOFA的聪明之处在于,它假设多个视图共享同一套样本的因子得分Z,但每个视图有自己独立的载荷矩阵和噪声。这么一来,就实现了“一个底层信号,多种观测手段”的整合。
假设我们有M个视图,第m个视图的数据矩阵是 \( \mathbf{X}_m \in \mathbb{R}^{N \times D_m} \)。MOFA的模型写为:
X_m = Z W_m^T + E_m
其中:
- Z:共享因子得分,N×K。所有视图共用一个Z。
- W_m:第m个视图的因子载荷,D_m × K。每个视图对因子的“解释”是独立的。
- E_m:第m个视图的噪声,按视图独立建模。
你可能会问:为什么Z非要共享?嗯,这是关键。如果不共享,每个视图各自跑因子分析,那组学之间的关联就断了。共享Z,相当于把跨视图的信号强行拧到了一起。我在处理表观组和转录组数据时,发现有的因子只在某个视图上有高载荷,这时候就需要去追问:那个因子是不是代表了该视图特有的生物学通路?
实用技巧:若某个视图的样本量或特征数差异悬殊,建议先对每个视图做标准化(z-score),再放入MOFA。否则载荷尺度会偏移。
2.3 概率图模型视角
光说公式有点干。我们把它画成图,就好理解了。下面是MOFA的概率图模型,这个图我建议你多看几眼,因为后续所有推断、降维、解释都围绕它展开。
图里最上面那个蓝色的Z,是所有视图的“公共语言”。你想想看,转录组数据、蛋白质组数据、甲基化数据,它们坐在一起,通过Z来对话。红色箭头从Z指向各个X_m,表示Z是数据生成的驱动源。底下橙、紫、青色的方块是每个视图的载荷矩阵W_m,它们决定了每个视图如何“翻译”Z为自己的特征空间。噪声E_m则吸收那些视图特有的噪音。
图里还有一个绿色的α,那是稀疏先验的超参数。为什么需要它?因为实际应用中,大多数特征只和少数因子相关。你强行让所有特征在所有因子上都有载荷,结果就是过拟合,因子解释起来也是一团浆糊。我记得有一次跑mofa,K设到15,结果一半因子都没什么载荷,后来加了稀疏正则,才把真正的信号洗出来。
避坑指南:概率图模型中的节点代表随机变量,箭头代表条件依赖关系。千万不要把箭头理解成因果,那是个常见误区。MOFA的箭头只是表示“生成过程”,不是“A导致B”。
2.4 模型生成过程(完整版)
把上面的图结构化,MOFA的完整生成过程可以写成:
对于每个因子 k = 1 ... K:
采样稀疏先验参数 α_k
对于每个视图 m = 1 ... M:
对于每个特征 d = 1 ... D_m:
采样载荷向量 w_{m,d} ~ 稀疏先验分布
对于每个样本 n = 1 ... N:
采样因子得分 z_n ~ N(0, I_K)
对于每个视图 m = 1 ... M:
采样噪声精度 τ_m ~ Gamma(a₀, b₀)
对于每个样本 n = 1 ... N:
生成数据 x_{m,n} ~ N( W_m z_n, τ_m^{-1} I )
这里面有几层意思:
- 因子的稀疏性:不是所有因子在所有视图里都活跃。α就是控制这个开关的。
- 因子的正交性:Z的先验是标准正态,意味着因子之间是正交无关的。实际数据中可能没那么完美,但这样可以保证因子的可辨识性。
- 噪声异质性:每个视图有自己的噪声精度τ_m。有些视图噪音大(比如单细胞数据),有些噪音小(比如bulk RNA-seq),模型会自适应地给它们分配权重。
经验建议:因子数K不是越大越好。我习惯先用一个较大的K(比如20-30)跑一次,然后看每个因子的方差解释率。那些解释率接近0的因子,可以直接干掉。通常5-15个因子就够用了。
2.5 对比经典因子分析
| 特性 | 经典因子分析 | MOFA |
|---|---|---|
| 视图数 | 单视图 | 多视图(M≥2) |
| 因子得分 | 视图特有 | 所有视图共享 |
| 噪声假设 | 各向同性 | 按视图独立建模,可异质 |
| 先验结构 | 无(或简单先验) | 组级稀疏先验 |
| 缺失数据处理 | 需要插补 | 自然支持缺失值 |
看到这个表你应该明白了,MOFA不是把多个因子分析结果做平均,而是在模型层面就建了一个多视图的联合生成过程。缺失数据不需要额外插补,因为模型在推断时会自动利用共享的Z来填补。这一招,在组学数据合并且时有批次缺失的情况下特别好用。