1

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

我正在使用此处找到的 scipy.stats.ks_2samp 模块。

这是我正在运行的代码

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. 我将如何以有意义的方式将其绘制出来?

在运行 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'
4

1 回答 1

1

错误来自这样一个事实,即您应该在使用它之前首先创建一个正态分布的实例:

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方法,例如 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 文档

于 2018-11-26T17:26:36.737 回答