使用参数进行 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。
所以我的问题是:
- 为什么我不能添加 loc 值,它代表什么?
- 改变比例会显着改变结果,为什么以及要做什么?
- 我将如何以有意义的方式将其绘制出来?
根据 运行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
我正在尝试 运行 对某些数据进行 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。
所以我的问题是:
- 为什么我不能添加 loc 值,它代表什么?
- 改变比例会显着改变结果,为什么以及要做什么?
- 我将如何以有意义的方式将其绘制出来?
根据 运行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