Scipy ttest_ind 排列测试被 equal_var 参数改变了?

Scipy ttest_ind permutation test changed by equal_var parameter?

对于 scipy.stats.ttest_ind 我认为将 permutations 参数设置为任何正数都会导致执行排列测试。我还认为,如果正在执行排列测试,则不会对两个总体的方差做出任何假设,因此应该忽略 equal_var 参数。

我发现 equal_var 参数在使用置换检验时确实会改变生成的 p 值和检验统计量。下面显示了一个简单的可重现示例:

sample1 = [34, 1200, 23, 50, 60, 50, 0, 0, 30, 89, 0, 300, 400, 20, 10, 0]
sample2 = [20, 10, 5, 0, 30, 50, 0, 100, 110, 0, 40, 10, 3, 0]

# equal_var = True
t1, p1 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000)
t2, p2 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000)
t3, p3 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000)

# equal_var = False
t4, p4 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000, equal_var=False)
t5, p5 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000, equal_var=False)
t6, p6 = stats.ttest_ind(a=sample1, b=sample2, permutations=10_000_000, equal_var=False)

上面代码运行的输出(测试统计和p值)是:

3 次排列测试 equal_var = True returns 的 p 值约为 0.15,而 3 次相同排列测试中的 3 次 equal_var = False returns p 值约为 0.10。

谁能帮我理解这里发生了什么,以及为什么 equal_var 参数会改变排列测试的结果?

据我了解,排列检验只是将每个数据随机分配给两组之一(因为在 null 下我们可以这样做)并计算均值差异。然后重复该过程 permutations 次。然后在最后通过将均值差异与我们实际采用的样本一样或更极端的排列数除以所使用的排列总数来计算 p 值。基于此,我很难理解为什么 equal_var 参数会像我们在上面的示例中看到的那样更改 p 值。

谢谢!

scipy.stats.ttest_ind计算一个样本检验统计量(t),然后计算一个样本推论检验(p-value)。参数 permutations 影响推理检验但不改变检验统计量。不管permutations参数如何,参数equal_var都会影响检验统计量。

在计算检验统计量时,如果指定了 equal_var,则检验统计量基于跨整个数据池(两个样本)计算的单一方差估计。否则,检验统计量基于与两个样本的独立均值相关的方差之和。

在计算推理测试时,如果指定 permutations,则推理测试基于 经验 bootstrap 潜在测试统计分布来自同一数据池但随机分配给样本 1 或样本 2 的结果。此推理测试未对数据样本的来源人群做出强有力的假设。

如果未指定 permutations,则推论检验基于潜在检验统计量的 理论 分布,如果两个数据样本来自以下人群,则可能出现这种分布符合某些参数假设(正态分布等)。根据 equal_var 参数使用略有不同的理论分布(因为 equal_var 影响假定的“自由度”)。