上一篇文章里,我们扒了 t 检验、方差分析 (ANOVA)、非参数检验的马甲,发现它们全都是 这一个初中直线方程的变体。后来我们又引入了“联系函数(Link Function)”,顺手把生信里高大上的 DESeq2 也给扒了(本质是广义线性模型 GLM)。

这时候,肯定有经常跑临床数据和生信生存分析的同学不服了:

“那我们临床天天用的卡方检验 (Chi-square) 呢?我们算 KM 曲线和 HR 用的生存分析 (Cox 回归) 呢?这俩总该是另外一套体系了吧?”

不好意思,今天我们就来把这几个硬核的“牛鬼蛇神”也一并扒了。你会发现,万剑归宗,它们依然没逃出线性模型的手掌心。


1. 卡方检验:数格子的本质是对数线性模型

场景:你想研究“吸烟(是/否)”和“得肺癌(是/否)”有没有关系。你收集了一堆人,画了一个 2x2 的表格,里面填满了人数(频数)。

课本教你:算卡方检验!你要先算每个格子的“观测值 (O)”,再算“期望值 (E)”,然后套用那个极其反人类的公式:,最后去查卡方分布表。 强迫症表示:这都什么年代了,谁还手算这个?

扒马甲时刻: 其实,卡方检验的本质是一个泊松回归 (Poisson Regression),也就是广义线性模型里的一种(对数线性模型,Log-linear model)。

在这个模型里:

  • 你的 每个格子里的人数 (Count)。因为人数也是非负整数,所以跟上一篇的 RNA-seq 一样,我们给它套上一个对数滤镜
  • 你的 是是否吸烟,你的 是是否得肺癌。

模型长这样:

看到那个 了吗?这就是大名鼎鼎的交互项 (Interaction term)。 当你做卡方检验,问“吸烟和肺癌是否独立”时,你本质上是在问大自然:“在这个线性模型里, 这个交互项的斜率,是不是显著不等于 0?”

# 我们捏造一个 2x2 表格的数据:
# 假设 吸烟+肺癌=40人,吸烟+健康=10人;不吸烟+肺癌=20人,不吸烟+健康=30人
counts <- c(40, 10, 20, 30)
smoke <- gl(2, 1, 4, labels=c("Yes", "No"))
cancer <- gl(2, 2, 4, labels=c("Yes", "No"))
 
# 1. 传统的卡方检验
chisq_test <- chisq.test(matrix(counts, nrow=2))
print(chisq_test$p.value)
# 0.0001051636
 
# 2. 也是服了,直接跑泊松回归(GLM)
# 注意公式里的 smoke * cancer,它会自动展开为 smoke + cancer + smoke:cancer
glm_poisson <- glm(counts ~ smoke * cancer, family = poisson())
summary(glm_poisson)
# 你去看看 summary 里 smokeNo:cancerNo 这一项的 p 值(8.65e-05)

Note: 虽然底层算法(Wald 检验 vs 皮尔逊残差)导致 p 值有极其微小的差异,但它们检验的完全是同一个数学本质!另外我们也知道算这种2联表,其实用Fisher Exact Test 更准确。它算出来的值与glm就高度一致了。

fisher.test(matrix(counts, nrow=2))$p.value
# 8.308659e-05

以后再看到 2x2 或者 3x3 表格,别急着找卡方公式了。把每个格子的频数当成 ,行和列当成 跑个 GLM,这有何难呢?


2. 逻辑回归 (Logistic Regression):森林图里 OR 值的真面目

场景:你在看一篇临床顶刊,里面画了一张极其漂亮的“森林图 (Forest Plot)”。图上列着各种因素(年龄、性别、是否吸烟)对患病率的影响,每个因素后面都跟着一个 OR 值 (Odds Ratio, 比值比)。如果 OR > 1 就说是危险因素,OR < 1 就说是保护因素。

很多人觉得 OR 值是一个独立的高深统计指标。其实呢,它就是线性模型里斜率的一个变体!

我们在基础篇提到过,当你的 是“生病/不生病”(即 0 和 1)时,我们会给 套上一个 logit 滤镜:

等式左边的 ,在统计学里叫做 Odds (胜率/赔率)。比如得病概率是 0.8,不得病是 0.2,那 Odds 就是 0.8/0.2 = 4。 所以逻辑回归本质上是:对数胜率 (Log Odds) 的线性模型

绝杀来了: 如果你想知道 (比如吸烟)对得病到底有多大影响,你只需要看斜率 。 但 是在对数尺度上的,怎么把它还原回人类能看懂的比例呢?很简单,取个指数:

这个 ,就是你在森林图上天天看到的 OR 值!

  • 如果 (吸烟没影响),那么 。这就是为什么森林图里那根“无效线”永远画在 1 的位置。
  • 如果 (正相关),那么 (危险因素)。

你看,不管临床医生把森林图画得多么花里胡哨,本质上他们全都在跑这一个带着 logit 滤镜的线性模型。


3. 生存分析 (Cox 回归):给风险套个对数的线性模型

场景:你要比较 A 药和 B 药对肿瘤患者生存期的影响。你画了漂亮的 Kaplan-Meier 生存曲线,然后算出了一个 HR 值 (Hazard Ratio) 发现等于 0.5,大呼“神药诞生!”

生存分析最让人头疼的地方在于删失数据 (Censored data):有些病人随访到一半跑路了,你不知道他到底活了多久。这导致你不能直接把“生存天数”当成 去跑线性回归。

天才的发明:Cox 比例风险模型

统计学家 David Cox 拿了诺贝尔奖级别的灵感(虽然统计学没有诺贝尔奖):既然“能活多久”没法直接当 ,那我就预测**“现在的死亡风险 (Hazard)”**!

Cox 模型的公式长这样:

看着挺吓人?别急,我们稍微变形一下。 两边同时取对数(又是我们熟悉的对数滤镜):

再把 Baseline 移到左边:

卧槽,看见了吗!等式右边又变成了那个最干净的 在这个模型里:

  • 左边 是“当前病人的风险”相对于“基准风险”的对数比值
  • 右边 是吃 A 药还是 B 药(开关变量 0 或 1)。

绝杀来了:如果你把这个算出来的斜率 重新取个指数还原回去(即 ),猜猜它叫什么? 它就是你在各大顶刊里天天看到的 Hazard Ratio (HR)!

检验两组生存期是否有差异(比如 Log-rank 检验),本质上依然是在问:“在这个以对数风险为 的线性模型里, 是不是显著不等于 0?”(如果 ,那么 HR=,也就是两组没区别)。


4. 混合效应模型:自带“专属 VIP 偏差”的线性模型

场景:你要测一种新药对血压的影响。你找了 5 个病人,每个人连续测了 10 天血压。 课本严厉警告你:这 50 个数据点不是独立的!同一个病人这 10 天的数据自带相关性(比如张三本来血压就高,李四本来就低)。如果你敢把这 50 个点直接混在一起跑普通线性回归,审稿人会把你骂到退稿。

痛点吐槽:在传统的统计学教学里,遇到这种数据,老师会教你用一个极其恶心的东西叫重复测量方差分析 (Repeated Measures ANOVA)。你不仅要把数据格式转来转去,还要做一种反人类的“Mauchly 球形检验”,如果不通过还要做各种 epsilon 校正。最要命的是,如果某个病人第 5 天忘了来测(数据缺失),整个 ANOVA 模型就直接崩盘罢工了!

降维打击时刻: 为了解决“数据不独立 / 有层级嵌套”的问题,现代统计学主推混合效应模型 (Mixed Effects Models)。它不仅完美替代了重复测量 ANOVA,而且完全不怕数据缺失。它的名字听着很吓人,但其实是对线性模型的一次极其温柔的微调。

普通线性模型: 这里的 是一个固定的截距(所有人共享的基准线)。

混合效应模型: 发现区别了吗?我们在截距里加了一个 。这个 叫做随机效应 (Random Effect)。 它代表了每个病人的专属偏差

  • 张三血压偏高,他的
  • 李四血压偏低,他的

通过把这个“个人特质”塞进截距里,模型就聪明地把“因为人不同导致的误差”给吸收掉了。剩下来的 ,就是真正干干净净的、由药物带来的血压变化(固定效应)。

# 在 R 里,你需要用到 lme4 包
library(lme4)
 
# 依然是熟悉的公式配方,只是多了一个 (1|subject)
# 这就相当于告诉模型:给每个 subject (病人) 分配一个专属的截距!
mixed_model <- lmer(blood_pressure ~ drug + (1|subject), data = my_data)
summary(mixed_model)

所以,不管叫什么高大上的名字,混合效应模型无非就是给线性模型开了几个“动态截距”或者“动态斜率”的后门而已。


总结:万物皆可

两篇文章看下来,从最简单的 Pearson 相关、t 检验、ANOVA,到生信人必备的 DESeq2 (GLM)、Cox 生存分析,再到临床必备的卡方检验和混合效应模型……

它们全部、统统、一分不差地,是线性模型

不要被花里胡哨的统计学名词唬住。下次面对复杂的数据分析时,你只需要思考三个问题:

  1. 你的 是什么?(连续的?分类的?还是生存风险?)
  2. 需要套什么滤镜 (Link Function) 吗?(比如 count 值套对数,0/1 状态套 logit)
  3. 你的 是什么?需要做成开关 (Dummy Variable) 吗?有没有专属偏差 (Random Effect)?

想清楚这三点,剩下的就是写下一个等式。 人生苦短,先把正事干了,别去死记硬背那些折磨人的检验决策树了。


参考资料

  1. Jonas Kristoffer Lindeløv, Common statistical tests are linear models (or: how to teach stats)
  2. David R. Cox, “Regression Models and Life-Tables”. Journal of the Royal Statistical Society, 1972.