web-dev-qa-db-ja.com

RでBox-Coxパワー変換を使用する方法

一部のデータを「通常の形状」に変換する必要があり、Box-Coxがデータの変換に使用する指数を識別できることを読みました。

私が理解したことについて

car::boxCoxVariable(y)

線形モデルの応答変数に使用され、

MASS::boxcox(object)

数式または近似モデルオブジェクトの場合。したがって、私のデータはデータフレームの変数であるため、使用できるとわかった唯一の関数は次のとおりです。

car::powerTransform(dataframe$variable, family="bcPower")

あれは正しいですか?それとも何か不足していますか?

2番目の質問は、私が入手した後に何をすべきかについてです

Estimated transformation parameters
dataframe$variable
0.6394806

variableにこの値を掛けるだけですか?私はそうしました:

aaa = 0.6394806
dataframe$variable2 = (dataframe$variable)*aaa

そして、正規性のためにshapiro-wilksテストを実行しますが、データが正規分布に従っていないようです:

shapiro.test(dataframe$variable2)
data:  dataframe$variable2
W = 0.97508, p-value < 2.2e-16
23
dede

Box and Cox(1964)は、線形モデルのerrorsの非正規性を減らすように設計された変換ファミリを提案しました。これを行うと、しばしば非線形性も減少することがわかります。

以下は、元の作品とそれ以降に行われたすべての作品の素晴らしい要約です。 http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf

ただし、ラムダパワー変換の選択を制御する対数尤度関数は、基礎となるモデルの残差平方和に依存していることに気付くでしょう(SOにLaTeXはありません-参照を参照)、そのため、モデルなしでは変換を適用できません。

典型的なアプリケーションは次のとおりです。

library(MASS)

# generate some data
set.seed(1)
n <- 100
x <- runif(n, 1, 5)
y <- x^3 + rnorm(n)

# run a linear model
m <- lm(y ~ x)

# run the box-cox transformation
bc <- boxcox(y ~ x)

enter image description here

(lambda <- bc$x[which.max(bc$y)])
[1] 0.4242424

powerTransform <- function(y, lambda1, lambda2 = NULL, method = "boxcox") {

  boxcoxTrans <- function(x, lam1, lam2 = NULL) {

    # if we set lambda2 to zero, it becomes the one parameter transformation
    lam2 <- ifelse(is.null(lam2), 0, lam2)

    if (lam1 == 0L) {
      log(y + lam2)
    } else {
      (((y + lam2)^lam1) - 1) / lam1
    }
  }

  switch(method
         , boxcox = boxcoxTrans(y, lambda1, lambda2)
         , tukey = y^lambda1
  )
}


# re-run with transformation
mnew <- lm(powerTransform(y, lambda) ~ x)

# QQ-plot
op <- par(pty = "s", mfrow = c(1, 2))
qqnorm(m$residuals); qqline(m$residuals)
qqnorm(mnew$residuals); qqline(mnew$residuals)
par(op)

enter image description here

ご覧のとおり、これは特効薬ではありません。一部のデータのみを効果的に変換できます(通常、-2未満または2を超えるラムダは、このメソッドを使用してはならない兆候です)。他の統計手法と同様に、実装する前に注意して使用してください。

2つのパラメーターのBox-Cox変換を使用するには、geoRパッケージを使用してラムダを検索します。

library("geoR")
bc2 <- boxcoxfit(x, y, lambda2 = TRUE)

lambda1 <- bc2$lambda[1]
lambda2 <- bc2$lambda[2]

編集:@ Yui-Shiuanが指摘したTukeyとBox-Coxの実装の融合が修正されました。

26
mlegge

論文のBox-cox変換式Box、George E. P .; Cox、D.R。(1964)。 「変換の分析」、私はmleggeの投稿を少し編集する必要があると思います。変換されたyは(y ^(lambda)-1)/ lambdaでなくy ^(lambda)。(実際には、y ^(lambda)はTukey変換と呼ばれ、これは別の明確な変換式です。)
したがって、コードは次のようになります。

(trans <- bc$x[which.max(bc$y)])
[1] 0.4242424
# re-run with transformation
mnew <- lm(((y^trans-1)/trans) ~ x) # Instead of mnew <- lm(y^trans ~ x) 

詳しくは

誤解した場合は修正してください。

12
Yun-Shiuan