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


22

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

这是我的样本的直方图:

在此处输入图片说明

。任何帮助将不胜感激!


1
您的变量是离散的还是连续的?指数分布定义为连续的
好奇的2013年

连续的 我想知道R中是否有任何测试来检查
stjudent

1
欢迎。fitdistr在R中寻找函数。它根据最大似然估计(MLE)方法调整概率密度函数(pdfs)。还可以在该站点中搜索pdf,fitdistr,mle和类似问题。切记这样的问题几乎需要可复制的示例来收集好的答案。同样,如果问题不仅仅与编程有关(这可能导致它成为题外话而搁置),它也会有所帮助。
Andre Silva

8
指数分布将相对于绘图位置)以直线形式绘制,其中绘图位置为(rank,等级为表示最小值),为样本大小,并且对于流行的选择包括。这提供了一个非正式测试,它可以比任何正式测试都有用或更有效。ln(11 ñ 一个1 / 2a)/(n2a+1)1na1/2
尼克·考克斯

@Berkan在他的帖子中提出了分位数图的想法。
尼克·考克斯

Answers:


29

我会首先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的出色指南:使用R拟合分布


2
+1。在这种情况下,ks.test是测试贴合度的最佳测试吗?我想你也回答了我的一个问题。
Andre Silva

4
请注意,如果要从数据本身估计参数,则应格外小心。在那种情况下,像安德森亲爱的测试可能是最好的,因为它在这种情况下很强大。
JPC

从数据估算速率参数时,在KS指数上进行检验:请参阅有关Kolmogorov Smirnov检验的幼稚问题
Scortchi-恢复莫妮卡

8

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

正如托马斯所暗示的,Kolmogorov-Smirnov检验是适合与未指定的参数测试exponentiality。

但是,如果调整表进行参数估计,则会得到Lilliefors的指数分布检验。

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

此测试的用法在Conover的《实用非参数统计》中进行了讨论。

但是,在D'Agostino和Stephens的《拟合技术善意》中,他们讨论了对安德森-达林测验的类似修改(如果我没记错的话,这有点倾斜,但是我认为关于指数情况下如何使用该测验的所有必要信息都是(可以在书中找到),并且几乎可以肯定,对于有趣的替代方案,它具有更大的威力。

同样,通过在上进行检验,可以估算出类似Shapiro-Francia检验(与Shapiro-Wilk相似,但比Shapiro-Wilk简单),其中是阶数统计量与指数分数之间的相关性(预期的指数订单统计信息)。这对应于测试QQ图中的相关性。rn(1r2)r

最后,也许可以采用平滑测试的方法,如Rayner&Best在书中所述(《拟合优度的平滑测试》,1990年-尽管我相信还有一种更新的方法,在标题中加上了Thas和“ in R ”)。指数情况也包含在:

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

Cosma Shalizi还在他的《本科生高级数据分析》 演讲笔记的一章中讨论了平滑测试,或者从基本的角度看了《高级数据分析》一的第15章

对于上述某些情况,您可能需要模拟测试统计量的分布;其他表可用(但是在某些情况下,由于原始模型的限制,无论如何,模拟起来可能更容易,甚至像Lilliefors测试一样,模拟自己的精度也更高)。

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


5

您可以使用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线上。


2
在Stata中,qexp来自SSC的是罐头实现。
尼克·考克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.