裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:テストしてから使おう!

2012年06月15日 | ブログラミング

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

ちなみに,「標本数」というのは誤った用語法である。この場合は「サンプルサイズ」とか「標本の大きさ」の方だ。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« こんなところに計算誤差があ... | トップ | ダメ出し:不適切な公式は使... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事