忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Van Selst, M., & Jolicoeur, P. (1994). A solution to the effect of sample size on outlier elimination. The quarterly journal of experimental psychology, 47A, 631-650.
より。
結論としては基準変動型のいずれかがお勧めらしい


## 仮想反応時間データ生成
rt <- round(sample(rnorm(10000, mean=300, sd=10)+(300*rexp(10000)), 20))
hist(rt)
win.graph(); plot(rt)
mean(rt); sd(rt)
range(rt)

# 基準変動型手続きに使うデータ
ssz <- c(4,5,6,7,8,9,10,11,12,13,14,15,20,25,30,35,50,100) # 抽出するサンプルの数
nrv <- c(1.458,1.68,1.841,1.961,2.050,2.12,2.173,2.22,2.246,2.274,2.31,2.326,2.391,2.410,2.4305,2.45,2.48,2.50) # 基準変動型非再帰手続き用
mrv <- c(8, 6.20, 5.30, 4.80, 4.475,4.25,4.11,4.00,3.92,3.85,3.80,3.75,3.64,3.595,3.55,3.54,3.51,3.50) # 基準変動型修正再帰手続き用
## 表にしてみる
tb <- rbind(nrv, mrv)
colnames(tb) <- ssz
tb

## 線形補間で予測値を得る関数を生成
nrvfun <- approxfun(ssz, nrv) # 基準変動型非再帰手続き用
mrvfun <- approxfun(ssz, mrv) # 基準変動型修正再帰手続き用


## 基準変動型非再帰手続き (Non-recursive with moving criterion)
mrt <- mean(rt)
sdrt <- sd(rt)
sszrt <- length(rt)
crco <- nrvfun(sszrt) # 線形補間関数による基準値
cv <- c(mrt-(crco*sdrt), mrt+(crco*sdrt))
rt2 <- rt[cv[1]<=rt & rt<=cv[2]]
mean(rt); sd(rt); length(rt)
mean(rt2); sd(rt2); length(rt2) # 最終出力
range(rt); range(rt2); cv; crco


## 基準変動型修正再帰手続き (Modified recursive with moving criterion)
rttmp <- rt[rt<max(rt)]
mrttmp <- mean(rttmp)
sdrttmp <- sd(rttmp)
sszrt <-  length(rt)
crco <- mrvfun(sszrt) # 線形補間関数による基準値
cv <- c(mrttmp-(crco*sdrttmp), mrttmp+(crco*sdrttmp))
minv <- min(rt); maxv <- max(rt)
ucv.l <- cv[1]; ucv.u <- cv[2]
svct <- rt
    while((minv < ucv.l | maxv > ucv.u)&(length(svct)>3)) {
        if (minv < ucv.l) {svct<- svct[svct>minv]}
        if (maxv > ucv.u) {svct<- svct[svct<maxv]}
        cat(ucv.l, ucv.u, crco, "\n") # 最後に使われた基準値とカットオフポイントを返す
        if (length(svct) < 2) break
        maxv <- max(svct)
        minv <- min(svct)
        svct2 <-svct[svct<maxv]
        if (length(svct2) < 2) break
        ucv.l <- mean(svct2)-(crco*sd(svct2))
        ucv.u <- mean(svct2)+(crco*sd(svct2))
    }
rt2 <- svct
mean(rt); sd(rt)
mean(rt2); sd(rt2) # 最終出力
cv; crco
range(rt); length(rt)
range(rt2); length(rt2)

## ハイブリッド手続き (Hybrid procedure)
crco <- 2.5; crco.nr <- crco # 基準値は勘で
## まず非再帰手続きを行う
mrt <- mean(rt)
sdrt <- sd(rt)
sszrt <- length(rt)
cv <- c(mrt-(crco*sdrt), mrt+(crco*sdrt)); cv.nr <- cv
rt.nrc <- rt[cv[1]<=rt & rt<=cv[2]]
## 修正再帰手続きを行う。この際、非再帰手続きの基準値に1プラスする
crco <- crco.nr+1; crco.mr <- crco
rttmp <- rt[rt<max(rt)]
mrttmp <- mean(rttmp)
sdrttmp <- sd(rttmp)
cv <- c(mrttmp-(crco*sdrttmp), mrttmp+(crco*sdrttmp)); cv.mr <- cv
minv <- min(rt); maxv <- max(rt)
ucv.l <- cv[1]; ucv.u <- cv[2]
svct <- rt
    while((minv < ucv.l | maxv > ucv.u)&(length(svct)>3)) {
        if (minv < ucv.l) {svct<- svct[svct>minv]}; cv.mr[1] <- ucv.l
        if (maxv > ucv.u) {svct<- svct[svct<maxv]}; cv.mr[2] <- ucv.u
        cat(ucv.l, ucv.u, crco, "\n") # 最後に使われた基準値とカットオフポイントを返す
        if (length(svct) < 2) break
        maxv <- max(svct)
        minv <- min(svct)
        svct2 <-svct[svct<maxv]
        if (length(svct2) < 2) break
        ucv.l <- mean(svct2)-(crco*sd(svct2))
        ucv.u <- mean(svct2)+(crco*sd(svct2))
    }
rt.mrc <- svct
## 非再帰手続の平均と修正再帰手続の平均を平均する
mean(c(mean(rt.nrc),mean(rt.mrc))) # 最終の代表値
mean(rt); sd(rt); length(rt)
mean(rt.nrc); sd(rt.nrc); length(rt.nrc); cv.nr; crco.nr
mean(rt.mrc); sd(rt.mrc); length(rt.mrc); cv.mr; crco.mr
range(rt); range(rt.nrc); range(rt.mrc)

PR
Comment
Trackback
Trackback URL

Comment form
Title
Color & Icon Vodafone絵文字 i-mode絵文字 Ezweb絵文字  
Comment
Name
Mail
URL
Password
プロフィール
HN:
tao
HP:
性別:
非公開
職業:
会社員
趣味:
アウトドア、自転車、ジョギング、英語学習
自己紹介:
・千葉在住のサラリーマンです。データ分析っぽいことが仕事。
・今年英検1級取得。今はTOEIC高得点を目指して勉強中。
・興味のあることは野球、アウトドア、英語学習、統計、プログラミング、PC関係などなど。
ブログ内検索
freead
順位表
プロ野球データFreak
セリーグ順位表
パリーグ順位表