首先準備兩個樣本: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爲準.