2

正規分布に変換する必要があるデータセットがあります。

まず、再現可能なデータセットを生成します。

df <- runif(500, 0, 100)

次に、関数を定義します。この関数は、P > 0.05 になるまで df を変換し続けます。変換された df が生成され、y という名前が付けられます。

BoxCoxTrans <- function(y)    
{
    lambda <- 1
    constant <- 0
    while(shapiro.test(y)$p.value < 0.10) 
    {
        constant <- abs(min(y, na.rm = TRUE)) + 0.001
        y <- y + constant
        lambda <- powerTransform(y)$lambda
        y <- y ^ lambda
    }
    assign("y", y, envir = .GlobalEnv) 
}

第三に、自由度をテストする

shapiro.test(df)

Shapiro-Wilk normality test

data:  df
W = 0.95997, p-value = 2.05e-10

P < 0.05 であるため、df を変換します。

BoxCoxTrans(df)

次に、次のエラーメッセージが表示されます。

Error in qr.resid(xqr, w * fam(Y, lambda, j = TRUE)) : 
NA/NaN/Inf in foreign function call (arg 5)

私は何を間違えましたか?

4

2 に答える 2

3

ボックス ミュラー変換を使用して、ランダムな一様分布からほぼ正規分布を生成できます。これは、Box-Cox Transformation よりも適切な場合があります。Box-Cox Transformation は通常、歪んだ分布をほぼ正規の分布に変換するために適用されます。

一様に分布した数値のセットに適用されるボックス ミュラー変換の例を次に示します。

set.seed(1234)
size <- 5000
a <- runif(size)
b <- runif(size)
y <- sqrt(-2 * log(a)) * cos(2 * pi * b)
plot(density(y), main = "Example of Box-Muller Transformation", xlab="x", ylab="f(x)")
library(nortest)
#> lillie.test(y)
#
#   Lilliefors (Kolmogorov-Smirnov) normality test
#
#data:  y
#D = 0.009062, p-value = 0.4099
#
#> shapiro.test(y)
#
#   Shapiro-Wilk normality test
#
#data:  y
#W = 0.99943, p-value = 0.1301
#

ここに画像の説明を入力

お役に立てれば。

于 2015-07-11T07:31:36.723 に答える
1

追加

 print(summary(y))

whileループの終了前に、計算が爆発するのを見てください。いずれにせよ、Box-Cox を繰り返し適用しても意味がありません。最初のアプリケーションから変換パラメーターの ML(-like) 推定量を取得するためです。さらに、べき乗変換が一様分布を正規化することを期待するのはなぜですか?

ジョン

于 2015-07-11T02:07:34.137 に答える