如果你已经看过了前两篇,你会发现我们用 这个初中直线方程,一路砍瓜切菜,把 t检验、ANOVA、卡方检验、逻辑回归(OR值)、生存分析(HR值)甚至混合效应模型全给扒了马甲。

但这时候,又会有人跳出来问两个极其刁钻的问题:

  1. 关系复杂怎么办? 比如流行病学和心理学里天天画的那种“A 导致 B,B 又导致 C”的箭头图,课本说这叫“中介效应 (Mediation)”,线性模型能搞定吗?
  2. 数据弯了怎么办? 比如生信做单细胞拟时间分析 (Pseudotime),基因表达量随时间是个抛物线。直线方程怎么可能拟合弯曲的线?这肯定得用高深算法了吧?

别慌,今天我们把这最后两块硬骨头也啃了。


1. 调节效应与中介效应:不过是连着跑几次回归

在看文献时,你经常会看到这两种极其容易混淆的高级名词:调节效应 (Moderation)中介效应 (Mediation)。其实只要戳破窗户纸,它们简单得令人发指。

调节效应 (Moderation):其实就是交互项

场景:你发现“运动 ()”能降低“体重 ()”。但是,这种降重效果在“年轻人 ()”身上很明显,在“老年人 ()”身上却没啥用。 这里,年龄 () 就是一个调节变量,它调节了 的影响力度。

这有何难呢?如果你看过我们的进阶篇讲卡方检验的那一节,你应该秒懂:这不就是交互项吗! 模型长这样:

只要去看看 (运动和年龄的乘积项)是不是显著不等于 0 就完事了。所谓调节效应,就是多元线性回归里的一个乘法项。

怎么解读这个结果呢? 我们把方程稍微合并一下同类项,把 提出来,就会豁然开朗:

看括号里的东西! 就是运动 对体重 的“真实动态斜率”

  • 如果是年轻人 ():斜率变成 。说明年轻人运动的减肥效果是
  • 如果是老年人 ():斜率变成 。说明老年人运动的减肥效果,比年轻人改变了 这么多!

所以,当你得出“调节效应显著( 显著)”的结论时,你其实是在说:这个自变量的斜率不是固定的,它会跟着调节变量 的变化而变化。 这就是调节效应的物理意义。


中介效应 (Mediation):连着跑三次回归

场景:你发现“熬夜 ()”会导致“脱发 ()”。但你仔细一想,熬夜本身可能不掉头发,是因为“熬夜 ()”导致了“内分泌失调 ()”,然后“内分泌失调 ()”导致了“脱发 ()”。 这里,内分泌失调 () 就是一个中介变量

心理学和社科领域特别喜欢搞这种 的箭头图,而且还发明了一个著名的“Baron & Kenny 三步法”。听着很高大上,其实呢?就是没心没肺地连着跑三次最基础的线性回归

  • 第一步(算总效应 :直接看熬夜对脱发的影响。 跑回归:lm(脱发 ~ 熬夜),得到斜率
  • 第二步(算 的效应 :看熬夜对内分泌的影响。 跑回归:lm(内分泌 ~ 熬夜),得到斜率
  • 第三步(算直接效应 的效应 :把熬夜和内分泌同时放进去预测脱发。 跑回归:lm(脱发 ~ 熬夜 + 内分泌),得到两个斜率 (熬夜的直接影响)和 (内分泌的影响)。

绝杀来了:为什么这么跑三次回归,就能证明“中介(传导)”关系?

核心秘密就在于第一步的 第三步的 的对比!

  • 当你只看“熬夜”时(第一步),脱发很严重( 很大且显著)。
  • 但当你把“内分泌”作为第二个自变量塞进方程后(第三步),神奇的事情发生了:“熬夜”对“脱发”的斜率 突然变小了,甚至变得不显著了!

这在数学上意味着什么?意味着**“熬夜”原本对“脱发”的解释力,被“内分泌”给吸走了!** 既然内分泌能把熬夜的功劳抢走,这就完美地在逻辑上证明了:熬夜并不是直接导致脱发的,它的破坏力是借由内分泌这个“中间商(中介)”传导过去的。

在数学上,总效应 = 直接效应 + 间接效应,也就是:。 所以中介效应到底有多大?就是把中间那条路的两个斜率乘起来,也就是 。 然后统计软件会用一种叫 Sobel 检验或者 Bootstrap 的方法,算一下这个乘积 是不是显著不为 0。

你看,不管箭头画得多么眼花缭乱,它推导“传导方向”的底层逻辑,其实就是看“谁把谁的回归斜率给吸走了” 。这依然是初中数学里的直线方程。


2. 广义相加模型 (GAM):把直尺掰弯了的线性模型

痛点:在生物医学里,并不是所有规律都是直来直去的。 比如你做了一次单细胞测序,用 Monocle 算出了细胞发育的拟时间 (Pseudotime)。你发现某个关键基因的表达量,随着时间推移,是先升高、后降低的。 又比如在临床环境流行病学中,你想研究气温和心血管死亡率的关系。你发现气温太低容易死人,气温太高也容易死人,只有在 22 度左右最安全,画出来是个典型的 U 型曲线。

很显然,数据分布是个抛物线,甚至是个波浪线。你用一根笔直的直线 穿过去,根本拟合不了,算出来的 p 值肯定是不显著的。

课本告诉你:遇到这种非线性数据,必须上高级货——广义相加模型 (Generalized Additive Model, GAM)

听名字“相加模型”,感觉又是一个全新的体系? 扒马甲时刻: 其实,统计学家解决非线性问题的方法极其简单粗暴:既然 是一根直尺,那我就把 掰弯了再塞进方程里!

掰弯方法 1:多项式回归 (Polynomial Regression)

直线不行,那抛物线行不行? 我们直接给方程里加一个 (平方项): 哎?等等!这玩意儿不就是个有两个自变量的多元线性回归吗? 只要你把 强行看作是一个叫 的新变量,它依然是完美的线性模型!算出来的 决定了抛物线的开口大小和方向。

掰弯方法 2:样条函数 (Splines)

多项式有个缺点:一旦数据像过山车一样上下起伏好几次,高次方程(比如 )的尾巴就会乱甩(也就是著名的“龙格现象”)。 统计学家又想了一招极其聪明的办法:分段画直线/曲线

假设时间 从 0 到 10,我们在中间设几个“节点 (Knots)”,比如 3 和 7。

  • 0-3 这段,我跑个线性回归。
  • 3-7 这段,我跑个线性回归。
  • 7-10 这段,我跑个线性回归。 然后用极其精妙的数学方法,把这三段线在节点处平滑地焊接起来。这就叫样条函数 (Splines)

在 R 语言里跑 GAM 模型,长这样:

library(mgcv)
# s(x) 就是给 x 套上了一个“样条函数”滤镜,把它掰弯了
gam_model <- gam(y ~ s(x), data = my_data)

生信与临床的真实威力: 当你在跑 MonocletradeSeq 找“随时间变化的差异基因”时,底层其实就是给你这 2 万个基因挨个跑了一遍 GAM。它会算出一条平滑的拟合曲线,然后问大自然:“这条弯曲的线,是不是比一条水平的死线(完全没变化)拟合得更好?”如果是,那它就是一个显著的随发育动态变化的基因。

在临床的流行病学大队列里也一样,通过拟合这种非线性关系,我们可以精准找到“最适宜的区间”(比如 U 型曲线的谷底),而不是被强行拉直的线性模型给带偏。

核心结论:不管曲线多么弯绕,GAM 的本质就是: 这个 ,无非就是把 变成了 ,或者是几段拼接起来的变量。一旦转换完成,它依然是在算那些我们熟悉的 权重。它只不过是戴着非线性面具的线性模型


终极总结

写到这里,我们的“扒马甲”三部曲终于可以收官了。

从基础的 出发,统计学家们玩出了三层花样:

  1. 改变 的形式:把分类变量变成 0/1 开关(t检验、ANOVA),加个交互项变成乘法(卡方检验、调节效应),加个平方项把它掰弯(GAM)。
  2. 改变 的形式:给 排个名(非参数检验),给 套个对数滤镜(泊松回归),给 算个胜率再套对数(逻辑回归),给 算个风险再套对数(Cox 回归)。
  3. 改变 的形式:给每个病人分配一个专属截距(混合效应模型)。

不管外面套了多少层高大上的术语,剥开层层洋葱,核心永远是那个清清爽爽的线性等式。 统计学不应该是死记硬背的菜谱,而应该是搭积木的乐高。

掌握了这个终极心法,以后不管遇到多复杂的分析场景,你都能一眼看穿它的本质。 祝你从此 Bug Free,数据永远显著。