
在医学、生物学、流行病学以及其他自然科学研究中,我们经常会遇到这样一类问题:一个分类变量具有多个可能的结果,而研究者希望判断实际观察到的频数分布是否符合某个理论分布。
例如,一项遗传学研究观察到某种性状具有3种表型,希望判断其分布是否符合理论上的1∶2∶1比例;一项临床研究将患者按照疾病严重程度分为轻度、中度和重度,希望判断观察到的比例是否符合既定标准;又或者在预测模型研究中,研究者需要判断不同类别的预测概率是否与实际结果相匹配。
这类问题通常可以使用多项分布拟合优度检验(multinomial goodness-of-fit test)。样本量较大时,Pearson 卡方检验(Pearson's chi-square test)是最常见的方法,但当样本量较小、类别较多或者某些类别的期望频数非常低时,传统的卡方渐近近似可能并不理想。
这时,精确多项式检验(exact multinomial test)提供了一种直接计算精确 P 值的方法。如果问题规模较大,以至于完整枚举所有可能结果的计算成本过高,还可以采用Monte-Carlo 模拟(Monte-Carlo simulation)来估计精确 P 值。SAS 官方文档也明确指出,当直接计算 exact P value 需要大量时间和内存,而渐近方法又可能不足时,可以使用 Monte Carlo 方法估计 exact P value。
那么,精确多项式检验究竟是什么?它和普通卡方检验有什么区别?Monte-Carlo 模拟得到的 P 值是不是“精确 P 值”?本文aje将从原理、适用条件、计算方法、实际案例以及 R 和 SAS 操作等方面进行介绍。
什么是精确多项式检验?
精确多项式检验(exact multinomial test)主要用于多项分布(multinomial distribution)的拟合优度检验。
假设一个分类变量有 (k) 个互斥类别,观察到的频数为:
[
X=(X_1,X_2,\ldots,X_k)
]
其中:
[
X_1+X_2+\cdots+X_k=n
]
研究者预先提出一个理论概率分布:
[
p=(p_1,p_2,\ldots,p_k)
]
并且:
[
p_1+p_2+\cdots+p_k=1
]
那么研究问题就是:
[
H_0:p_1=p_{10},p_2=p_{20},\ldots,p_k=p_{k0}
]
即观察到的数据是否来自假设的多项分布。
例如,假设一个骰子是公平的,那么:
[
p=(1/6,1/6,1/6,1/6,1/6,1/6)
]
如果投掷100次,观察到6个面的次数分别为:
[
(16,17,12,15,15,25)
]
我们就可以检验这一结果是否与“公平骰子”的理论分布相符。
传统方法通常使用 Pearson 卡方统计量:
[
X^2=\sum_{i=1}^{k}\frac{(O_i-E_i)^2}{E_i}
]
其中 (O_i) 是观察频数,(E_i=np_i) 是理论期望频数。
而精确多项式检验并不依赖于大样本条件下的卡方渐近分布,而是直接基于多项分布计算观察结果及更极端结果出现的概率。因此,它特别适合样本量较小或类别分布较稀疏的情况。
需要注意的是,“exact multinomial test”并不是指只有一种固定的检验统计量。现代方法可以根据不同的统计量定义“哪些结果比观察结果更加极端”,例如 Pearson χ²、log-likelihood ratio(LLR)以及 probability mass statistic 等。Resin 等人提出的算法正是针对这类 exact multinomial test 提供了高效计算方法。
精确多项式检验的基本原理
理解精确多项式检验,可以先理解传统卡方检验为什么需要“大样本”。
在 Pearson 卡方检验中,我们通常利用以下近似:
[
X^2\approx\chi^2_{k-1}
]
也就是说,当样本量足够大时,Pearson χ²统计量可以近似服从自由度为 (k-1) 的卡方分布,因此可以非常方便地计算 P 值。
问题在于,这只是一个渐近近似(asymptotic approximation)。
当样本量很小,或者理论概率分布中存在非常小的类别概率时,实际统计量的离散分布可能与连续的卡方分布存在明显差异。这时直接使用卡方分布计算 P 值可能产生偏差。
精确方法则采用不同的思路。
假设观察到:
[
x=(x_1,x_2,\ldots,x_k)
]
在原假设给定的概率 (p_1,\ldots,p_k) 下,一个具体结果出现的概率为:
[
P(X=x)=
\frac{n!}{x_1!x_2!\cdots x_k!}
\prod_{i=1}^{k}p_i^{x_i}
]
精确检验的核心就是考虑所有可能的样本结果,并根据预先确定的统计量判断哪些结果比观察结果更加极端,然后将这些结果的概率加总:
[
P\text{-value}
P(T(X)\geq T(x_{\mathrm{obs}})|H_0)
]
因此,理论上得到的是精确 P 值,而不是依赖大样本近似得到的 P 值。
为什么精确计算会很困难?
既然直接计算概率看起来并不复杂,为什么还需要 Monte-Carlo 模拟?
原因在于:所有可能结果的数量会随着样本量和类别数量迅速增加。
对于 (n) 个观察值和 (m) 个类别,所有可能的频数组合数量为:
[
{n+m-1\choose m-1}
]
这意味着,当类别数量增加时,可能结果的数量会快速增长。相关研究指出,完整枚举(full enumeration)的计算复杂度会随着类别数量呈快速增长,因此 exact multinomial test 在类别较少时比较容易处理,但面对高维问题时可能变得非常耗时。
例如,如果只有3个类别,计算所有可能的频数分配可能还比较容易;但如果有20个类别,样本量又达到几百甚至几千,直接枚举所有可能结果就会变得非常困难。
这也是精确检验中一个非常重要的现实问题:
统计意义上的“精确”,并不意味着计算成本一定很低。
现代算法已经能够显著提高 exact multinomial test 的计算效率。Resin 2023 年发表的研究提出了一种新的算法,可以避免简单的全空间枚举,并同时计算 Pearson χ²、log-likelihood ratio 等统计量对应的精确 P 值。该方法已经在 R 的 ExactMultinom 包中实现。
什么是Monte-Carlo模拟P值?
当完整精确计算过于耗时,而传统的渐近近似又不够可靠时,可以使用 Monte-Carlo 模拟。
Monte-Carlo 方法的基本思想非常简单:
既然我们无法把所有可能的数据结果全部计算一遍,那么就从原假设规定的分布中随机生成大量数据,然后观察其中有多少数据比真实观察结果更加极端。
假设我们在原假设 (H_0) 下模拟 (N) 次,得到:
[
X^{(1)},X^{(2)},\ldots,X^{(N)}
]
每次模拟都计算一个检验统计量:
[
T^{(1)},T^{(2)},\ldots,T^{(N)}
]
如果真实观察值对应的统计量为 (T_{\mathrm{obs}}),那么 Monte-Carlo P 值可以近似表示为:
[
\hat p=
\frac{#{T^{(j)}\geq T_{\mathrm{obs}}}}
{N}
]
实际软件通常会采用更具体的计数和估计方式,但核心思想就是:用大量随机样本近似原假设下的统计量分布。
因此,Monte-Carlo 方法的关键并不是重新定义一个新的检验,而是通过随机模拟解决“精确计算太困难”的问题。
SAS 官方文档也明确说明,Monte Carlo 可以用于估计 exact P value;增加模拟次数 (N) 通常会提高估计精度,但同时也会增加计算时间。SAS 的 PROC FREQ 中默认的 Monte-Carlo 模拟次数为10,000。
Monte-Carlo P值是不是“精确P值”?
这是非常容易被误解的一个问题。
严格来说:
Monte-Carlo P 值不是直接计算得到的 exact P value,而是对 exact P value 的随机模拟估计(Monte-Carlo estimate)。
二者应该区分:

因此,如果软件输出:
Monte-Carlo estimated P value
更准确的中文应该理解为:
Monte-Carlo 模拟估计的 P 值
而不是直接称为“精确 P 值”。
随着模拟次数 (N) 增加,Monte-Carlo P 值通常会越来越接近理论上的 exact P value,但它始终存在随机模拟误差。
这也是为什么严谨的软件会同时提供 Monte-Carlo P 值估计的置信区间。例如 SAS 可以通过 ALPHA= 设置 Monte-Carlo P 值估计的置信区间水平,默认 ALPHA=.01,对应99%的置信区间。
Exact、Monte-Carlo和传统卡方检验有什么区别?
这三种方法经常被放在一起比较。

如果样本量足够大、理论期望频数合理,Pearson 卡方检验通常已经能够很好地完成任务,没有必要为了追求“exact”而增加不必要的计算复杂度。
如果样本量较小,或者数据非常稀疏,则应该考虑精确方法。
如果问题规模又很大,以至于 exact computation 难以在合理时间内完成,同时渐近近似又存在明显问题,那么 Monte-Carlo 是非常有价值的折中方案。
SAS 官方文档对这一思路也有明确描述:exact tests 适用于数据较小、稀疏、偏斜或存在大量 ties 的情况;对于较大的问题,如果 exact computation 需要大量时间和内存,而 asymptotic approximation 又可能不足,则可以使用 Monte-Carlo estimation。
精确多项式检验什么时候适用?
精确多项式检验首先要求数据具有明确的多项分类结构。
例如:
- 遗传学中的多个表型类别;
- 临床研究中的多个疾病分级;
- 预测模型中的多个离散结果;
- 生态学中的物种类别;
- 调查研究中的多个互斥回答类别。
同时,研究者需要有一个明确的理论概率分布作为原假设。
例如:
[
H_0:p=(0.25,0.25,0.25,0.25)
]
或者:
[
H_0:p=(0.5,0.3,0.2)
]
如果理论概率本身也是根据同一批数据估计出来的,那么问题就会更加复杂,此时不能简单套用固定概率下的 exact multinomial test。
另外,所有类别必须是互斥的,每个观察对象最终只能归入一个类别。多项分布的基本假设还包括观察之间具有相应的独立性条件。
因此,在正式分析之前,研究者应该先确认:
数据是不是多类别分类数据?
理论概率是否在分析前已经明确?
每个观察是否只属于一个类别?
观察之间是否可以合理视为独立?
只有这些条件基本成立,精确多项式拟合优度检验才具有合理的统计解释。
一个实际例子:检验骰子是否公平
假设研究者将一个骰子投掷100次,得到:

如果骰子是公平的,那么原假设为:
[
H_0:
p_1=p_2=\cdots=p_6=1/6
]
传统 Pearson 卡方检验可以计算:
[
X^2=\sum_{i=1}^{6}
\frac{(O_i-16.67)^2}{16.67}
]
然后使用自由度:
[
df=6-1=5
]
的卡方分布计算 P 值。
但如果研究者希望避免依赖卡方渐近近似,就可以采用 exact multinomial test。
在 R 的 ExactMultinom 包中,可以直接使用类似下面的代码:
library(ExactMultinom)
p_fair <- rep(1/6, 6)
x <- c(16, 17, 12, 15, 15, 25)
multinom.test(
x,
p_fair,
stat = "Chisq",
method = "exact"
)
该程序包支持 Pearson χ²、log-likelihood ratio 和 probability mass 三种统计量,因此还可以比较:
multinom.test(
x,
p_fair,
stat = "LLR",
method = "exact"
)
或者:
multinom.test(
x,
p_fair,
stat = "Prob",
method = "exact"
)
ExactMultinom 的官方文档明确说明,这三种统计量都可以计算 exact P value,同时也支持 asymptotic 和 Monte-Carlo 方法。
如何使用Monte-Carlo方法估计P值?
如果类别数量较多,exact 方法计算时间过长,可以将 method 设置为 Monte-Carlo:
library(ExactMultinom)
p_fair <- rep(1/6, 6)
x <- c(16, 17, 12, 15, 15, 25)
multinom.test(
x,
p_fair,
stat = "Chisq",
method = "Monte-Carlo",
N = 10000
)
这里的:
N = 10000
表示从原假设分布中进行10,000次随机模拟。
如果希望降低 Monte-Carlo 模拟误差,可以增加模拟次数,例如:
N = 100000
但模拟次数越多,计算时间也会增加。
需要特别注意:如果一次运行得到:
Monte-Carlo P = 0.042
并不应该把它理解成理论精确 P 值恰好等于0.042。更准确的表述应该是:
The Monte-Carlo estimated P value was 0.042 based on 100,000 simulations.
也就是说,报告时应该同时说明模拟次数。
Monte-Carlo模拟次数应该设置多少?
这是实际科研分析中非常重要的问题。
模拟次数太少,P 值的随机误差可能比较明显;模拟次数太多,则会增加不必要的计算成本。
例如,如果真实 P 值大约为0.05,使用 (N=10,000) 次模拟时,Monte-Carlo 估计本身仍然会存在一定的随机波动。
因此,如果最终研究结论高度依赖 P=0.049 与 P=0.051 之间的细微差别,仅仅运行10,000次模拟可能并不理想。
实际分析中,可以根据问题的重要程度和计算成本选择模拟次数。探索性分析可以从10,000次开始;对于正式研究、临界 P 值或者计算资源允许的情况,可以考虑100,000次甚至更多。
更重要的是,不要只报告“Monte-Carlo P<0.05”,却不说明模拟次数。
建议至少报告:
Monte-Carlo estimated P = 0.032 based on 100,000 simulations.
如果软件提供 Monte-Carlo P 值估计的置信区间,也可以同时报告,这比单纯给出一个模拟 P 值更加严谨。
精确多项式检验与Fisher精确检验有什么区别?
两者都属于精确方法,但针对的数据结构并不一样。
Fisher 精确检验主要用于 2×2 列联表,特别是两个分类变量之间的关联分析。
而精确多项式检验主要解决的是:
一个多分类变量的观察频数是否符合预先指定的理论概率分布?
例如:

因此,不能因为它们都带有“exact”就认为它们可以互相替代。
如果你的数据是:
治疗组 × 有效/无效
可以考虑 Fisher 或 Barnard。
如果数据是:
观察到的3种表型数量是否符合1∶2∶1?
则更适合考虑 multinomial goodness-of-fit test。
精确多项式检验的优势与局限
精确多项式检验最大的优势,是它不需要依赖传统 Pearson 卡方检验的大样本渐近近似。对于小样本、低频类别以及稀疏数据,它能够提供更加直接的精确概率计算。
第二个优势是它具有较大的灵活性。现代实现并不局限于 Pearson χ²统计量,还可以使用 log-likelihood ratio 和 probability mass 等不同统计量。
但它也有明显局限。
最主要的问题是计算复杂度。随着样本量和类别数增加,所有可能结果的数量会快速增长,直接枚举整个样本空间可能变得非常昂贵。
其次,exact P value 并不是一个完全脱离统计选择的概念。研究者仍然需要确定什么样的结果应该被定义为“比观察结果更加极端”。不同统计量可能产生不同的精确 P 值。因此,不能简单地认为“exact P value只有一个”。
最后,Monte-Carlo 方法虽然可以显著降低计算负担,但它产生的是随机估计值,而不是直接枚举得到的理论精确 P 值。因此必须考虑模拟误差,并报告模拟次数。
实际科研中什么时候使用Monte-Carlo?
可以把实际选择过程简单理解为三个层次。
如果样本量较大、期望频数合理,并且 Pearson χ²的渐近条件基本满足,那么:
优先考虑 Pearson 卡方拟合优度检验。
如果样本量较小、数据稀疏,而且问题规模允许完整计算,那么:
考虑 exact multinomial test。
如果数据规模较大,直接 exact computation 的成本很高,同时又不希望依赖传统渐近近似,那么:
考虑 Monte-Carlo estimation。
也就是说:
大样本 + 条件满足 → asymptotic;
小样本 + 可以计算 → exact;
问题复杂 + exact计算成本过高 → Monte-Carlo。
这并不是一个绝对的规则。对于正式研究,最好根据研究设计、样本量、类别数量以及统计分析计划(Statistical Analysis Plan, SAP)提前确定方法。
如何在论文中报告精确多项式检验?
如果使用 exact multinomial test,可以在 Methods 中写:
An exact multinomial goodness-of-fit test was performed to assess whether the observed distribution was consistent with the prespecified multinomial probabilities.
如果使用 Pearson χ²作为检验统计量,可以进一步写:
An exact multinomial goodness-of-fit test based on Pearson’s chi-square statistic was performed.
如果使用 Monte-Carlo 方法,则应该明确说明:
Because direct computation of the exact P value was computationally intensive, the P value was estimated using a Monte-Carlo simulation with 100,000 replicates.
Results 中则可以报告:
The observed distribution differed significantly from the prespecified multinomial distribution (exact P = 0.018).
或者:
The observed distribution was not significantly different from the prespecified multinomial distribution (Monte-Carlo estimated P = 0.083 based on 100,000 simulations).
如果软件同时提供 exact P value 和 Monte-Carlo estimate,建议在 Methods 中明确说明最终采用哪一个作为主要推断结果,而不是同时运行多种方法后只挑选 P 值最小的结果。
最后
精确多项式检验主要用于判断观察到的多类别频数分布是否符合预先指定的多项分布。它与传统 Pearson 卡方拟合优度检验最大的区别,在于不依赖卡方渐近分布,而是直接利用原假设下的离散概率分布进行精确推断。
但需要特别区分两个概念:
Exact multinomial test ≠ Monte-Carlo P value。
前者是一种精确统计检验;后者主要是一种计算方法。当所有可能结果都可以有效枚举时,可以直接获得 exact P value;当问题规模过大时,则可以通过 Monte-Carlo 模拟来估计 exact P value。
因此,在科研数据分析中,真正值得关注的并不是“哪个 P 值更小”,而是数据结构、研究假设和计算方法是否匹配。对于多类别、小样本或稀疏数据,研究者应该首先判断 Pearson χ²的渐近条件是否可靠;如果不可靠,再根据问题规模选择 exact multinomial test 或 Monte-Carlo 方法。
尤其需要避免一个常见误区:Monte-Carlo 模拟得到的 P 值虽然可以非常接近 exact P value,但它本身仍然存在模拟误差。正式论文中应说明模拟次数,并在条件允许时报告相应的不确定性。
对于科研人员而言,理解“渐近检验—精确检验—Monte-Carlo估计”三者之间的关系,比单纯记住某个软件命令更加重要。这样才能在面对小样本、稀疏数据和复杂分类分布时,选择真正适合研究设计的统计方法。
