如何检查我的数据是否符合指数分布?

机器算法验证 r 分布 拟合优度 指数分布
2022-01-29 15:48:02

我如何检查我的数据(例如薪水)是否来自 R 中的连续指数分布?

这是我的样本的直方图:

在此处输入图像描述

. 任何帮助将不胜感激!

3个回答

我会通过首先使用 估计唯一的分布参数rate来做到这一点fitdistr这不会告诉您分布是否适合,因此您必须使用拟合优度检验。为此,您可以使用ks.test

require(vcd)
require(MASS)

# data generation
ex <- rexp(10000, rate = 1.85) # generate some exponential distribution
control <- abs(rnorm(10000)) # generate some other distribution

# estimate the parameters
fit1 <- fitdistr(ex, "exponential") 
fit2 <- fitdistr(control, "exponential")

# goodness of fit test
ks.test(ex, "pexp", fit1$estimate) # p-value > 0.05 -> distribution not refused
ks.test(control, "pexp", fit2$estimate) #  significant p-value -> distribution refused

# plot a graph
hist(ex, freq = FALSE, breaks = 100, xlim = c(0, quantile(ex, 0.99)))
curve(dexp(x, rate = fit1$estimate), from = 0, col = "red", add = TRUE)

在此处输入图像描述

根据我的个人经验(尽管我从未在任何地方正式找到它,请确认或纠正我),ks.test只有在您首先提供参数估计时才会运行。你不能让它自动估计参数,例如goodfit它。这就是为什么你需要这两个步骤的过程fitdistr

有关更多信息,请遵循Ricci 的优秀指南:FITTING DISTRIBUTIONS WITH R

虽然我通常建议使用诊断图(例如 QQ 图)来检查指数,但我将讨论测试,因为人们经常需要它们:

正如 Tomas 所建议的那样,Kolmogorov-Smirnov 检验不适用于检验具有未指定参数的指数。

但是,如果您调整用于参数估计的表格,您会得到 Lilliefors 的指数分布检验。

Lilliefors, H. (1969),“关于均值未知的指数分布的 Kolmogorov-Smirnov 检验”,美国统计协会杂志,卷。64 . 第 387-389 页。

Conover 的实用非参数统计中讨论了该检验的使用。

然而,在 D'Agostino & Stephens 的Goodness of Fit Techniques中,他们讨论了对 Anderson-Darling 检验的类似修改(如果我没记错的话,有点倾斜,但我认为关于如何处理指数情况的所有必要信息是可以在书中找到),并且几乎可以肯定,这对有趣的替代方案具有更大的影响力。

类似地,人们可以通过基于一个测试来估计类似 Shapiro-Francia 测试(类似于但比 Shapiro-Wilk 更简单)的东西n(1r2)在哪里r是顺序统计和指数分数之间的相关性(预期指数顺序统计)。这对应于检验 QQ 图中的相关性。

最后,人们可能会采用平滑测试方法,如 Rayner & Best 的书中(Smooth Tests of Goodness of Fit,1990 - 尽管我相信有一个更新的方法,标题中添加了 Thas 和“ in R ”)。指数情况也包括在:

JCW Rayner 和 DJ Best (1990),“拟合优度的平滑测试:概述”, 国际统计评论,卷。58,第 1 期(1990 年 4 月),第 9-17 页

Cosma Shalizi 还在他的本科高级数据分析 讲义的一章中讨论了平滑测试,或者参见他的书Advanced Data Analysis from an Elementary Point of View 的第15 章。

对于以上一些,您可能需要模拟检验统计量的分布;对于其他表可用(但在某些情况下,无论如何模拟可能更容易,或者甚至更准确地模拟自己,如 Lilliefors 测试,由于原始模拟大小有限)。

在所有这些中,我倾向于做与 Shapiro-Francia 指数等价的那个(也就是说,我会测试 QQ 图中的相关性[或者如果我正在制作表格,也许使用n(1r2), 这将拒绝相同的情况] - 它应该足够强大,可以与更好的测试竞争,但很容易做到,并且与 QQ 情节的视觉外观有令人愉悦的对应关系(甚至可以选择添加相关性和绘图的 p 值(如果需要)。

您可以使用qq-plot,这是一种图形方法,通过将它们的分位数相互绘制来比较两个概率分布。

在 R 中,没有专门针对指数分布的开箱即用的 qq-plot 函数(至少在基函数中)。但是,您可以使用这个:

qqexp <-  function(y, line=FALSE, ...) { 
    y <- y[!is.na(y)]
    n <- length(y)
    x <- qexp(c(1:n)/(n+1))
    m <- mean(y)
    if (any(range(y)<0)) stop("Data contains negative values")
    ylim <- c(0,max(y))
    qqplot(x, y, xlab="Exponential plotting position",ylim=ylim,ylab="Ordered sample", ...)
    if (line) abline(0,m,lty=2)
    invisible()
  }

在解释您的结果时:如果要比较的两个分布相似,则 qq 图中的点将大致位于 y = x 线上。如果分布是线性相关的,则 qq 图中的点将近似位于一条线上,但不一定位于 y = x 线上。