Math-02.相关性检验-10.分类变量相关

当至少一个变量为分类(categorical)时,Pearson / Spearman / Kendall 不再直接适用。本篇介绍 Phi 系数Cramér’s V(Cramér’s V)、点二列相关(point-biserial correlation)及与 卡方检验 的关系。

段末注释Phi 系数($\phi$)为 $2\times2$ 列联表的标准化关联强度;Cramér’s V 推广到任意 $r\times c$ 表。

系列01 总论 | 07 卡方


1. 问题与直观(D1)

图 1 分类相关直观

  • 两分类:突变有害/无害 vs 表达高/低 → $2\times2$ 列联表
  • 多分类:氨基酸类型 vs 活性等级 → $r\times c$ 表
  • 一分类一连续:是否达标(0/1)vs 酶活数值 → 点二列

2. 数据类型与系数选型(D2)

X \ Y 连续 二分类 多分类
连续 Pearson / Spearman 点二列 $r_{pb}$ 多二列 / ANOVA $\eta$
二分类 点二列 Phi $\phi$ Cramér’s V
多分类 ANOVA / $\eta$ Cramér’s V Cramér’s V

3. 公式与显著性(D3–D4)

图 2 Phi 与 Cramér's V

3.1 Phi 系数($2\times2$)

列联表卡方 $\chi^2$,样本量 $n$:

$$
\phi = \sqrt{\frac{\chi^2}{n}}, \quad \phi \in [0,1]
$$

$\phi$ 大 → 两二元变量关联强。符号需结合表内方向解读(或报告 OR)。

3.2 Cramér’s V($r\times c$)

$$
V = \sqrt{\frac{\chi^2}{n \cdot \min(r-1,, c-1)}}, \quad V \in [0,1]
$$

$r$ 行数,$c$ 列数;$2\times2$ 时 $V=|\phi|$。

3.3 点二列相关

二元 $D\in{0,1}$ 与连续 $Y$:

$$
r_{pb} = \frac{\bar{Y}_1 - \bar{Y}_0}{s_Y}\sqrt{\frac{n_0 n_1}{n(n-1)}}
$$

等价于 Pearson($D, Y$)(当 0/1 编码时)。

3.4 显著性

$H_0$:两变量独立 → 卡方检验 或 Fisher 精确(小样本);系数本身为效应量。


4. 适用场景(D5–D7)

图 3 适用场景

场景 方法
有害/无害 vs 高/低表达 Phi
20 种氨基酸 vs 活性档 Cramér’s V
是否 WT 以上 vs 酶活 点二列
交叉表 + p 值 $\chi^2$ + V

5. 局限与误用(D8)

图 4 局限

问题 说明
期望频数 $<5$ Fisher 精确;慎用 $\chi^2$
有序分类当名义 损失信息 → Spearman / $\tau$
$V$ 随表维度变大 仅在同维度表间粗比
相关≠因果 同连续变量
稀疏大表 合并类别 / 正则化

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
import numpy as np
from scipy import stats

# 2x2: 突变类型 vs 活性档
table = np.array([[45, 5], [12, 38]]) # rows: harmful/benign, cols: low/high
chi2, p, dof, expected = stats.chi2_contingency(table)
n = table.sum()
phi = np.sqrt(chi2 / n)
print(f"Phi={phi:.3f}, chi2 p={p:.4e}")

# Cramér's V (general)
def cramers_v(table):
chi2 = stats.chi2_contingency(table)[0]
n = table.sum()
r, c = table.shape
return np.sqrt(chi2 / (n * min(r - 1, c - 1)))

# 3x4 示例
table_rc = np.array([[10, 5, 2, 1], [8, 12, 6, 3], [2, 4, 15, 9]])
print(f"Cramer's V={cramers_v(table_rc):.3f}")

# 点二列:二元 vs 连续
rng = np.random.default_rng(42)
d = rng.integers(0, 2, 60)
y = 1.0 + 0.8 * d + rng.normal(0, 0.5, 60)
r_pb, p_pb = stats.pointbiserialr(d, y)
r_pearson = stats.pearsonr(d, y)[0]
print(f"point-biserial r={r_pb:.3f}, pearson(0/1,y)={r_pearson:.3f}")

7. 小结

  • 分类相关:$2\times2$ 用 Phi;一般列联表用 Cramér’s V;二元+连续用 点二列
  • 显著性走 $\chi^2$ / Fisher;系数报告效应量。

系列导航02 Pearson | 20 特征选择


参考文献

  1. scipy.stats.chi2_contingency
-------------本文结束感谢您的阅读-------------