上周整理一批临床试验数据时,R语言输出了一行警告:Chi-squared approximation may be incorrect。如果放在两年前,我可能直接略过这行字,把卡方p值抄进报告就完事。但这条警告背后藏着一个很容易被忽视的事实:在2×2列联表里,只要存在期望频数小于5的单元格,卡方检验的近似分布就并不可靠,算出来的p值可能偏离真值,严重时甚至会把显著结果判成不显著。费希尔精确概率检验(Fisher's exact test)就是为这类场景准备的——它不依赖任何大样本近似,也不需要什么“期望频数大于5”的前提,而是基于超几何分布,把表格出现的概率精确地算出来。这篇文章我会把它的原理、完整手算流程和真实项目里的实操细节都过一遍,适合正在做统计分析却总被小样本卡住的分析师、生物统计方向的研究生,以及每一个想把列联表检验用得扎实些的从业者。
1. 卡方检验“失效”的边界,正是费希尔精确检验的主场
1.1 期望频数规则:决定卡方还能不能用的那根线
很多人做2×2列联表检验时,只会机械地执行“卡方检验”,并不清楚卡方检验背后其实是一次近似。Pearson卡方统计量本身并不服从卡方分布,只是在样本量足够大时,它的抽样分布会趋近于卡方分布,这个趋近的前提就是“期望频数不能太小”。那到底多小算小?统计教材里最常见的说法是:所有单元格的期望频数都应该大于等于5。但这个标准在实操中并不是铁板一块,不同教材和软件给出的规则略有差异。
比较经典的判断思路来自Cochran。他最早给出的建议是:对于2×2表,如果期望频数小于5,卡方近似的误差就会变大,最好改用精确检验。后来这个规则在一些场合被放宽为“期望频数小于5的单元格比例不超过20%,且最小期望频数不小于1”,很多统计课程也接受这个说法。但这里有个细节要注意:很多人看的是“观测频数”,不是“期望频数”。观测频数里某个格子是2,看起来很危险,但如果行列边际都比较大,对应的期望频数可能并不低;反之,观测频数可能很高,期望频数却很小。所以判断卡方能不能用,必须去算期望频数,不能直接用观测频数代替。
还有一个很多人忽略的地方:卡方近似的质量不仅取决于期望频数的大小,还和总样本量、表格维度有关。总样本量越少,离散程度越高,近似效果越差。遇到n=20左右的2×2表,哪怕期望频数勉强过了5,卡方p值和精确检验p值也可能差不少。我在实际操作中给自己定了一条线:2×2表总样本量小于等于40,或者有任何单元格期望频数小于5,就不再用卡方作为最终报告依据,直接把费希尔精确检验拿上来。这条线不是唯一的,但确实帮我在多次审稿和汇报中避开了“统计方法不当”的质疑。
1.2 卡方是近似,费希尔是精确:检验逻辑的分岔路
卡方和费希尔检验的分岔,本质上是两种统计哲学。卡方检验走的是“近似路线”:在边际固定的前提下,构造一个检验统计量,然后借用卡方分布去计算p值。这种做法计算简单、适用范围广,但它是渐近的,需要大样本兜底。费希尔则走的是另一条路:既然不管观测到哪张表,行边际和列边际都已经被原始数据锁死了,那我干脆把所有满足同样边际的表格都枚举出来,逐一计算它们出现的概率,再看当前这张表落在整个分布里的什么位置。这样得到的p值不依赖任何渐近假设,所以叫“精确”。
正因为这个逻辑,费希尔检验在小样本场景下被很多人视作“金标准”。它不需要你操心期望频数是否达标,也不存在“近似结果可能不准”的隐患。但代价也很明显:如果表格稍大一点,比如5×5的列联表,枚举所有满足边际的组合数会爆炸式增长,手算基本不可能。所以在计算机普及之前,费希尔检验几乎只用于2×2表。现在R和Python都能处理更大的表,但原理依然是枚举或高效网络算法,而不是什么新魔法。
这里需要澄清一个常见的误解:费希尔精确检验里的“精确”,指的是概率计算本身不借助近似分布,而不是说它在所有情况下都比卡方检验更“准”。事实上,由于它把边际当作固定的条件来推断,检验本身带有保守性,在样本量特别小的时候,它能检验出差异的能力反而可能比卡方更弱一些。所以别把“精确”等同于“更显著”,它只是更稳妥——宁可犯错的概率小一点,也不轻易给出激进结论。
1.3 什么时候不必上费希尔:大样本表还是交给卡方
那是不是以后所有列联表都无脑上费希尔?当然不是。卡方检验如果适用,它的优势非常明显:计算速度快、可解释性好、而且在大样本下和费希尔检验的p值会非常接近。如果你手上是一个上千样本量的2×2表,所有期望频数都远远大于5,那你用卡方和用费希尔得到的结论几乎不会有什么差别,这时选卡方完全没问题。
但有一种情况值得多说一句:即使样本量很大,如果有单元格是0,一些分析师会犹豫要不要用卡方。其实期望频数为0和观测频数为0是两回事,只要期望频数够大,卡方照用不误。反过来,观测频数出现0不一定表示卡方不能用,要看行列边际推算出的期望频数是否达标。如果某个边际是0,那实质上是结构性的零,连检验本身都没有太大意义。对这种表,费希尔检验依然能跑出一
