1. 程式人生 > >R Grubbs檢驗 和Dixon檢驗 找出異常值

R Grubbs檢驗 和Dixon檢驗 找出異常值

1、Grubbs檢驗

#---------------程式碼範例
#Grubbs檢驗
程式碼例項:                                                                       
######################################################################
#函式功能:Grubbs檢驗
#引數說明:x:要進行判斷的資料
#####################################################################
library(outliers)
grubbs<-function(x){
  x<-round(x,4)
  grubbs_outliers<-c()
  grubbs_p.value<-c()
  grubbs_g.value<-c()
  grubbs_g<-c()
  grubbs_minormax<-c()
  grubbs_pvalue<-c()
  #設定初始值判斷值
  grubbs_p<-0
  while(grubbs_p<0.05){
    grubbs_outliers<-c(grubbs_outliers,grubbs_minormax)
    grubbs_p.value<-c(grubbs_p.value,grubbs_pvalue)
    grubbs_g<-c(grubbs_g,grubbs_g.value)
    #去除最大、最小值然後再進行檢驗
    if(sum(x==grubbs_minormax)!=0)x<-x[-which(x==grubbs_minormax)]
    #若資料各值都相等則跳出
    if(sd(x)==0) break
    #進行grubbs檢驗
    grubbs_test<-grubbs.test(x,type=10,opposite=F,two.sided=F)
    grubbs_p<-grubbs_test$p.value
    grubbs_pvalue<-grubbs_test$p.value
    grubbs_g.value<-grubbs_test$statistic[1]
    grubbs_a<-strsplit(grubbs_test$alternative," ",fixed=T)
    grubbs_minormax<-as.numeric(unlist(grubbs_a)[3])
  }
  outliner_res<-data.frame(outliers=grubbs_outliers,gvalue=grubbs_g,pvalue=grubbs_p.value)
  return(outliner_res)

}

tt<-c(8.3,5.5,14,7.5,4.7,9,6.5,10.2,7.7,6.2)

grubbs(tt)

執行結果:


異常值14


2、Dixon檢驗

#Dixon檢驗
程式碼例項:                                                                       
######################################################################
#函式功能:Dixon檢驗
#引數說明:x:要進行判斷的資料
#####################################################################
library(outliers)
dixon<-function(x){
    dixon_p.value<-c()
    dixon_q.value<-c()
    dixon_q<-c()
    dixon_pvalue<-c()
    dixon_outliers<-c()
    dixon_minormax<-c()
    dixon_p<-0
    while(dixon_p<0.05){
      dixon_outliers<-c(dixon_outliers,dixon_minormax)
      dixon_p.value<-c(dixon_p.value,dixon_pvalue)
      dixon_q<-c(dixon_q,dixon_q.value)
      if(sum(x==dixon_minormax)!=0)x<-x[-which(x==dixon_minormax)]
      if(sd(x)==0) break
      dixon_test<-dixon.test(x,type=0,opposite=F,two.sided=F)
      dixon_p<-dixon_test$p.value
      dixon_pvalue<-dixon_test$p.value
      dixon_q.value<-dixon_test$statistic[1]
      dixon_a<-strsplit(dixon_test$alternative," ",fixed=T)
      dixon_minormax<-as.numeric(unlist(dixon_a)[3])
    }
    outliner_res<-data.frame(outliers=dixon_outliers,qvalue=dixon_q,pvalue=dixon_p.value)
    return(outliner_res)
  }

tt<-c(8.3,5.5,14,7.5,4.7,9,6.5,10.2,7.7,6.2)

dixon(tt)

執行結果:


沒有異常值

程式碼轉自:《R語言資料分析專案精解、理論、方法、實戰》