关于 Kolmogorov Smirnov 测试的一个幼稚问题

机器算法验证 指数分布 kolmogorov-smirnov 测试 scipy
2022-04-06 20:46:25

我想测试它们是否按照指数分布分布。我可以使用在 python 中应用 Kolmogorov-Smirnov scipy.stats.kstest(data, 'expon')

但是,我认为我必须首先以某种方式规范化我的数据。否则,它将与未知速率的指数分布进行比较λ. 这是正确的,我应该怎么做?

3个回答

您可以很容易地标准化指数分布,将变量乘以速率参数(它是一个倒数比例参数)。但是,如果您从数据中估计速率参数,则 Kolmogorov–Smirnov 统计量的分布与完全指定指数分布时的分布不同。

参见Lilliefors (1969),“关于具有平均参数的指数分布的 Kolmogorov-Smirnov 检验” JASA64,325以及https://stats.stackexchange.com/a/392686/17230对一般现象的直观解释。

您可以将根据数据计算的 KS 检验统计量的观察值与参考中给出的列表临界值进行比较。或者按照@Glen_b 和@soakley 的建议自己模拟统计数据的分布。请注意,Lilliefors 指出它的分布不依赖于参数的真实值——通常适用于规模和位置参数——因此,对于给定的样本量,您可以在从标准指数分布进行模拟后执行此操作并保留结果备查; 您不需要为相同样本量的每个新数据集重复模拟。因此不涉及近似值(来自模拟错误的除外)。KS 统计量分布的差异D通过估计而不是预先指定参数并非易事: 在空值 (n=100) 下 D 分布的核平滑密度估计

Lilliefors 确实给出了一些渐近的结果(计算得相当粗糙,但对于政府工作来说已经足够好了)。Stephens 已将修正统计量的分位数制成表格

T(n)=(D0.2n)(n+0.26+0.5n)

在哪里D是 KS 检验统计量 &n样本量。根据Durbin (1975),“Kolmogorov-Smirnov 测试时参数估计与指数测试和间距测试的应用”,Biometrika62,1这些非常接近较大样本量的精确值。它们可以在Pearson & Hartley (1972), Biometrika Tables for Statisticians , CUPStephens (1974), "EDF Statistics for goodness of fit and some comparisons", JASA , 69 , 347中找到。我不知道有任何已发表的对普通 KS 检验的 p 值的修正,以接近 Lilliefors 检验的 p 值;幂律关系似乎很有用: KS 检验 p 值 (n-100)

您不需要标准化,但可以通过模拟获得拟合优度检验的 p 值。这是一些示例 R 代码,取自 Greg Snow 对类似问题的回答(KS test - R, Minitab (and Systat)):

data <- c(7.2,10.5,10.67,0.15,3.92,3.28,0.89,2.29,13.82,0.43)

simp <- replicate(100000, {x <- rexp(length(data),rate=1/mean(data));
     ks.test(x,"pexp",rate=1/mean(x))$p.value} )

mean(simp <= ks.test(data,"pexp",1/mean(data))$p.value)

该方法由 Clauset 等人描述。al 在 SIAM 论文“经验数据中的幂律分布”中。

不,您不需要标准化您的数据,因为 KS 统计量是根据原始数据定义的(实际上是根据这些数据的经验分布):

http://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test#Kolmogorov.E2.80.93Smirnov_statistic

我不知道 Python,但在 R 中,您可以按如下方式进行此测试:

x = rexp(100,1)
ks.test(x,"pexp",1)

为此,通过构造,您需要知道分布的参数。您不应该在其中插入估算器,这会破坏统计数据的收敛性,并且您必须使用不同的测试(请参阅维基百科文章)。

如果要估计参数并检查拟合模型是否良好,那么您实际需要的是拟合优度检验,对此您有多种选择:

http://en.wikipedia.org/wiki/Goodness_of_fit