【发布时间】:2019-09-30 19:55:48
【问题描述】:
scipy.stats.kstest(rvs, cdf, N) 可以对数据集rvs 执行 KS-Test。它测试数据集是否遵循概率分布,其cdf 在此方法的参数中指定。
现在考虑一个包含N=4800 样本的数据集。我已经对这些数据执行了 KDE,因此有一个估计的 PDF。这个 PDF 看起来非常像双峰分布。在绘制估计的 PDF 和曲线拟合双峰分布时,这两个图几乎相同。拟合双峰分布的参数为(scale1, mean1, stdv1, scale2, mean2, stdv2):
[0.6 0.036 0.52, 0.23 1.25 0.4]
我如何申请scipy.stats.kstest 来测试我估计的 PDF 是否是双峰分布的?
作为我的零假设,我声明估计的 PDF 等于以下 PDF:
hypoDist = 0.6*norm(loc=0, scale=0.2).pdf(x_grid) + 0.3*norm(loc=1, scale=0.2).pdf(x_grid)
hypoCdf = np.cumsum(hypoDist)/len(x_grid)
x_grid 只是一个向量,其中包含我评估估计 PDF 的 x 值。所以pdf的每个条目都有一个对应的x_grid的值。可能是我对hypoCdf 的计算不正确。也许我应该除以np.sum(hypoDist)而不是除以len(x_grid)?
挑战:kstest 的cdf 参数不能指定为双峰。我也不能将其指定为hypoDist。
如果我想测试我的数据集是否是高斯分布的,我会这样写:
KS_result = kstest(measurementError, norm(loc=mean(pdf), scale=np.std(pdf)).cdf)
print(KS_result)
measurementError 是我执行 KDE 的数据集。这将返回:
statistic=0.459, pvalue=0.0
对我来说,pvalue 是 0.0 有点烦人
【问题讨论】:
-
您在文本中有
scale1= 0.6 和scale2= 0.23,但它们不加到1。在创建hypoDist的代码中,比例显然是0.6 和0.3 ,这也不会加到 1。您的双峰分布是两个正态分布的 mixture。对于混合分布,权重(或称其为尺度)的总和应为 1。您能否修复这些值,或解释为什么您使用的值总和不为 1? -
@WarrenWeckesser:你说得对,这很烦人。我在代码中使用的参数是我根据估计的 PDF 的图初步猜测的。参数
0.6和0.23已由我的曲线拟合返回:我已将双峰分布拟合到估计的 PDF,这些是拟合的参数 -
这是个问题。如果这些值的总和不等于 1,则您的组合 PDF 不会创建适当的概率密度函数。您的曲线拟合过程应包含这些值总和为 1 的约束。或者仅使用参数
scale1,并将scale2替换为1 - scale1。 -
好的。我只是在使用
popt_bimodal, pcov_bimodal = curve_fit(bimodal, x_grid, pdf, p0=[0.6, 0, 0.2, 0.3, 1, 0.2])。在这里,bimodal是我定义的一个函数。它只是添加了两个高斯。 ... 啊:你说 curve_fits 适合我的数据的曲线,但该曲线不是双峰分布! -
是的--
curve_fit不知道您的函数是一个 PDF,其对实线的积分必须为 1。请参阅我的答案,了解一种仅使用一个权重的方法。
标签: python scipy statistics hypothesis-test kolmogorov-smirnov