R 資料正態分佈檢驗
阿新 • • 發佈:2018-12-05
使用R檢測資料是否符合正態分佈(正態分佈檢驗)
R語言正態檢驗; R語言QQ圖; R語言概率密度曲線比較法;
詳細的方法介紹在網上已經有很多了,推薦這篇
概括得來講,主要分為4(or 5)種方法:
- 概率密度曲線比較法
- Q-Q圖法
- 經驗法則
- 夏皮羅-威爾克(Shapiro-Wilk)檢驗法,適用於50 < n < 100 時的正態性檢驗
- SPSS 規定:當樣本含量3 ≤n ≤5000 時,結果以Shapiro - Wilk (W 檢驗) 為準,當樣本含量n > 5000 結果以Kolmogorov - Smirnov 為準。而SAS 規定:當樣本含量n ≤2000 時,結果以Shapiro - Wilk (W 檢驗) 為準,規定當樣本含量n >2000 時,結果以Kolmogorov - Smirnov (D 檢驗) 為準,所以我在這裡也提一下 R語言中的 Kolmogorov-Smirnov 檢驗
ks.test(x, y, ..., alternative = c("two.sided" , "less", "greater"), exact = NULL)R語言中ks.test有四個引數,第一個引數x為觀測值向量,第二個引數y為第二觀測值向量或者累計分佈函式或者一個真正的累積分佈函式如pnorm,只對連續CDF有效。第三個引數為指明是單側檢驗還是雙側檢驗,exact引數為NULL或者一個邏輯值,表明是否需要計算精確的P值。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
我使用R編寫了一個示例函式,同時使用了概率密度曲線比較法、Q-Q圖法和夏皮羅-威爾克(Shapiro-Wilk)檢驗法。
至於經驗法則,我不是很推薦,很玄這東西。
不廢話,上碼子
#input.data應為矩陣normal_test<- function(input.data,alpha=0.05,picplot=TRUE){ if(picplot==TRUE){#畫圖形 dev.new()#新建視窗畫圖 par(mfrow=c(2,1)) #Q-Q圖法 qqnorm(input.data,main="qq圖") qqline(input.data) #概率密度曲線比較法 hist(input.data,freq=F,main="直方圖和密度估計曲線") #如果畫出的圖缺少尖端部分則使用下面這句程式碼 #hist(input.data,freq=F,main="直方圖和密度估計曲線",ylim = c(0,0.5))#使用合適的值來避免紅藍線缺少尖端部分,這裡根據已經跑出來的影象我得出0.5 lines(density(input.data),col="blue") #密度估計曲線 x<-seq(min(input.data),max(input.data),0.0001) #使用seq(),若取0.0000001太密集跑大一點的資料就容易宕機,建議0.0001 lines(x,dnorm(x,mean(input.data),sd(input.data)),col="red") #正態分佈曲線,思想是根據求每個x應該對應的標準正態y值,然後將x與求出的y放在一起做出所求資料如果按照正態分佈應該是怎樣的,並於實際密度曲線(藍線)對比 }#sd標準差 mean平均值 #夏皮羅-威爾克(Shapiro-Wilk)檢驗法【資料不能過大,範圍為3~5000,假如有一個300*300的矩陣那麼這個方法執行函式時作廢】 shapiro_result<- shapiro.test(input.data) if(shapiro_result$p.value>alpha){ print(paste("success:服從正態分佈,p.value=",shapiro_result$p.value,">",alpha)) }else{ print(paste("error:不服從正態分佈,p.value=",shapiro_result$p.value,"<=",alpha)) } shapiro_result}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
使用的時候將以上程式碼執行後資料區會得到一個名為normal_test的函式,這時就可以呼叫它了。但之前我們先對要檢驗的資料進行預處理:
mydata<- read.table("xxxxxx.tsv", header=TRUE,sep="\t")#資料讀入因人而異,我的是tsv檔案(tab分隔),且帶表頭mydata<-as.matrix(mydata)#需要轉換為矩陣
- 1
- 2
至於呼叫函式
normal_test(mydata)
- 1
即可
附上一個符合正態分佈資料畫出的圖
可以看到紅藍線擬合完美,qq圖顯示點集中在對角線上
再來一個不符合的圖
可以看到紅藍線差別大,qq圖顯示點並不集中在對角線上
visitor tracker
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net