You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scipy中permutation_test与ranksum检验结果差异及方法选择疑问

问题分析与解决方案

1. 为什么两种方法p值差异巨大?

核心问题是在permutation_test中错误使用了ranksums作为统计量函数,这导致逻辑偏差:

  • ranksums是完整的假设检验函数,返回的是基于渐近正态近似的标准化Z统计量,而非置换检验需要的原始秩和统计量。
  • 置换检验的p值通过随机置换两组数据、重算统计量得到零分布后统计得出。用ranksums的Z统计量作为置换检验的统计量,相当于在置换过程中重复做渐近近似检验,完全偏离了置换检验的逻辑。
  • 另外,permutation_test设置n_resamples=9999时,能得到的最小p值是1/(9999+1)=0.0001,对应-log10p=4,你得到的-log10p=3是合理结果;而ranksums用大样本渐近近似,样本量极大时能计算出极小的p值(如你得到的-log10p=150),这是两种方法的本质差异导致的。

2. 为什么ranksums结果波动明显?

ranksums是确定性计算,结果应完全固定。如果出现波动,大概率是你的数据每次运行时存在变化(比如重复加载数据引入随机性、数据本身有动态生成部分),而非函数本身的问题。反过来,permutation_test因随机置换抽样,每次运行结果会有微小波动,设置random_state参数可固定结果。

3. 修正后的置换检验代码

需要定义直接计算原始秩和的统计量函数,而非调用ranksums:

from scipy.stats import ranksums, permutation_test, rankdata
import numpy as np

x = disease['Theta']
y = nodisease['Theta']

# 自定义秩和统计量函数:计算疾病组数据的秩和
def ranksum_statistic(x, y, axis):
    # 合并两组数据
    combined = np.concatenate([x, y], axis=axis)
    # 计算所有数据的秩(处理平局情况)
    ranks = rankdata(combined, axis=axis)
    # 返回疾病组数据的秩和
    return ranks[:len(x)].sum(axis=axis)

# 运行置换检验(增加重采样次数提高精度,设置random_state固定结果)
perm_result = permutation_test(
    x, y, ranksum_statistic,
    permutation_type='independent',
    n_resamples=99999,  # 增加重采样次数,提升小p值的估计精度
    alternative='greater',
    axis=0,
    random_state=42
)

# 对比ranksums结果
ranksum_result = ranksums(x, y, alternative='greater')

print(f"置换检验p值: {perm_result.pvalue}, -log10p: {-np.log10(perm_result.pvalue)}")
print(f"秩和检验p值: {ranksum_result[1]}, -log10p: {-np.log10(ranksum_result[1])}")

4. 方法选择建议

结合你的需求(比较不同大小的独立非参数数组,无病组为零分布),两种方法的适用场景如下:

  • 优先用ranksums:当两组样本量都较大(每组≥50个样本),渐近正态近似足够可靠,计算速度快,能得到精确的极小p值,适合你当前大样本场景。
  • 用置换检验:当样本量较小,或对渐近近似的假设存疑时,置换检验更稳健,但需注意:
    • 要增加n_resamples(如1e5以上)提升小p值的估计精度;
    • 置换检验无法估计小于1/(n_resamples+1)的p值,若需-log10p>5的结果,置换检验计算成本极高,此时渐近近似更实用;
  • 无论选哪种方法,不要只看p值,要结合效应大小(如两组中位数差异、秩和相对大小)判断结果实际意义——样本量极大时,微小差异也会得到显著p值,但可能无临床或实际价值。

内容的提问来源于stack exchange,提问作者HappyDuppy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:03:22