美容と年齢の多変量データをいくつか持っています。年齢の範囲は2〜20(20、22、24 .... 40)の間隔で20〜40であり、データの各レコードについて、年齢と1〜5の美しさの評価が与えられます。このデータのボックスプロット(X軸の年齢、Y軸の美しさの評価)を行うと、各ボックスのひげの外側にいくつかの外れ値がプロットされています。
データフレーム自体からこれらの外れ値を削除したいのですが、Rがボックスプロットの外れ値を計算する方法がわかりません。以下は、私のデータの例です。
美容と年齢の多変量データをいくつか持っています。年齢の範囲は2〜20(20、22、24 .... 40)の間隔で20〜40であり、データの各レコードについて、年齢と1〜5の美しさの評価が与えられます。このデータのボックスプロット(X軸の年齢、Y軸の美しさの評価)を行うと、各ボックスのひげの外側にいくつかの外れ値がプロットされています。
データフレーム自体からこれらの外れ値を削除したいのですが、Rがボックスプロットの外れ値を計算する方法がわかりません。以下は、私のデータの例です。
回答:
OK、このようなものをデータセットに適用する必要があります。置き換えて保存しないでください。データが破壊されます。そして、ところで、あなたはデータから外れ値を(ほとんど)決して削除すべきではありません:
remove_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.5 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- NA
y[x > (qnt[2] + H)] <- NA
y
}
実際の動作を確認するには:
set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()
繰り返しになりますが、決してこれを自分で行うべきではありません。=)
編集:私na.rm = TRUE
はデフォルトとして追加しました。
EDIT2:quantile
関数が削除され、添え字が追加されたため、関数が高速になりました!=)
boxplot
。それは扱いやすいので、質問に答えたので、@ Prasadの答えをマークする必要があります。「外れ値ルール」を使用して外れ値を除外するq +/- (1.5 * H)
ために分析を実行する場合は、この関数を使用します。ところで、私はグーグルなしでゼロからこれをやったので、私がこの機能を使ってホイールを再発明した可能性があります...
誰も最も簡単な答えを投稿していません:
x[!x %in% boxplot.stats(x)$out]
こちらもご覧ください:http : //www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/
result = x[!x %in% boxplot.stats(x)$out]
outline = FALSE
ボックスプロットを行うときにオプションとして使用します(ヘルプを読んでください!)。
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
out
とgroup
アイテム)を確認する必要があると思います。
関数boxplotは、プロットを実行するために使用される値を返します(実際には、bxp()によって実行されます)。
bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats) # this will plot without any outlier points
「外れ値」を削除することは統計的な過誤だと考えるので、私はわざと特定の質問に答えませんでした。それらを箱ひげ図にプロットしないことは許容できる方法であると考えますが、標準偏差の数または四分位幅の数を超えるという理由だけでそれらを削除することは、観測記録の体系的で非科学的な変換です。
外れ値の削除に関連するパッケージを検索したところ、このパッケージが見つかりました(驚くべきことに「外れ値」と呼ばれ
ています)。https
://cran.r-project.org/web/packages/outliers/outliers.pdf
外れ値を削除するさまざまな方法を確認し、その中で私がrm.outlier
使用するのに最も便利な方法を見つけました。上記のリンクにあるように、「統計テストで外れ値が検出および確認された場合、この関数はそれを削除するか、サンプルの平均または中央値で置き換えることができます。」また、同じソースの使用法の部分もここにあります:
" 使用法
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
引数
x データセット、最も頻繁にはベクトル。引数がデータフレームの場合、sapplyによって各列から外れ値が削除されます。マトリックスが指定されている場合、applyによって同じ動作が適用されます。
塗りつぶし TRUEに設定すると、中央値または平均値が外れ値ではなく配置されます。それ以外の場合、外れ値は単純に削除されます。
中央値 TRUEに設定すると、外れ値の置換で平均値の代わりに中央値が使用されます。TRUEに設定した場合は反対、反対の値を返します(最大値に平均との差が最大の場合、最小値を返します)。
@sefarkasの提案に加えて、分位点をカットオフとして使用して、次のオプションを検討できます。
newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) )
これにより、99番目の分位点を超えるポイントポイントが削除されます。外れ値を維持することについてaL3Xaが言っていたように注意する必要があります。データの別の保守的なビューを取得するためにのみ削除する必要があります。
0.91
か0.99
?以下のように、mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])
あるいはmydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
外れ値はピークに非常に似ているため、ピーク検出器は外れ値を特定するのに役立ちます。ここで説明する方法は、Zスコアを使用して非常に優れたパフォーマンスを発揮します。ページの途中にあるアニメーションは、外れ値またはピークの信号方式を示しています。
ピークは常に異常値と同じであるとは限りませんが、よく似ています。
次に例を示します。このデータセットは、シリアル通信を介してセンサーから読み取られます。ときどきシリアル通信エラー、センサーエラー、またはその両方が繰り返し発生する、明らかにエラーのあるデータポイントにつながります。これらの点で統計値はありません。それらは間違いなく外れ値ではなく、エラーです。zスコアピーク検出器は、偽のデータポイントで信号を送り、クリーンな結果のデータセットを生成することができました。
これを試して。関数に変数をフィードし、削除された外れ値を含む変数にo / pを保存します
outliers<-function(variable){
iqr<-IQR(variable)
q1<-as.numeric(quantile(variable,0.25))
q3<-as.numeric(quantile(variable,0.75))
mild_low<-q1-(1.5*iqr)
mild_high<-q3+(1.5*iqr)
new_variable<-variable[variable>mild_low & variable<mild_high]
return(new_variable)
}
boxplot
関数は、(他の統計の中で)外れ値を目に見えない形で返します。試しfoo <- boxplot(...); foo
読み?boxplot
の出力を理解すること。