R语言将任意概率密度变成经验分布 r语言概率积分变换_ci


假设手上有个随机变量的n个样本值,想确定这个随机变量的概率分布,怎么做?

图像观察

首先在使用一些‘高大上’的统计方法之前,我们可以先把样本的histograme和density function先plot出来,肉眼观察一下看和哪个概率分布相似。这个方法比较主观,也很难得出一个准确的判断,但不妨碍我们先做到心中有数。


# import excel file 
x <- read_excel('fit solar distribution.xlsx',skip = 2)
hist(x). ## 柱状图
plot(density(x)) ## 概率密度图
plot(ecdf(x),main="Empirical cumulative distribution function") ## 累积概率密度


R语言将任意概率密度变成经验分布 r语言概率积分变换_r语言 转移概率矩阵_02

样本的柱状图


R语言将任意概率密度变成经验分布 r语言概率积分变换_概率分布_03

样本的概率密度图

R语言将任意概率密度变成经验分布 r语言概率积分变换_r语言 转移概率矩阵_04

样本的累积概率密度

Kolmogorov-Smirnov test

检测样本是否来源于服从某个特定理论概率分布的总体(population)。原理是将empirical cumulative distribution function (ECDF)和任意理论分布的(CDF)进行比较。只适用于连续变量。

原假设H0: 样本来自于给定的理论概率分布 The data follow the specific distribution

备择假设H1:样本不属于理论的概率分布 The data do not follow the specific distribution

把样本按升序排列


KS test 的检验统计量(test statistics)为



是理论概率分布的累积概率,


,


是小于


的样本个数。


描述的其实就是empirical CDF和理论CDF之差的最小上界。算出统计量


之后,拿它去和critical value去比较(critical value查表可得)。如果


大于critical value,也即p-value <0.05, 就要拒绝原假设,也就是说样本不来源于检验的理论概率分布。


KS检验的局限性:缺少灵活性,概率分布必须要fully specified, 也就是说,像scale, shape之类的参数不能通过样本估计得到。因为这一点,有些人更偏向于使用anderson-darling goodness-of-fit test.


library('dgof')
ks.test(x,"pweibull", shape=2,scale=1) # 检验样本是否来源于Weibull分布
# 得到p-value=2.2e-16 <0.05, 拒绝H0 -->样本不服从Weibull分布


Anderson-Darling goodness-of-fit test

AD test是在KS test的基础上修改的版本,同样是将拟合的分布和empirical分布做比较。AD test和KS test的差别在于: KS test对于分布的均值差异敏感,而AD test对于分布的尾端差异更敏感。AD test同样只适用于连续(continous)变量. 另一个局限性就是AD test能检验的分布只有:normal, lognormal, exponential, Weibull, extreme value type I, and logistic distributions。在R中,AD test可通过goftest或nortest包实现。

检验统计量



其中


,


是样本量,


是理论CDF


library('goftest')
ad.test(x,null ='pnorm', mean=mean(x), sd=sd(x), estimated = TRUE)


有一个问题是AD test每次的p-value都不太一样,比如上述代码我得到5次p值分别为0.137、0.2018、0.5498、0.1448、0.06028。虽然每次p-value的值不一样,但是每次也都大于0.05了,可以得到结论无法拒绝原假设H0,也就是样本的概率分布和正态分布没有区别。

一些其他的检验方法

  • chi-square test: 是最早的goodness of fit方法,可以检验任意的一元概率分布,变量既可离散也可连续。局限是对样本量的需求较大
  • 估计离散变量的分布:vcd包中goodfit() function
  • 检验正态分布:Cramer-von Mises test, Jarque-Bera test, Pearson chi-square test, Shapiro-Francia test, Jarque-Bera test
  • 已知理论的概率分布,想要估计参数,可通过fitdistrplus包里的fitdist() function来估计参数。这个function也可以返回aic和bic, 作为我们选择的标准: 优先选aic和bic值小的分布。
library(‘fitdistrplus')
fit.weibull <- fitdist(x, "weibull")
plot(fit.weibull)
fit.weibull$aic #aic


既然可以用fitdistr()来估计参数,那么我们可不可以把估计的参数传递给KS test 来检验样本是否服从某分布呢? 如通过fitdistr(x,"weibull") 得到shape参数估计值为6,scale为10,那么可不可以反过来把这个参数估计值传给 ks.test(x,"pweibull", shape=6, scale=10) 做Kolmogorov-Smirnov检验?听起来好像是合理的,但是答案是NO. 原因在之前提到过,如果用由样本估计得到的参数进行ks检验,得到的p-value会是非常错误的 ♀️

最后提醒一下:goodness-of-fit test并不能称得上客观,仅仅是因为goodness-of-fit test拒绝了,或是没有拒绝某个分布,并不能作为确定一个‘完美’概率分布的依据 (It's not reasonable to reject a distribution just because a gof-test rejects it; Also, it's not reasonable to validate a distribution because gof-tests do not reject it)。做完gof-test后,还是需要做一个graphical evaluation

参考文献/链接