使用参数进行 K-S 测试和理解结果的问题

Issues with using parameters for a K-S test and understand the result

我正在尝试 运行 对某些数据进行 K-S 检验。现在我的代码可以工作了,但我不确定我是否理解发生了什么,而且在尝试设置 loc 时我也遇到了错误。基本上我同时获得了 KS 和 P 检验值。但是我不确定我是否完全掌握了它,足以使用结果。

我正在使用找到的 scipy.stats.ks_2samp 模块 here.

这是我运行宁

的代码
from scipy import stats

np.random.seed(12345678)  #fix random seed to get the same result
n1 = len(low_ni_sample)  # size of first sample
n2 = len(high_ni_sample)  # size of second sample

# Scale is standard deviation
scale = 3

rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, scale=scale)
rvs2 = stats.norm.rvs(high_ni_sample[:,0], size=n2, scale=scale)
ksresult = stats.ks_2samp(rvs1, rvs2)
ks_val = ksresult[0]
p_val = ksresult[1]

print('K-S Statistics ' + str(ks_val))
print('P-value ' + str(p_val))

这给出了这个:

K-S Statistics 0.04507948306145837
P-value 0.8362207851676332

现在对于我见过的那些例子,loc 是这样添加的:

rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, loc=0., scale=scale)
rvs2 = stats.norm.rvs(high_ni_sample[:,0], size=n2, loc=0.5, scale=scale)

但是,如果我这样做,我会得到这个错误:

Traceback (most recent call last):

  File "<ipython-input-342-aa890a947919>", line 13, in <module>
    rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, loc=0., scale=scale)

  File "/home/kongstad/anaconda3/envs/tensorflow/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py", line 937, in rvs
    args, loc, scale, size = self._parse_args_rvs(*args, **kwds)

TypeError: _parse_args_rvs() got multiple values for argument 'loc'

这是一张快照,显示了正在使用的两个数据集的内容。 low_ni_sample、high_ni_sample。

所以我的问题是:

  1. 为什么我不能添加 loc 值,它代表什么?
  2. 改变比例会显着改变结果,为什么以及要做什么?
  3. 我将如何以有意义的方式将其绘制出来?

根据 运行ning Silma 的建议,我偶然发现了一个新错误。

from scipy import stats

np.random.seed(12345678)  #fix random seed to get the same result
n1 = len(low_ni_sample)  # size of first sample
n2 = len(high_ni_sample)  # size of second sample

# Scale is standard deviation
scale = 3

ndist = stats.norm(loc=0., scale=scale)

rvs1 = ndist.rvs(low_ni_sample[:,0],size=n1)
rvs2 = ndist.rvs(high_ni_sample[:,0],size=n2)

#rvs1 = stats.norm.rvs(low_ni_sample[:,2], size=n1, scale=scale)
#rvs2 = stats.norm.rvs(high_ni_sample[:,2], size=n2, scale=scale)
ksresult = stats.ks_2samp(rvs1, rvs2)
ks_val = ksresult[0]
p_val = ksresult[1]

print('K-S Statistics ' + str(ks_val))
print('P-value ' + str(p_val))

出现此错误信息

    rvs1 = ndist.rvs(low_ni_sample[:,0],size=n1)

TypeError: rvs() got multiple values for argument 'size'

这个错误是因为你应该在使用它之前首先创建一个正态分布的实例:

ndist = stats.norm(loc=0., scale=scale)

然后

rvs1 = ndist.rvs(size=n1)

生成 n1 个从以 0 为中心且标准差为 scale 的正态分布中抽取的样本。 因此,该位置是您的分布的平均值。

改变尺度会改变分布的方差(你会得到更多的可变性),所以这显然会影响 KS 检验...

至于情节,我不确定我明白你的意思...如果你想绘制直方图,然后做

import matplotlib.pyplot as plt
plt.hist(rvs1)
plt.show()

或者更好,安装 seaborn 并使用它们的 distplot methods,例如 KDE。

总的来说,我建议您在进一步阅读之前尝试阅读更多关于分布和 KS 测试的内容,例如,请参阅 wikipedia page

编辑 上面显示的代码用于从标准分布中生成随机样本(我假设这是你的目标,与你的样本进行比较)。

如果你想做的是直接比较你的两个样本数据,那么你只需要

ksresult = stats.ks_2samp(low_ni_sample[:,0], high_ni_sample[:,0])

同样,这是假设 low_ni_sample[:,0]high_ni_sample[:,0] 是一维数组,其中包含许多感兴趣数量的测量值,请参见。 ks_2samp documentation