11

次のようなデータフレームがあります。

バツ

Team 01/01/2012  01/02/2012  01/03/2012  01/01/2012 01/04/2012 SD Mean
A     100         50           40        NA         30       60  80

各セルで平均値と標準偏差を計算して外れ値を計算するのが好きです。例えば、

abs(x-Mean) > 3*SD

x$count<-c(1)(上記の条件が満たされた場合、この値を増やします)。

データセットの異常をチェックするためにこれを行っています。列名がわかっていれば計算は簡単ですが、列の数は異なります。一部の細胞には NA が含まれている場合があります。

各セルから平均を減算するのが好きで、これを試しました

x$diff<-sweep(x, 1, x$Mean, FUN='-')

動作していないようですが、何かアイデアはありますか?

4

5 に答える 5

47

以下を使用して、IQR (四分位範囲) と下位/上位四分位数を取得します。

lowerq = quantile(data)[2]
upperq = quantile(data)[4]
iqr = upperq - lowerq #Or use IQR(data)

軽度の外れ値の境界を計算します。

mild.threshold.upper = (iqr * 1.5) + upperq
mild.threshold.lower = lowerq - (iqr * 1.5)

これらの値の外側 (>mild.threshold.upper または <mild.threshold.lower) のデータ ポイントは軽度の外れ値です。

極端な外れ値を検出するには、同じことを行いますが、代わりに 3 を掛けます。

extreme.threshold.upper = (iqr * 3) + upperq
extreme.threshold.lower = lowerq - (iqr * 3)

これらの値の外側 (> Extreme.threshold.upper または < Extreme.threshold.lower) のデータ ポイントは極端な外れ値です。

お役に立てれば

編集:75%ではなく50%にアクセスしていました

于 2012-10-12T21:45:25.323 に答える
9

上記の@by0の回答を使用して、外れ値を自動的に削除する関数を作成しました。関数とサンプルコードは次のとおりです。

# generate 10 random numbers and 2 'outlier' numbers
testData <- c(-42,rnorm(10),42)

# show the numbers
testData

# define a function to remove outliers
FindOutliers <- function(data) {
  lowerq = quantile(data)[2]
  upperq = quantile(data)[4]
  iqr = upperq - lowerq #Or use IQR(data)
  # we identify extreme outliers
  extreme.threshold.upper = (iqr * 3) + upperq
  extreme.threshold.lower = lowerq - (iqr * 3)
  result <- which(data > extreme.threshold.upper | data < extreme.threshold.lower)
}

# use the function to identify outliers
temp <- FindOutliers(testData)

# remove the outliers
testData <- testData[-temp]

# show the data with the outliers removed
testData
于 2016-06-14T06:55:51.080 に答える
4

行ごとに物事を行うことについていくつか質問をされているのを見ました。あなたはそれを避けるべきです。Rは、列が変数を表し、行が観測値を表すという概念に従います。多くの機能は、この概念に従って最適化されています。ファイルへのワイド出力または転置出力が必要な場合は、ファイルに書き込む直前にデータを再配置できます。

あなたのデータは実際には質問に示されているように見えますが、複数の行があると思います。

df <- read.table(text="Team 01/01/2012  01/02/2012  01/03/2012  01/01/2012 01/04/2012 SD 

Mean
A     100         50           40        NA         30       60  80
B     200         40           5         8          NA       NA  NA",check.names = FALSE,header=TRUE)

#needed because one date appears twice
df <- df[,]

#reshape the data
library(reshape2)
df <- melt(df,id="Team")
names(df)[2] <- "Date"

#remove the SD and Mean
df <- df[!df$Date %in% c("SD","Mean"),]

#function to detect outliers
outfun <- function(x) {
  abs(x-mean(x,na.rm=TRUE)) > 3*sd(x,na.rm=TRUE)
}

#test if function works
outfun(c(200,rnorm(10)))

#use function over all data
df3$outlier.all <- outfun(df3$value)

#apply function for each team 
library(plyr)
df3 <- ddply(df3,.(Team),transform,outlier.team=outfun(value))

結果:

           Date Team value outlier.all outlier.team
1    01/01/2012    A   100       FALSE        FALSE
2    01/02/2012    A    50       FALSE        FALSE
3    01/03/2012    A    40       FALSE        FALSE
4  01/01/2012.1    A    NA          NA           NA
5    01/04/2012    A    30       FALSE        FALSE
6    01/01/2012    B   200       FALSE        FALSE
7    01/02/2012    B    40       FALSE        FALSE
8    01/03/2012    B     5       FALSE        FALSE
9  01/01/2012.1    B     8       FALSE        FALSE
10   01/04/2012    B    NA          NA           NA
于 2012-10-13T01:26:40.283 に答える