4

我有一些数据需要测试,看看它是否来自具有未知参数的Weibull 分布。R中我可以使用https://cran.r-project.org/web/packages/KScorrect/index.html但我在 Python 中找不到任何东西。

使用 scipy.stats 我可以拟合参数:

scipy.stats.weibull_min.fit(values)

然而,为了把它变成一个测试,我认为我需要执行一些蒙特卡罗模拟(例如https://en.m.wikipedia.org/wiki/Lilliefors_test)我不知道该怎么做。

如何在 Python 中进行这样的测试?

4

2 回答 2

4

Lilliefors 测试在OpenTURNS中实现。为此,您必须使用与您想要适应的分布相对应的工厂。在以下脚本中,我模拟了大小为 10 的 Weibull 样本,并使用等于 1000 的样本大小执行 Kolmogorov-Smirnov 检验。这意味着 KS 统计量被模拟了 1000 次。

import openturns as ot
sample=ot.WeibullMin().getSample(10)
ot.ResourceMap.SetAsUnsignedInteger("FittingTest-KolmogorovSamplingSize",1000)
distributionFactory = ot.WeibullMinFactory()
dist, result = ot.FittingTest.Kolmogorov(sample, distributionFactory, 0.01)
print('Conclusion=', result.getBinaryQualityMeasure())
print('P-value=', result.getPValue())

更多细节可以在以下位置找到:

于 2019-11-28T22:39:08.393 回答
-1

一种解决方法:估计分布参数,从估计的分布中提取数据并运行 KS 测试以检查两个样本是否来自相同的分布。

让我们创建一些“原始”数据:

>>> values = scipy.stats.weibull_min.rvs( 0.33, size=1000)

现在,

>>> args = scipy.stats.weibull_min.fit(values)
>>> print(args)
(0.32176317627928856, 1.249788665927261e-09, 0.9268793667654682)

>>> scipy.stats.kstest(values, 'weibull_min', args=args, N=100000)

KstestResult(statistic=0.033808945722737016, pvalue=0.19877935361964738)

最后一行相当于:

 scipy.stats.ks_2samp(values, scipy.stats.weibull_min.rvs(*args, size=100000))

因此,一旦您估计了分布的参数,您就可以非常可靠地对其进行测试。但是scipy估计器不是很好,我运行了几次才“接近”原始分布。

于 2019-08-27T10:19:26.957 回答