Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。
Cox变换的主要特点是引入一个参数lambda,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,又不丢失信息,后经过一定的推广和改进,扩展了其应用范围。
Box Cox变换的核心参数是lambda(λ),其范围从-5到5。所以我们主要目的在于通过一定的方法,选择除最佳的lambda值。
以上y值需要非负数才行,若对阵有负数的数据集,则公式如下:
常见的lambda计算方法:
- 最大似然估计
- Bayes方法
平时我们想让一个非正态的数据变成正态,一次个想到可能就是取log(即对数转化),可能还有倒数转化,平方根转化等等。而Box-Cox变换是多种变换的统称,当取不同lambda值时,其对应的就是不同的转化方式
从以上可得,我们需要计算一个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")
参考资料: