2018/07/31 Last update
このページは Smirnov-Grubbs 検定 @本家UBサイト に恒久的に移転しました。このページもネット上に残っていますが、最新の情報はリンク先を参照して下さい。
関連項目
t 検定を理解するために
以下の順に読んで下さい。
Smirnov-grubbs test(単に grubbs test という場合もある)は,データが正規分布に従うとき,含まれる外れ値を検出する方法である(1, 3)。
帰無仮説: 全てのデータは同じ母集団からのものである。
対立仮説: データのうち,最大のものは外れ値である。
R でスミルノフ・グラブス検定をかける方法の一つは,文献1の群馬大学の関数を使わせてもらうことである。ソースは文献1のリンク先にあるが,念のためここにも転載させて頂く。方法を英語にし,コメント部分は改行の関係で一部割愛させて頂いた。
SG <- function(x) # データベクトル
{
method <- "Smirnov-Grubbs test"
data.name <- paste(c("min(", "max("), deparse(substitute(x)), ") = ", range(x, na.rm=TRUE), sep="")
x <- x[!is.na(x)] # 欠損値を除く
n <- length(x) # 標本サイズ
t <- abs(range(x)-mean(x))/sd(x) # 最大・最小データの検定統計量を計算
p <- n*pt(sqrt((n-2)/((n-1)^2/t^2/n-1)), n-2, lower.tail=FALSE) # P 値も2通り計算される
p <- sapply(p, function(p0) min(p0, 1))
result <- list(method=method, parameter=c(df=n-2))
result1 <- structure(c(result, list(data.name=data.name[1], statistic=c(t=t[1]), p.value=p[1])), class="htest")
result2 <- structure(c(result, list(data.name=data.name[2], statistic=c(t=t[2]), p.value=p[2])), class="htest")
return(structure(list(result1, result2), class="SG"))
}
手順としては,
[[1]] Smirnov-Grubbs test
data: min(x) = 1
t = 0.4477, df = 8, p-value = 1
[[2]] Smirnov-Grubbs test
data: max(x) = 100
t = 2.8356, df = 8, p-value = 3.964e-09
R のパッケージを使って Grubbs" test を行う方法もある。こちらの方がスクリプトがシンプルで良さそうである。
> install.packages("outliers") #パッケージ"outliers"のインストール
サーバーを選択し,outliers というパッケージをダウンロードする。成功すると
The downloaded binary packages are in
/var/folders/...省略.../downloaded_packages
というメッセージが出る。次に
> library(outliers)
でこのライブラリーを読み込む。> search() で現在自分が読み込んでいるパッケージの一覧を確認することができる。これが完了したら,上と同様に,1 - 9 と100を要素としてもつデータセット x を作って Grubbs' test を行ってみる。
> x=c(1,2,3,4,5,6,7,8,9,100)
> grubbs.test(x)
結果は
Grubbs test for one outlier
data: x
G = 2.8356, U = 0.0073, p-value = 3.964e-09
alternative hypothesis: highest value 100 is an outlier
となり,100が外れ値であることがわかる。P値が上記の Smirnov-Grubbs test と同じなので,同じ検定をかけているものと思われる。なお,R を再起動したときは > library(outliers) からやらないと関数がみつからないようだ。
データフレームの作成の際に,エクセルからのコピーをしたりすると,データが
> x=read.table(pipe("pbpaste"))
> x
V1
1 1
2 2
3 3
4 4
5 5
6 100