【问题标题】:Continuous PowerTransform/BoxCox Transformation in RR中的连续功率变换/ Box Cox变换
【发布时间】:2015-09-29 20:47:54
【问题描述】:

我有一个需要转换为正态分布的数据集。

首先,生成一个可重现的数据集。

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

BoxCoxTrans(df)

然后它给了我以下错误消息,

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

我做错了什么?

【问题讨论】:

  • 你可能不想递归转换y

标签: r function transform r-car


【解决方案1】:

您可以使用 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
#

希望这会有所帮助。

【讨论】:

  • 不客气。我很高兴能帮上忙 ;-) 干杯!
【解决方案2】:

添加

 print(summary(y))

在你的while 循环结束之前,看着你的计算爆炸。无论如何,重复应用 Box-Cox 是没有意义的,因为您从第一个应用程序中获得了转换参数的 ML(-like) 估计量。此外,您为什么会期望幂变换能够对均匀分布进行归一化?

约翰

【讨论】:

  • 谢谢!这是非常有帮助的!完全有道理。我需要查看我的统计书。
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 2014-12-11
  • 2016-03-04
  • 2014-12-24
  • 1970-01-01
  • 2015-07-13
  • 2022-01-06
  • 2020-11-21
相关资源
最近更新 更多