R语言做正态分布检验

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    首先准备两个样本:

set.seed(0)
a <- runif(100, min = -3, max = 3)
 b <- rnorm(100, mean = 0, sd = 9)

    

    正态分布检验的方法有:

    1. ks.test()

    ks.test函数是R语言自带的函数, 对单样本或双样本做Kolmogorov-Smirnov检验, 是用来检验数据的累计函数是否来自某个确切的分布, 故如果假设的正态分布的均值和方差, 可用ks.test函数进行正态分布检验, ks.test函数的声明如下:

ks.test(x, y, ...,
        alternative = c("two.sided", "less", "greater"),
        exact = NULL)

   x: 向量, 是要验证的数据;

    y: 如果是一个向量, 则验证其和x的累计分布是否一致; 也可以是一个字符串, 比如"pnorm", 指向具有连续型累积分布函数的分布;

    ...: 如果y是一个字符串, 则在这里设置y分布的参数;

    alternative: 备择假设, 默认检验两分布的累计密度分布相同;

    exact: 是否需要计算精确的p值, 默认一个样本, 样本数少于100, 且没有相同值, 或者双样本, 样本数的乘积少于10000时, 会精确计算p值.    


    比如要检验a,b是否来自标准正态分布以及a,b是否来自同一个分布:

ks.test(a,"pnorm", mean = 0, sd = 9)  # 1.692e-12
ks.test(b,"pnorm", mean = 0, sd = 9)  # 0.2196
ks.test(a, b)  # 1.001e-07


    2. shapiro.test()

    shapiro.test函数也是R语言自带的一个函数, 用来做Shapiro-Wilk正态性检验, 函数声明如下:

shapiro.test(x)

    x: 需要做正态性检验的数据, 非缺失值个数应在3到5000个.

    

    比如要检验a,b是否来自正态分布:

shapiro.test(a)  # 0.002126
shapiro.test(b)  # 0.1671


    3. nortest包

    只有5个函数的包, 而这5个函数都是用来做正态性检验的, 5个函数的声明如下:   

ad.test(x)
cvm.test(x)
lillie.test(x)
pearson.test(x, n.classes = ceiling(2 * (n^(2/5))), adjust = TRUE)
sf.test(x)

    x: 要验证正态性的数据;

    n.classes: 分组的数目, 默认以Moore (1986)为准;

    adjust: p值的计算是否需要调整, 默认为TRUE, 则计算的时候认为统计量来自自由度为n.classes - 3的卡方分布, 否则来自自由度为n.classes - 1的卡方分布.


    ad.test是Anderson-Darling正态性检验,;

    cvm.test是Cramer-von Mises正态性检验;

    lillie.test是Lilliefors (Kolmogorov-Smirnov)正态性检验;

    pearson.test是pearson卡方正态性检验;

    sf.test是Shapiro-Francia正态性检验, 用这些检验验证a,b的正态性.

ad.test(a)  # 0.002495
cvm.test(a)  # 0.004729
lillie.test(a)  # 0.03081
pearson.test(a)  # 0.1667
sf.test(a)  # 0.008442

ad.test(b)  # 0.09009
cvm.test(b)  # 0.1537
lillie.test(b)  # 0.0235
pearson.test(b)  # 0.003961
sf.test(b)  # 0.1458


   4. fBasics包

    fBasics包是一个处理金融数据的基础包, 包含了6个正态性检验的函数, 并且包含了nortest包的5个正态性检验函数, 声明如下: 

ksnormTest(x, title = NULL, description = NULL)

jarqueberaTest(x, title = NULL, description = NULL)
dagoTest(x, title = NULL, description = NULL)

jbTest(x, title = NULL, description = NULL)
shapiroTest(x, title = NULL, description = NULL)
normalTest(x, method = c("sw", "jb"), na.rm = FALSE)

adTest(x, title = NULL, description = NULL)
cvmTest(x, title = NULL, description = NULL)
lillieTest(x, title = NULL, description = NULL)
pchiTest(x, title = NULL, description = NULL)
sfTest(x, title = NULL, description = NULL)

    x: 数值向量或者是S4对象形式的时间序列;

    tittle: 可以指定输出标题;

    description: 可以指定输出详细情况;

    method: normalTest函数的参数, 设定正态性检验的函数;

    na.rm: normalTest函数的参数, 检验前是否删除NA数据, 默认为FALSE.


    ksnormTest进行Kolmogorov-Smirnov正态性检验;

    jarqueberaTest进行Jarque-Bera正态性检验;

    dagoTest进行D'Agostino正态性检验;

    jbTest进行JB LM和ALM检验;

    shapiroTest进行Shapiro-Wilk's正态检验;

    normalTest是为了兼容SPlus/Finmetrics而设置的函数, method可以设置成"ks","jb","da","sw","ad", 从而调用ksnormTest, jarqueberaTest, dagoTest,  shapiroTest, adTest函数得到结果, 默认为shapiroTest的结果;

    adTest是兼容nortest包中的ad.test函数;

    cvmTest是兼容nortest包中的cvm.test函数;

    lillietest是兼容nortest包中的lillie.test函数;

    pchiTest是兼容nortest包中的pearson.test函数;

    sfTest是兼容nortest包中的sf.test函数.


    用这11个函数做正态性检验:

ksnormTest(scale(a))  # 0.345 0.1734 0.4033
jarqueberaTest(a)  # 0.0548 
dagoTest(a)  # 4.732e-07 0.7064 7.292e-08
jbTest(a)  # 0.045 0.053 0.055
shapiroTest(a)  # 0.002126
normalTest(a)  # 0.002126
adTest(a)  # 0.002495
cvmTest(a)  # 0.004729
lillieTest(a)  # 0.03081
pchiTest(a)  # 0.1667 0.2919 
sfTest(a)  # 0.008442

ksnormTest(scale(b))  # 0.3136 0.6009 0.1574  
jarqueberaTest(b)  # 0.3622 
dagoTest(b)  # 0.3686 0.1781 0.6689
jbTest(b)  # 0.274 0.293 0.362
shapiroTest(b)  # 0.1671
normalTest(b)  # 0.1671
adTest(b)  # 0.09009
cvmTest(b)  # 0.1537
lillieTest(b)  # 0.0235
pchiTest(b)  # 0.003961 0.01131 
sfTest(b)  # 0.1458


     Kolmogorov-Smirnov能检验数据是否来自某个特定的分布(连续分布), 而ksnormTest函数只能检验数据是否来自标准正态分布;

     Kolmogorov-Smirnov检验和Lilliefor检验在样本数大于100的时候, 会用近似计算p值, 比较不精准, 但是随着样本数的增加近似结果会变好.

    pearson卡方正态性检验和Kolmogorov-Smirnov检验都采用实际频数和期望频数进行检验, 前者既可用于连续总体, 又可用于离散总体, 而Kolmogorov-Smirnov检验只适用于连续和定量数据.

    Shapiro-Wilk检验只适用于小样本场合, 在一些软件里面, 只在样本数小于2000时选用这个方法, 其他方法的检验功效一般随样本容量的增大而增大.

    Jarque-Bera检验易受异常值的影响, 检验功效就会降低.

    Shapiro-Wilk检验和Lilliefor检验都是进行大小排序后得到的,所以易受异常值的影响.

    pearson卡方正态性检验的检验结果依赖于分组,而其他方法的检验结果与区间划分无关.

    假设检验的目的是拒绝原假设, 当p值不是很大时, 应根据数据背景再作讨论.


    由上面的结果可以看出, 不同的检验可以得到完全不一样的结论, 一般而言, 我们不去做所有的检验, 可根据具体情况衡量用哪种方法分析.    


    PS:

    SPSS 规定: 当样本含量3 ≤ n ≤ 5000时, 结果以Shapiro-Wilk为准, 当样本含量n > 5000结果以Kolmogorov-Smirnov为准.

    而SAS 规定: 当样本含量n ≤ 2000时, 结果以Shapiro-Wilk为准, 当样本含量n >2000时, 结果以Kolmogorov-Smirnov为准.


转载于:https://my.oschina.net/u/1791586/blog/293114

你可能感兴趣的:(r语言,python)