第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的概率图模型,这个图我建议你多看几眼,因为后续所有推断、降维、解释都围绕它展开。

MOFA概率图模型 Z (因子得分) K 个潜在因子 α (稀疏先验) X₁ (视图1数据) D₁个特征,N个样本 X₂ (视图2数据) D₂个特征,N个样本 X₃ (视图3数据) D₃个特征,N个样本 W₁ (载荷矩阵) W₂ (载荷矩阵) W₃ (载荷矩阵) E₁ (视图噪声) E₂ (视图噪声) E₃ (视图噪声) Z是所有视图的“公共语言”,W_m决定了每个视图如何翻译Z为自己的特征空间,E_m吸收视图特有的噪音。

图里最上面那个蓝色的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来填补。这一招,在组学数据合并且时有批次缺失的情况下特别好用。