「Rの手作りプログラム」の中の「異常値の数」
「標準偏差の±k 倍を超えた標本数」とわざわざ注記しているのに,提示されたプログラムは,その要件を満たしていない。
#異常値の数(標準偏差の±k 倍を超えた標本数)
abnormal.number <- function(x, k) {
z <- length(x[x > k * sd(x) | x < -k * sd(x)])
z
}
z <- length(x[x>k*sd(x) | x< -k*sd(x)]) ではなくて,
z <- length(x[x>mean(x)+k*sd(x) | x< mean(x)-k*sd(x)]) でなければならない。
さらに,これは
z <- sum(x > mean(x) + k * sd(x) | x < mean(x) - k * sd(x)) のようにすればよい(x の要素を選ぶ必要はない)。
さらに,さらに,別に結果を z に付値する必要はない。
mean(x) と k*sd(x) を 2 回ずつ計算するのももったいない。
結局,プログラムは,
abnormal.number2 <- function(x, k) {
mx <- mean(x)
sx <- k * sd(x)
sum(x > mx + sx | x < mx - sx)
}
ということになる。
そして,元のプログラムより若干速くなる。
> x <- rnorm(10000000)
> system.time(abnormal.number(x, 2))
ユーザ システム 経過
0.542 0.011 0.548
> system.time(abnormal.number2(x, 2))
ユーザ システム 経過
0.327 0.001 0.325
ちなみに,「標本数」というのは誤った用語法である。この場合は「サンプルサイズ」とか「標本の大きさ」の方だ。
※コメント投稿者のブログIDはブログ作成者のみに通知されます