0%

Box Cox Transformation

Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。

Cox变换的主要特点是引入一个参数lambda,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,又不丢失信息,后经过一定的推广和改进,扩展了其应用范围。

Box Cox变换的核心参数是lambda(λ),其范围从-5到5。所以我们主要目的在于通过一定的方法,选择除最佳的lambda值。

box-cox formula

以上y值需要非负数才行,若对阵有负数的数据集,则公式如下:

box-cox formula negative

常见的lambda计算方法:

  • 最大似然估计
  • Bayes方法

平时我们想让一个非正态的数据变成正态,一次个想到可能就是取log(即对数转化),可能还有倒数转化,平方根转化等等。而Box-Cox变换是多种变换的统称,当取不同lambda值时,其对应的就是不同的转化方式

Box-Cox-transformations

从以上可得,我们需要计算一个lambda即可做Box-Cox变换了

先生成一个F Distribution的向量

set.seed(250) 
set.seed(250)
x <- rf(500, 30, 30)
hist(x,breaks = 15)
qqnorm(x)

从上述柱状图和QQ图都可看出,该模拟的向量并不呈正态,接着用EnvStats包的boxcox做Boxcox Power Transformation,选择最大似然法计算lambda

library(EnvStats)
boxcox.list <- boxcox(x, objective.name = "Log-Likelihood")
> boxcox.list

Results of Box-Cox Transformation
---------------------------------

Objective Name:                  Log-Likelihood

Data:                            x

Sample Size:                     500

 lambda Log-Likelihood
   -2.0      -429.0778
   -1.5      -334.4623
   -1.0      -264.8572
   -0.5      -221.4762
    0.0      -204.6382
    0.5      -213.9799
    1.0      -248.6916
    1.5      -307.6451
    2.0      -389.4097
    

从上可看出,当lambda为0时,Log-likelihood值最大,即对应的是log转换;若想直接估计出lambda,则加optimize = TRUE参数

boxcox(x, objective.name = "Log-Likelihood", optimize = TRUE)

或者通过图形展示lambda的分布

plot(boxcox.list, xlim = c(-2, 2))

最后看下Box-cox转换后的QQ图

plot(boxcox.list, plot.type = "Q-Q Plots")

参考资料:

Box Cox Transformation
Power transform