質問
美容と年齢の多変量データがいくつかあります。年齢は2(20、22、24 .... 40)の間隔で20〜40の範囲であり、データの各記録について、1〜5の年齢と美容評価が与えられます。このデータのBoxPlots(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
デフォルトとして。
編集2: 削除 quantile
機能、サブスクリプトを追加するため、関数をより速くしました! =)
他のヒント
誰も最も簡単な答えを投稿していません:
x[!x %in% boxplot.stats(x)$out]
これも参照してください: http://www.r-statistics.com/2011/01/how-to-label-all-the-the-the-the-a-boxplot/
使用する outline = FALSE
BoxPlotを実行するときのオプションとして(ヘルプを読んでください!)。
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
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
私は意図的に特定の質問に答えませんでした。なぜなら、「外れ値」を除去することは統計的過誤を考慮しているからです。ボックスプロットでそれらをプロットしないことは、それらを削除することは許容できる慣行と考えています。
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]
これは外れ値を非常に簡単に削除できます。上記の例では、属性値の98パーセンタイルから98パーセンタイルを抽出しています。
外れ値の削除に関連するパッケージを探して、このパッケージを見つけました(驚くほど「外れ値」と呼ばれます!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
あなたがそれを通過すると、あなたは外れ値を除去するさまざまな方法を見ます、そしてその中に私は見つけました rm.outlier
上記のリンクで使用する最も便利なもの:「外れ値が統計テストによって検出および確認された場合、この関数はそれを削除したり、サンプル平均または中央値で置き換えることができます」と同じソースからの使用部分もあります。 :
"使用法
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
議論
バツ データセット、最も頻繁にベクトル。引数がデータフレームである場合、外側はSapplyによって各列から削除されます。マトリックスが与えられたときに適用することにより、同じ動作が適用されます。
塗りつぶし Trueに設定すると、外れ値の代わりに中央値または平均が配置されます。それ以外の場合、外れ値は/単に削除されます。
中央値 Trueに設定すると、外れ値の交換で平均の代わりに中央値が使用されます。正反対の場合は、反対の値を与えます(最大値が平均と最大の差を持っている場合、それは最小になり、逆も同様です)」
しない:
z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) &
df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows
このタスクを非常に簡単に達成しますか?
@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が外れ値を維持することについて言っていたように注意する必要があります。データの代替保守的な見解を取得するためにのみ削除する必要があります。
これを試して。関数に変数にフィードを与え、除去された外れ値を含む変数に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)
}