Box-Cox 変換の,最適のλ     Last modified: Oct 13, 2004

目的

Box-Cox 変換の,最適のλをシンプレックス法によって求める

使用法

Box.Cox.transformation2(x, loop = 500, epsilon = 1e-15, Alpha = 2, Beta = 0.5, Gamma = 2)

引数

x	データベクトル
loop	収束計算の許容ループ数
epsilon	収束判定値
Alpha	シンプレックス法のα
Beta	シンプレックス法のβ
Gamma	シンプレックス法のγ

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/Box_Cox_transformation2.R", encoding="euc-jp")

# Box-Cox 変換の,最適のλをシンプレックス法によって求める
Box.Cox.transformation2 <- function( x,                              # データ
                                        loop = 500,                     # 収束計算の許容ループ数
                                        epsilon = 1e-15,                # 収束判定値
                                        Alpha = 2,                      # シンプレックス法のα
                                        Beta = 0.5,                     # シンプレックス法のβ
                                        Gamma = 2)                      # シンプレックス法のγ
{
        Box.Cox.sub <- function(lambda)                                      # ボックス・コックス変換の計算値
        {
                if (lambda == 0) {
                        w <- Gm*log(x)
                }
                else {
                        w <- (x^lambda-1)/(lambda*Gm^(lambda-1))
                }
                sd(w)
        }

        x <- x[!is.na(x)]                                            # 有効データのみを対象とする
        Gm <- exp(mean(log(x)))                                              # 幾何平均を求める

        p1 <- -3                                                     # 初期値
        p2 <- p1+0.1                                                 # 初期値

        vec <- c(p1, p2)

        for (i in 1:loop) {                                             # 収束計算

                result <- c(Box.Cox.sub(vec[1]), Box.Cox.sub(vec[2]))

                h <- which.max(result)                                       # 大きい方
                s <- which.min(result)                                       # 小さい方

                ph <- vec[h]
                fh <- result[h]
                ps <- vec[s]
                fs <- result[s]

                p0 <- vec[s]

                pr <- (1+Alpha)*p0-Alpha*ph
                fr <- Box.Cox.sub(pr)

                if (fr > fh) {                                          # 探索値の状況により推測値を修正
                        pc <- Beta*ph+(1-Beta)*p0
                        vec[h] <- pc
                }
                else if (fs > fr) {
                        pe <- Gamma*pr+(1-Gamma)*p0
                        fe <- Box.Cox.sub(pe)
                        if (fr > fe) vec[h] <- pe else vec[h] <- pr
                }
                else {
                        vec[h] <- pr
                }
                if (abs((vec[1]-vec[2])/vec[1]) < epsilon) break     # 近似値の差が小さいなら収束と見なす
        }

        mean(vec)                                                       # 2つのベクトルの平均値は,真値により近いだろう
}


使用例

> x <- c(5.0, 5.0, 3.3, 4.3, 4.0, 5.5, 4.0, 6.0, 5.0, 5.0, 4.0, 4.3, 5.3, 5.0, 6.0, 6.7, 6.5, 6.0, 6.0, 5.3, 7.0, 5.0, 6.3, 5.3, 4.5, 6.0, 7.0,
+ 2.0, 2.5, 1.5, 1.7, 1.0, 1.0, 2.0, 1.0, 1.7, 2.0, 2.0, 1.0, 1.3, 2.5, 1.0, 2.0, 2.0, 1.0, 3.0, 1.3, 1.0, 2.0, 2.0, 1.7, 1.0, 1.0, 1.0,
+ 4.0, 5.3, 3.0, 3.7, 2.7, 3.3, 5.0, 2.7, 4.7, 3.7, 3.7, 4.0, 4.7, 4.3, 5.7, 4.7, 5.3, 5.5, 4.3, 7.0, 5.0, 5.3, 5.7, 5.3, 4.3, 5.0, 5.0, 5.0, 4.3, 4.7,
+ 1.3, 1.3, 1.3, 1.7, 2.0, 1.0, 1.3, 1.3, 1.7, 1.7, 1.3, 1.3, 1.3, 2.3, 2.0, 2.7, 2.0, 1.7, 2.3, 1.0, 2.0, 2.0, 2.0, 1.7, 2.0, 1.3, 1.3, 2.0, 1.3, 1.7,
+ 5.0, 5.0, 3.7, 3.3, 3.0, 3.5, 3.3, 3.0, 3.0, 4.3, 3.7, 4.0, 4.0, 3.3, 5.0, 6.0, 4.0, 4.0, 5.7, 5.5, 5.5, 5.5, 5.3, 4.7, 5.0, 4.3, 4.3, 3.0, 6.0,
+ 2.3, 1.7, 2.0, 1.0, 1.5, 1.0, 1.0, 2.0, 1.0, 2.0, 1.3, 1.7, 1.7, 2.0, 2.0, 2.0, 1.7, 2.0, 1.7, 0.5, 1.7, 1.3, 1.7, 2.3, 2.0, 1.0, 1.0, 1.3, 2.0,
+ 2.0, 5.5, 3.5, 5.3, 5.0, 6.0, 8.0, 6.0, 4.0,
+ 2.0, 3.0, 2.5, 2.0, 1.0, 2.0, 1.0, 3.0, 2.0)

> Box.Cox.transformation2(x)

[1] 0.2368628	# λの推定値

・ 注:得られたλをそのまま採用するのではなく,意味の明らかな近傍の値を採用するべきである。
   λ = 0 は対数変換
   λ = 0.5 のときは平方根変換
   λ = -1 のときは逆数変換となる
   λ = 1 のときは,単なる線形変換(もとのデータから 1 引くだけ)なので,分布型は変わらない。


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh