Math-02.相关性检验-05.偏相关与相关矩阵

偏相关(partial correlation)度量在控制第三变量(或变量集)后,两变量间的相关;相关矩阵汇总多变量两两相关,是特征选择与共线性诊断的基础。

段末注释共线性(collinearity)指自变量间高度相关,使回归系数不稳定。

系列01 总论 | 多重比较:Math-01-20


1. 为什么需要偏相关(D1)

图 1 偏相关直观

$X$ 与 $Y$ 相关可能因共同受 $Z$ 驱动(混杂)。偏相关 $r_{XY \cdot Z}$ 控制 $Z$ 后剩余关联。


2. 偏相关公式(D2–D3)

图 2 相关矩阵热图

简单偏相关(控制单个 $Z$):

$$
r_{XY \cdot Z} = \frac{r_{XY} - r_{XZ} r_{YZ}}{\sqrt{(1-r_{XZ}^2)(1-r_{YZ}^2)}}
$$

多变量控制可用相关矩阵求逆(精度矩阵)或 pingouin.partial_corr


3. 相关矩阵(D4)

$p$ 个变量 → $p \times p$ 对称矩阵 $\mathbf{R}$,对角为 1。

任务 方法
可视化 热图(heatmap)
显著性 每对 $H_0:\rho=0$;$m=p(p-1)/2$ 次检验
多重比较 BH FDR
置信区间 Fisher $z$ 变换

4. 适用场景(D5–D7)

图 3 适用场景

场景 用法
biomarker 控制年龄/性别 偏相关
基因共表达网络 相关矩阵 + FDR
ML 特征筛选 $
共线性诊断 $

5. 局限与误用(D8)

图 4 局限

问题 说明
$p$ 大 $n$ 小 矩阵奇异;需 $n>p$ 或正则化
不校正多重 假阳性基因对
偏相关≠因果 仍可能有未测混杂
仅线性 非线性用距离相关 / MIC
相关筛选泄漏 ML 应用 train 集内做

6. 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
import pandas as pd
from scipy import stats
from statsmodels.stats.multitest import multipletests

# 模拟:Y 与 X1 通过共同因子 Z 相关
rng = np.random.default_rng(42)
n = 100
z = rng.normal(0, 1, n)
x1 = z + rng.normal(0, 0.5, n)
x2 = z + rng.normal(0, 0.5, n)
y = 0.5 * x1 + rng.normal(0, 0.5, n)

print("raw r(x1,y):", stats.pearsonr(x1, y)[0].round(3))
print("raw r(x2,y):", stats.pearsonr(x2, y)[0].round(3))

# 偏相关 r(x1,y|z) 手工
def partial_corr(a, b, ctrl):
r_ab = stats.pearsonr(a, b)[0]
r_ac = stats.pearsonr(a, ctrl)[0]
r_bc = stats.pearsonr(b, ctrl)[0]
return (r_ab - r_ac * r_bc) / np.sqrt((1 - r_ac**2) * (1 - r_bc**2))

print("partial r(x1,y|z):", partial_corr(x1, y, z).round(3))

# 相关矩阵 + FDR
df = pd.DataFrame({"x1": x1, "x2": x2, "y": y, "w": rng.normal(0, 1, n)})
cols = df.columns
pairs, pvals = [], []
for i in range(len(cols)):
for j in range(i + 1, len(cols)):
r, p = stats.pearsonr(df[cols[i]], df[cols[j]])
pairs.append(f"{cols[i]}-{cols[j]}")
pvals.append(p)
reject, q, _, _ = multipletests(pvals, alpha=0.05, method="fdr_bh")
for name, r_val, q_val, rej in zip(pairs,
[stats.pearsonr(df[c.split('-')[0]], df[c.split('-')[1]])[0] for c in pairs], q, reject):
if rej:
print(f" {name}: r={r_val:.3f}, q={q_val:.3f} *")

7. 小结

  • 偏相关剔除混杂;相关矩阵 + FDR 用于多变量筛选。
  • 特征选择见 相关分析-相关系数;ML 注意数据泄漏。

系列导航02 Pearson | 00 规划


参考文献

  1. pingouin.partial_corr
-------------本文结束感谢您的阅读-------------