R語言作正態分佈檢驗

    首先準備兩個樣本:java

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

    

    正態分佈檢驗的方法有:api

    1. ks.test()less

    ks.test函數是R語言自帶的函數, 對單樣本或雙樣本作Kolmogorov-Smirnov檢驗, 是用來檢驗數據的累計函數是否來自某個確切的分佈, 故若是假設的正態分佈的均值和方差, 可用ks.test函數進行正態分佈檢驗, ks.test函數的聲明以下:ide

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

   x: 向量, 是要驗證的數據;函數

    y: 若是是一個向量, 則驗證其和x的累計分佈是否一致; 也能夠是一個字符串, 好比"pnorm", 指向具備連續型累積分佈函數的分佈;spa

    ...: 若是y是一個字符串, 則在這裏設置y分佈的參數;code

    alternative: 備擇假設, 默認檢驗兩分佈的累計密度分佈相同;orm

    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爲準.

相關文章
相關標籤/搜索