使用Python实现置换检验,输入为置换次数。

8

R是一个著名的库,用于排列测试,即perm。 我感兴趣的例子是这个:

 x <- c(12.6, 11.4, 13.2, 11.2, 9.4, 12.0)
 y <- c(16.4, 14.1, 13.4, 15.4, 14.0, 11.3)
 permTS(x,y, alternative="two.sided", method="exact.mc", control=permControl(nmc=30000))$p.value

哪些打印结果的p值为:0.01999933。 请注意,函数permTS允许我们输入置换次数= 30000。 Python中是否有类似的实现?

我正在查看Python的perm_stat,但这不是我要找的,并且似乎存在错误。

1个回答

20

这是使用蒙特卡罗方法实现排列检验的可能方法:

def exact_mc_perm_test(xs, ys, nmc):
    n, k = len(xs), 0
    diff = np.abs(np.mean(xs) - np.mean(ys))
    zs = np.concatenate([xs, ys])
    for j in range(nmc):
        np.random.shuffle(zs)
        k += diff < np.abs(np.mean(zs[:n]) - np.mean(zs[n:]))
    return k / nmc

请注意,由于该算法具有蒙特卡罗方法的特性,每次运行得到的数字不会完全相同:

>>> xs = np.array([12.6, 11.4, 13.2, 11.2, 9.4, 12.0])
>>> ys = np.array([16.4, 14.1, 13.4, 15.4, 14.0, 11.3])
>>> exact_mc_perm_test(xs, ys, 30000)
0.019466666666666667

1
第二到最后一行应该是 ... diff <= ...。[1] - Jared Wilber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接