R 中的连续 PowerTransform/BoxCox 转换
Continuous PowerTransform/BoxCox Transformation in R
我有一个数据集需要转换为正态分布。
首先,生成一个可重现的数据集。
df <- runif(500, 0, 100)
其次,定义一个函数。此函数将继续转换 d.f。直到 P > 0.05。改造后的d.f。将生成并命名为 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)
}
三、测试df
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)
我做错了什么?
添加
print(summary(y))
在你的 while
循环结束之前,看着你的计算爆炸。无论如何,重复应用 Box-Cox 是没有意义的,因为您从第一个应用程序中获得了转换参数的 ML(-like) 估计量。此外,您为什么期望幂变换使均匀分布归一化?
约翰
您可以使用 Box-Muller 变换从随机均匀分布生成近似正态分布。这可能比 Box-Cox 变换更合适,AFAIK 通常用于将偏态分布转换为几乎正常的分布。
这是一个应用于一组均匀分布数字的 Box-Muller 变换的示例:
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
#
希望对您有所帮助。
我有一个数据集需要转换为正态分布。
首先,生成一个可重现的数据集。
df <- runif(500, 0, 100)
其次,定义一个函数。此函数将继续转换 d.f。直到 P > 0.05。改造后的d.f。将生成并命名为 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)
}
三、测试df
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)
我做错了什么?
添加
print(summary(y))
在你的 while
循环结束之前,看着你的计算爆炸。无论如何,重复应用 Box-Cox 是没有意义的,因为您从第一个应用程序中获得了转换参数的 ML(-like) 估计量。此外,您为什么期望幂变换使均匀分布归一化?
约翰
您可以使用 Box-Muller 变换从随机均匀分布生成近似正态分布。这可能比 Box-Cox 变换更合适,AFAIK 通常用于将偏态分布转换为几乎正常的分布。
这是一个应用于一组均匀分布数字的 Box-Muller 变换的示例:
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
#
希望对您有所帮助。