スミルノフ・グラブス検定は、正規分布を仮定した標本において、最大値または最小値が外れ値かどうか判定する検定の一つです。
外れ値を除去する際、外れ値を一つずつ検証することよりも、外れ値がすべて除去されたデータだけがほしいときもあると思います。

ここでは、正規分布を仮定したデータからスミルノフ・グラブス検定を繰り返し用いて外れ値を除去するソースコードをご紹介します。
このソースコードは、次のサイトのソースコードを参考にさせていただきました。

R — スミルノフ・グラブス検定

さっそくだが、スミルノフ・グラブス検定を繰り返し用いて外れ値を除去するソースコードは次になります。


remove.outliers <- function(x, conf.level = 0.95)
{
  x <- x[!is.na(x)]
  del.val <- NULL
  
  while (TRUE) {
    n <- length(x)
    if (n < 3) {
      break
    }
    
    r <- range(x)
    t <- abs(r - mean(x)) / sd(x)
    q2 <- (n - 2) / ((n - 1) ^ 2 / t ^ 2 / n - 1)
    q2[q2 < 0] <- 0
    q <- sqrt(q2)
    p <- n * pt(q, n - 2, lower.tail = FALSE)
    
    if (t[1] < t[2]) {
      if (p[2] < 1 - conf.level) {
        del.val <- c(del.val, r[2])
        x <- x[x != r[2]]
        next
      }
    } else {
      if (p[1] < 1 - conf.level) {
        del.val <- c(del.val, r[1])
        x <- x[x != r[1]]
        next
      }
    }
    break
  }
  return(list(x = x, del.val = del.val))
}

参考にさせていただいたサイトにあるデータで試すと、次のようになり結果は一致します。


> x <- c(133, 134, 134, 134, 135, 135, 139, 140, 140, 140,
         141, 142, 142, 144, 144, 147, 147, 149, 150, 164)
> remove.outliers(x)
$x
 [1] 133 134 134 134 135 135 139 140 140 140 141 142 142 144 144 147 147 149 150

$del.val
 [1] 164

このデータに対して極端な値を追加して試すと、次のようになり、外れ値がすべて除去されたデータだけが手に入ります。


> x <- c(-100, -50, 133, 134, 134, 134, 135, 135, 139, 140, 140, 140,
          141, 142, 142, 144, 144, 147, 147, 149, 150, 164, 200, 300)
> remove.outliers(x)
$x
 [1] 133 134 134 134 135 135 139 140 140 140 141 142 142 144 144 147 147 149 150

$del.val
 [1] -100  -50  300  200  164

追記

あるデータを用いたときに、次のようなエラーが出る事例をご報告いただきました。
上記のコードは以下のエラーが出ないように変更したコードになります。
ご報告いただいた方へ、この場を借りてお礼申し上げます。


 if (p[2] < 1 - conf.level) { でエラー: 
   TRUE/FALSE が必要なところが欠損値です 
 追加情報:  警告メッセージ: 
 sqrt((n - 2)/((n - 1)^2/t^2/n - 1)) で:   計算結果が NaN になりました 

関連する記事

  • Bioconductor Workflowパッケージ一覧Bioconductor Workflowパッケージ一覧 BioconductorのWorkflowパッケージの一覧をご紹介します。英語での説明文をgoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。パッケージを探す参考にしていただければ幸いです。 パッケージ確認日:2022/05/01 パッケージ数:29 1. liftOver Changing genomic coordinate […]
  • Googleアナリティクスとコレスポンデンス分析を用いた年齢別のユーザー像の捉え方Googleアナリティクスとコレスポンデンス分析を用いた年齢別のユーザー像の捉え方 ページビュー数やコンバージョン率を上げるためには、良質なコンテンツが大切であるとよく言われる。そして、良質なコンテンツを作成するためには、ユーザー像を具体的に思い描き、そのユーザーに向けてコンテンツを作成しなくてはならない。 ここでは、ページビュー数から年齢とページの関係性を視覚的に確認し、年齢別にユーザーがどのコンテンツに興味を抱くか、その傾向を探っていく。この傾向が […]
  • 地図で見る石川県金沢市の人口 2014年1月地図で見る石川県金沢市の人口 2014年1月 金沢市役所が公開している平成26年1月の住民基本台帳人口と総務省統計局が公開している地図データを基に人口、人口密度、世帯数、未成年・高齢者の年齢別などの数値および前年同月からの増減率を地図上に色分けして視覚化したものと上位・下位のランキングをご紹介する。 人口、世帯数などのデータを活用しようと考えた場合、まずは国勢調査を思いつくが、国勢調査は5年ごとに行われており、最近 […]
  • Python KNPを用いて係り受け構造を抽出する方法Python KNPを用いて係り受け構造を抽出する方法 Ubuntu14.04環境で、Python3と日本語構文・格・照応解析システムKNPを用いて係る語と受ける語のペアを抽出する方法をご紹介する。 係り受け構造を抽出するPython3のソースコードは次である。 from pyknp import KNP def […]
  • R言語 CRAN Task View:クラスター分析&有限混合モデルR言語 CRAN Task View:クラスター分析&有限混合モデル CRAN Task View:Cluster Analysis & Finite Mixture Modelsの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Friedrich Leisch, Bettina Gruen Contact: Bettina.Gruen at […]
R スミルノフ・グラブス検定を繰り返し用いて外れ値を除去する方法