python - 如何计算(正态)分布上的点的 p 值?

标签 python scipy statistics distribution p-value

我正在尝试计算我的指标(spearman)的 p 值,我正在尝试概括该方法,以便它可以与其他指标一起使用(而不是依赖于 scipy.stats.spearmanr)。

如何根据该分布生成点的 p 值?

该方法是否适用于非正态分布?这是正态分布的,如果我采样的点超过 100 个,情况可能会更严重。

这篇文章需要 µ=0 ,std=1 Convert Z-score (Z-value, standard score) to p-value for normal distribution in Python

from scipy import stats
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

data = np.asarray([0.027972027972027972, -0.2802197802197802, -0.21818181818181817, 0.3464285714285714, 0.15, 0.34065934065934067, -0.3216783216783217, 0.08391608391608392, -0.03496503496503497, -0.2967032967032967, 0.09090909090909091, 0.11188811188811189, 0.1181818181818182, -0.4787878787878788, -0.6923076923076923, -0.05494505494505495, 0.19090909090909092, 0.3146853146853147, -0.42727272727272725, 0.06363636363636363, 0.1978021978021978, 0.12142857142857141, 0.10303030303030303, 0.23214285714285712, -0.5804195804195805, 0.013986013986013986, 0.02727272727272727, 0.5659340659340659, 0.06363636363636363, -0.503030303030303, -0.2867132867132867, 0.07252747252747253, -0.13736263736263737, 0.21212121212121213, -0.09010989010989011, -0.2517482517482518, -0.17482517482517484, -0.3706293706293707, 0.15454545454545454, 0.01818181818181818, 0.17582417582417584, 0.3230769230769231, -0.09642857142857142, -0.5274725274725275, -0.23626373626373626, -0.2692307692307692, -0.2857142857142857, -0.19999999999999998, -0.489010989010989, -0.15454545454545454, 0.38461538461538464, 0.6, 0.37762237762237766, -0.0029411764705882353, -0.06993006993006994, -0.19999999999999998, 0.38181818181818183, 0.05454545454545455, -0.03296703296703297, 0.17272727272727273, -0.13986013986013987, -0.08241758241758242, -0.34545454545454546, 0.5252747252747253, 0.10303030303030303, 0.16783216783216784, -0.36363636363636365, -0.42857142857142855, 0.12727272727272726, -0.18181818181818182, -0.10439560439560439, -0.6083916083916084, -0.1956043956043956, 0.13846153846153847, -0.48951048951048953, -0.18881118881118883, 0.7362637362637363, -0.19090909090909092, 0.4909090909090909, 0.37142857142857144, -0.3090909090909091, -0.1098901098901099, 0.15151515151515152, -0.13636363636363635, -0.5494505494505495, 0.44755244755244755, 0.04895104895104896, -0.37142857142857144, 0.01098901098901099, 0.08131868131868132, 0.2571428571428571, -0.3076923076923077, 0.24545454545454545, 0.06043956043956044, 0.06764705882352941, 0.02727272727272727, -0.07252747252747253, 0.21818181818181817, -0.03846153846153846, 0.48571428571428577])
query_value = -0.44155844155844154

with plt.style.context("seaborn-white"):
    fig, ax = plt.subplots()
    sns.distplot(data, rug=True, color="teal", ax=ax)
    ax.set_xlabel("$x$", fontsize=15)
    ax.axvline(query_value, color="black", linestyle=":", linewidth=1.618, label="Query: %0.5f"%query_value)
    ax.legend()

# Normal Test
print(stats.normaltest(data))
# Fit the data
params = stats.norm.fit(data)
# Generate the distribution
distribution = stats.norm(*params)
distribution

enter image description here

最佳答案

根据您的评论,我将假设这些是排列测试的结果。也就是说,您从原始数据集中获得了一个值 (-0.44),而所有其他值都是通过排列数据获得的。现在您想确定您的原始值是否重要。

排列检验(在重采样的分支中)是一种非参数统计量,因此它与正态分布无关。在你的情况下,它看起来大致正常,但这既没有必要也没有必要。您可以通过多种不同的方法从排列分布中估计 p 值,最简单的选项与您的想法类似。

如果您执行了所有可能的排列,您将获得精确的分布,因此您的(两侧)p 值公式是正确的,(|t*|>=|t|)/p,其中 t* 是原始值,t 是排列后的值,p 是总排列数。

如果您执行了不完整的排列,则公式仅略有不同,(1+|t*|>=|t|)/(1+p),以说明为了随机性。

关于python - 如何计算(正态)分布上的点的 p 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599320/

相关文章:

python - 使用 scipy.signal.spectrogram 时出现错误的频谱图

java - 计算具有随机采样间隔的多个时间序列的平均值

python - 在可迭代中获取一个元素和以下元素的优雅/高效方法

python - 在python中将文件作为两个单独的部分打开

python - Scipy 标签扩张

python - `python` 中的加权高斯核密度估计

r - 如何计算分位数中观察值的数量?

python - 根据列表中的其他属性求和属性

python - Telegram 机器人在消息后发送错误 "Something went wrong, please try again"

python - 基于元素的 n 个连续实例对 pandas df 进行切片