web-dev-qa-db-ja.com

RでのBox-Cox変換に最適なラムダを見つける

Rのベクトルでデータを変換しようとしています。

これは線形回帰用ではないため、予測子と応答の関係はありません。データを正規化することで精度を向上させるモデルを使用しているだけです。 (したがって、boxcox関数は線形モデルでのみ機能するため、使用できません)。

私が変換しようとしているデータは次のとおりです。

vect
 [1]  99.64  49.71 246.84  96.17  16.67 352.00 421.25  81.77 105.00  37.85

私はこれを見ました 投稿

何が行われているのか、最適化関数がどのように使用されているのかは明確ではありませんでしたが、関数を変更して、最小化したい関数を作成することができました。

xskew <- function(data,par) {
abs(skewness((data^par-1)/par)) }

ラムダの値のシーケンス(おそらく、0.01のジャンプで0.5から1の間)を入力し、それらの値のどれが私のデータセットのxskewを最小化するかを見つけたいと思います。

私はこれをoptim関数で実行しようとしましたが、運が悪かったので、これが私にとって適切な関数ではないと思います。この計算を実行するにはどうすればよいですか?

編集:私は次の線に沿って何かが欲しいです:

 x <- seq(0.51,0.99,by=0.01)
 which(xskew(vect,x) < 0.05)

したがって、おそらく私はあるしきい値を下回る値を見つけるでしょう。このコードは明らかにエラーを生成します。

7
Michal

ご了承ください y~1はRの線形モデルとしてカウントされるため、MASSのboxcox関数を使用できます。

tmp <- exp(rnorm(10))
out <- boxcox(lm(tmp~1))
range(out$x[out$y > max(out$y)-qchisq(0.95,1)/2])

その関数の最も重要な部分は、「最良の」ラムダを見つけることではなく、ラムダの信頼区間を見つけることだと思います。次に、さまざまな変換の意味を考え、それを背後にある科学と組み合わせるように促します。データ。データの「最適な」ラムダが0.41で、間隔に0.5が含まれていて、平方根変換が理にかなっているという科学的理由がある場合、なぜ0.5ではなく0.41を使用するのでしょうか。

13
Greg Snow

ベクトルにボックスコックス変換を適用するには、rの予測パッケージを使用します。

library(forecast)
# to find optimal lambda
lambda = BoxCox.lambda( vector )
# now to transform vector
trans.vector = BoxCox( vector, lambda)
12
TheMI