Python 如何使用天文柯伊伯检验
我想测试一个数据集的分布与均值=0,方差=1的高斯分布有多接近 来自Python 如何使用天文柯伊伯检验,python,normal-distribution,astropy,cdf,Python,Normal Distribution,Astropy,Cdf,我想测试一个数据集的分布与均值=0,方差=1的高斯分布有多接近 来自astropy.stats的测试有一个cdf参数,来自文档:“一个可调用函数,用于评估被测试分布的cdf。将使用所有值的向量一次调用。默认值是均匀分布”,但我不知道如何使用它来测试正态分布。如果我想要一个均值为0.2、方差为2的正态分布,该怎么办 所以我使用了astropy,创建了一个随机正态分布。见下面的例子 我看到的问题是,它取决于我生成的要比较的数据点的数量。如果我使用100而不是10000个数据点,概率(fpp)将提高到
astropy.stats
的测试有一个cdf
参数,来自文档:“一个可调用函数,用于评估被测试分布的cdf。将使用所有值的向量一次调用。默认值是均匀分布”,但我不知道如何使用它来测试正态分布。如果我想要一个均值为0.2、方差为2的正态分布,该怎么办
所以我使用了astropy,创建了一个随机正态分布。见下面的例子
我看到的问题是,它取决于我生成的要比较的数据点的数量。如果我使用100而不是10000个数据点,概率(fpp)将提高到43%
我想问题是,我如何正确地做到这一点?还有,我如何解释D数字
# create data and its cdf
np.random.seed(0)
data = np.random.normal(loc=0.02, scale=1.15, size=50)
data_sort = np.sort(data)
data_cdf = [x/len(data) for x in range(0, len(data))]
# create the normal data with mean 0 and variance 1
xx = np.random.normal(loc=0, scale=1, size=10000)
xx_sort = np.sort(xx)
xx_cdf = [x/len(xx) for x in range(0, len(xx))]
# compute the pdf for a plot
x = np.linspace(-4, 4, 50)
x_pdf = stats.norm.pdf(x, 0, 1)
# we can see it all in a plot
fig, ax = plt.subplots(figsize=(8, 6))
plt.hist(xx, bins=20, density=True, stacked=True, histtype='stepfilled', alpha=0.6)
plt.hist(data, density=True, stacked=True, histtype='step', lw=3)
plt.plot(x, x_pdf, lw=3, label='G($\mu=0$, $\sigma^2=1$)')
ax2 = ax.twinx()
ax2.plot(xx_sort, xx_cdf, marker='o', ms=8, mec='green', mfc='green', ls='None')
ax2.plot(data_sort, data_cdf, marker='^', ms=8, mec='orange', mfc='orange', ls='None')
# Kuiper test
D, fpp = kuiper_two(data_sort, xx_sort)
print('# D number =', round(D, 5))
print('# fpp =', round(fpp, 5))
# Which resulted in:
# D number = 0.211
# fpp = 0.14802
astropy.stats.kuiper
要求第一个参数是要测试的分布的样本,第二个参数是要测试的分布的CDF
此变量是一个可调用的,
,它希望自己是一个样本,在累积分布函数下返回该样本的值。您可以使用scipy.stat
的CDF来实现这一点。通过使用functools.partial
我们可以设置任何参数
来自scipy导入统计信息
从scipy.stats导入norm
从astropy.stats导入柯伊伯
从functools导入部分
从随机导入洗牌
np.random.seed(0)
数据=np.随机.正常(loc=0.02,刻度=1.15,尺寸=50)
打印(柯伊伯(数据,部分(norm.cdf,loc=0.2,scale=2.0)))
#输出:(0.225218027033838,0.08776036566607946)
#如果您想知道,不必对数据进行排序:
洗牌(数据)
打印(柯伊伯(数据,部分(norm.cdf,loc=0.2,scale=2.0)))
#输出:(0.225218027033838,0.08776036566607946)
在这张图中,您可以了解柯伊伯统计V衡量的是什么:
[]
如果共享比较分布的参数,则距离较低,且各基础CDF相同的估计概率增加:
print(柯伊伯(数据,部分(norm.cdf,loc=0.02,scale=1.15)))
#输出:(0.14926352419821276,0.68365004302431)
相反,函数astropy.stats.kuiper_two期望两个经验数据样本相互比较。因此,如果要与具有可处理CDF的分布进行比较,最好直接使用CDF(使用kuiper
),而不是从比较分布(使用kuiper\u two
)进行采样
还有一点挑剔。除了在非CDF的变量名中使用CDF外,此公式的可读性远高于上述公式:
data\u cdf=np.linspace(0.0,1.0,len(数据),endpoint=False)
xx_cdf=np.linspace(0.0,1.0,len(xx),endpoint=False)
astropy.stats.kuiper
要求第一个参数是要测试的发行版的样本,第二个参数是要测试的发行版的CDF
此变量是一个可调用的,
,它希望自己是一个样本,在累积分布函数下返回该样本的值。您可以使用scipy.stat
的CDF来实现这一点。通过使用functools.partial
我们可以设置任何参数
来自scipy导入统计信息
从scipy.stats导入norm
从astropy.stats导入柯伊伯
从functools导入部分
从随机导入洗牌
np.random.seed(0)
数据=np.随机.正常(loc=0.02,刻度=1.15,尺寸=50)
打印(柯伊伯(数据,部分(norm.cdf,loc=0.2,scale=2.0)))
#输出:(0.225218027033838,0.08776036566607946)
#如果您想知道,不必对数据进行排序:
洗牌(数据)
打印(柯伊伯(数据,部分(norm.cdf,loc=0.2,scale=2.0)))
#输出:(0.225218027033838,0.08776036566607946)
在这张图中,您可以了解柯伊伯统计V衡量的是什么:
[]
如果共享比较分布的参数,则距离较低,且各基础CDF相同的估计概率增加:
print(柯伊伯(数据,部分(norm.cdf,loc=0.02,scale=1.15)))
#输出:(0.14926352419821276,0.68365004302431)
相反,函数astropy.stats.kuiper_two期望两个经验数据样本相互比较。因此,如果要与具有可处理CDF的分布进行比较,最好直接使用CDF(使用kuiper
),而不是从比较分布(使用kuiper\u two
)进行采样
还有一点挑剔。除了在非CDF的变量名中使用CDF外,此公式的可读性远高于上述公式:
data\u cdf=np.linspace(0.0,1.0,len(数据),endpoint=False)
xx_cdf=np.linspace(0.0,1.0,len(xx),endpoint=False)