python - scipy.stats.ttest_1samp 的基于排列的替代方案

标签 python scipy permutation t-test

我想使用 scipy.stats.ttest_1samp 的基于排列的替代方案测试我的观察平均值是否显着大于零。 我偶然发现scipy.stats.permutation_test但我不确定这是否也可以用于我的情况?我还偶然发现了mne.stats.permutation_t_test这似乎可以满足我的要求,但如果可以的话,我想坚持使用 scipy。

示例:

import numpy as np
from scipy import stats

# create data
np.random.seed(42)
rvs = np.random.normal(loc=5,scale=5,size=100)

# compute one-sample t-test 
t,p = stats.ttest_1samp(rvs,popmean=0,alternative='greater')

最佳答案

可以使用permutation_test执行此测试。使用permutation_type='samples',它会“排列”观察值的符号。假设数据已按上述方式生成,则可以按如下方式进行测试

from scipy import stats
def t_statistic(x, axis=-1):
    return stats.ttest_1samp(x, popmean=0, axis=axis).statistic

res = stats.permutation_test((rvs,), t_statistic, permutation_type='samples')
print(res.pvalue)

如果您只关心 p 值,则使用 np.mean 作为统计量而不是 t_statistic 可以获得相同的结果。

诚然,只有一个样本的 permutation_type='samples' 的这种行为有点隐藏在文档中。

Accordingly, if data contains only one sample, then the null distribution is formed by independently changing the sign of each observation.

但是产生相同 p 值的测试也可以作为双样本测试来执行,其中第二个样本是数据的负值。为了避免特殊情况,这实际上是 permutation_test 在幕后所做的事情。

在这种情况下,上面的示例代码现在比 permutation_test 快得多。不过,我会尝试在 SciPy 1.10 中改进这一点。

关于python - scipy.stats.ttest_1samp 的基于排列的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73569894/

相关文章:

python - 有条件地将 pandas.DataFrame 中的值替换为之前的值

python - 在 Cython 的 cdef 语句中使用 scipy.integrate.quad?

algorithm - 电话号码关键数字/字母排列

c# - 生成集合的排列 - 高效且有区别

建议重构的 Python 工具

python - 创建 numpy 二维索引数组的最快方法

python - 比较两列中的值并提取数据框中第三列的值

python - 给定分散的输入数据构建二维插值器

python - 在不创建 for 循环或函数的情况下对每一列进行线性回归

c++ - 确定两个字符串是否互为排列的程序的时间复杂度