判断数据是否服从某一分布(二)——简单易用fitdistrplus包
一、对数据的分布进行初步判断
1.1 原理
对于不同的分布,有特定的偏度(skewness)和峰度(kurtosis),正态分布、均匀分布、逻辑斯谛分布、指数分布的偏度和峰度都是特定的值,在偏度-峰度图中是特定的点,而伽马分布和对数正态分布在偏度-峰度图中是一条直线,贝塔分布在偏度-峰度图中是一片区域。因此可以通过未知分布的偏度峰度值(在图中是一个观察点),与各种分布的偏度峰度点(线、区域)进行对比,判断未知分布数据大致可能的一个或几个分布。
1.2 R代码
library(fitdistrplus)
descdist(data, discrete = FALSE, boot = NULL, method = "unbiased",
graph = TRUE, obs.col = "darkblue", obs.pch = 16, boot.col = "orange") #data就是输入的数据,向量;discrete是否使离散的分布;boot,默认从数据的bootstrap样品中得到偏度-峰度点;method,默认“unbiased样品的无偏估计值,也可“sample",样品值;graph,是否图画出来;obs.col,点的颜色;obs.pch,点的样式;boot.col,点图中bootstap样品的颜色。
二、进一步判断数据对某分布的服从程度
2.1 原理
通过maximum likelihood (mle), moment matching (mme), quantile matching (qme) or maximizing goodness-of-fit estimation (mge)几种方法将单变量分布拟合为非截尾数据。
2.2 R代码
fitdist(data, distr, method = c("mle", "mme", "qme", "mge"),
start=NULL, fix.arg=NULL, discrete=FALSE, keepdata = TRUE, keepdata.nb=100, ...) #data,输入的数据;distr,待拟合的分布,偏度-峰度图上出现的分布,也可以是自己写的函数;method方法,默认mle(最大似然估计);start,如果有自己写的分布并且需要填入起始变量值的话,start就是需要输入的分布起始值;fix.arg,指定待拟合分布的参数;discrete是否是离散的分布;keepdata,确定返回的是数据集还是数据子集,默认返回数据集;keepdata.nb,如果keepdata值为FALSE,keppdata.nb的值决定长度大于多少的子集才返回。
三、实例
例一
引入《判断数据是否服从某一分布(一)》中例二。
数据:
某公司接到一次电话的时间间隔,30个数据(单位:分钟):
0.8 11.7 2.8 11.9 6.1 1
34.8 3.8 5.2 15.0 10.3 12.3
8.2 0.6 1.7 14.5 8.3 28.9
3.1 7.3 10.2 8.9 0.1 15.5
5.7 0.7 8.3 0.9 40.7 2.9
分析:
library(fitdistrplus)
x<-c(0.8,11.7,2.8,11.9,6.1,1,
34.8,3.8,5.2,15.0,10.3,12.3,
8.2,0.6,1.7,14.5,8.3,28.9,
3.1,7.3,10.2,8.9,0.1,15.5,
5.7,0.7,8.3,0.9,40.7,2.9)
descdist(x)
由图可知,观察点接近的分布有gamma分布和指数分布。
首先判断数据对gamma分布的服从程度:
fitdist(x, "gamma")
再判断对指数分布的服从程度:
fitdist(x, "exp")
由上述结果可知,指数分布的Std.Error(标准误)更小。所以数据更服从指数分布。
参考文献
https://cran.r-project.org/web/packages/fitdistrplus/fitdistrplus.pdf