我想使用 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/