2013年4月22日月曜日

Rで外れ値を計算する方法

Rでスミルノフ・グラブス検定を用いて外れ値を検出する方法のメモです。

調べたら今のところ以下の3つ。
同じデータを用いてそれぞれ計算してみました。

1. outliersパッケージのgrubbs.test関数

> install.packages('outliers')
> library(outliers)
> grubbs.test(df)
Grubbs test for one outlier
data:  df
G = 2.5060, U = 0.5194, p-value = 0.03119
alternative hypothesis: highest value 138.08 is an outlier

2014年1月9日追記
こちらの有り難いページによれば、typeという引数を設定することにより2つの外れ値を出すことも可能だそうです。
type=20 → 大小どちらか片側から最大2つまで外れ値を表示
type=11 → 大小両方から最大2つまでの外れ値を表示
type=10 → 大小どちらか片側から外れ値を1つ表示

2. 青木繁伸先生のSG関数

>SG(df)
[[1]]
スミルノフ・グラブス検定
data:  min(df) = 72.99
t = 1.275, df = 13, p-value = 1
[[2]]
スミルノフ・グラブス検定
data:  max(df) = 138.08
t = 2.506, df = 13, p-value = 0.03119
attr(,"class")
[1] "SG"
ここで有意水準を5%とすると、p < 0.05 の場合はその最大値または最小値が外れ値であると判断できます。リンク先の注意書きにもあるように外れ値は1個ずつ除外すべきですので、最大値または最小値を除外して再度SG関数で計算してみる必要があります。

3. 外れ値を自動的にループして除外してくれるfunction

R - 井上 潤 「外れ値の検出-1」にとても便利な関数がありました。感謝。
上の2つの方法だと、一度外れ値が見つかったらそれを自分で除外して、再度外れ値を検証しなくてはなりません。
しかし、この方法だと一個の外れ値を除外した後、自動的にループして新たに外れ値があるか検証してくれます。何度か繰り返して外れ値がすべて除外した後のデータは以下で取得できます。
  SG(x)$x

こちらも参考に。