数据处理

对数变换

正态变换

Box-Cox的R函数

Box-Cox变换的数学解释

参考

 

对数变换

研究数据的增长率分布存在一定规律的模型

 

正态变换

  Box-Cox变换是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。比如在使用线性回归的时候,由于残差 epsilon 不符合正态分布而不满足建模的条件,这时候要对响应变量Y进行变换,把数据变成正态的。

Box-Cox的R函数

R里边的相关函数的函数很多,一般可以分成两类,针对(线性)模型的和针对数据的变换。

1.forecast package

函数:BoxCox.lambda和BoxCox

BoxCox.lambda这个函数用于数值向量或时间序列,可以得到\lambda的估计精确值。

forecast package的Boxcox方法是先用BoxCox.lambda函数自动筛选出最合适的lambda,然后用Boxcox进行普通的Box-cox变换,BoxCox.lambda这个函数用于数值向量或时间序列,可以得到lambda的估计精确值



> BoxCox.lambda(trees$Volume, method = "loglik") 
[1] -0.05
> 
> volume.f <- BoxCox(trees$Volume, lambda = -0.05)
> trees.f <- cbind(trees, volume.f) #重新拟合模型
> l.f <- lm(volume.f ~ log(Height) + log(Girth), data = trees.f) #建立线性模型
> pander(l.f)

---------------------------------------------------------------
              Estimate   Std. Error   t value   Pr(>|t|)  
----------------- ---------- ------------ --------- -----------
 **(Intercept)**    -5.454      0.6731     -8.103    8.013e-09 

 **log(Height)**    0.965       0.172       5.609    5.269e-06 

 **log(Girth)**     1.678      0.06313      26.58    2.073e-21 
---------------------------------------------------------------

Table: Fitting linear model: volume.f ~ log(Height) + log(Girth)

> pander(anova(l.f))

----------------------------------------------------------------
              Df   Sum Sq   Mean Sq    F value    Pr(>F)   
----------------- ---- -------- ---------- --------- -----------
 **log(Height)**   1    2.534     2.534      540.1    7.646e-20 

 **log(Girth)**    1    3.315     3.315      706.7    2.073e-21 

  **Residuals**    28   0.1314   0.004691     NA         NA     
----------------------------------------------------------------

Table: Analysis of Variance Table



 

2.car package

powerTransform要更复杂一些,这个函数是针对线性模型计算一个最优的lambda ,采取的方法是最大似然估计。 使用这个函数的问题是只能对模型l寻找最优lambda,而且还得不到 lambda的估计的精确值。



> summary(p1<-powerTransform(trees$Height))
bcPower Transformation to Normality 
             Est Power Rounded Pwr Wald Lwr bnd Wald Upr Bnd
trees$Height    2.9353           1      -1.1299       7.0004

Likelihood ratio tests about transformation parameters
                            LRT df      pval
LR test, lambda = (0) 2.0440099  1 0.1528064
LR test, lambda = (1) 0.8837162  1 0.3471858
> hist(bcPower(trees$Height,p1$roundlam))
> hist(trees$Height)
> p1$roundlam
trees$Height 
           1



 

3.MASS包

函数:boxcox

这个函数是针对线性模型计算一个最优的\lambda ,采取的方法是最大似然估计。在关于\lambda的对数最大似然图像上找估计值的95%置信区间。对\lambda的搜索的默认范围是[-2,2],步长0.1。结果会输出一张表示似然结果的图。当然可以自定义搜索的范围或者步长。 使用这个函数的问题是只能对模型(lm和aov寻找最优\lambda,而且还得不到 \lambda的估计的精确值。



> boxcox(Volume ~ log(Height) + log(Girth), data = trees) #找lambda
> boxcox(Volume ~ log(Height) + log(Girth), data = trees, lambda = seq(-0.08,
+     0, length = 10))# 缩小寻找的范围,大约是-0.065(中间的线)
> volume <- (trees$Volume^(-0.065) - 1)/(-0.065) #变换
> trees.t <- cbind(trees, volume) #重新拟合模型
> l.t <- lm(volume ~ log(Height) + log(Girth), data = trees.t) #建立线性模型
> qqPlot(l.t) #残差可认为是正态了



 

Box-Cox变换的数学解释

1.回归模型中,Box-Cox变换是对因变量Y作如下变换:

数据转正态分布python 数据正态转换方法_正态分布

  这里

数据转正态分布python 数据正态转换方法_数据结构与算法_02

是一个待定变换参数。对不同的

数据转正态分布python 数据正态转换方法_数据结构与算法_02

,所做的变换自然就不同,所以是一个变换族。它包括了对数变换(

数据转正态分布python 数据正态转换方法_数据结构与算法_02

=0),平方根变换(

数据转正态分布python 数据正态转换方法_数据结构与算法_05

)和倒数变换(

数据转正态分布python 数据正态转换方法_数据结构与算法_02

=-1)等常用变换。对因变量的n个观测值

数据转正态分布python 数据正态转换方法_线性模型_07

,应用上述变换,得到变换后的向量

数据转正态分布python 数据正态转换方法_线性模型_08

        (1.2)即要确定变换参数

数据转正态分布python 数据正态转换方法_线性模型_09

,使得

数据转正态分布python 数据正态转换方法_数据结构与算法_10

满足

数据转正态分布python 数据正态转换方法_数据转正态分布python_11

  (1.3)即通过对因变量的变换,使得变换过的向量

数据转正态分布python 数据正态转换方法_数据结构与算法_10

与回归自变量具有线性相依关系,误差也服从正态分布,误差各分量是等方差且相互独立。以极大似然法来确定

数据转正态分布python 数据正态转换方法_数据结构与算法_02

。因为

数据转正态分布python 数据正态转换方法_数据结构与算法_14

,所以对固定的

数据转正态分布python 数据正态转换方法_数据结构与算法_02


数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

的似然函数为

数据转正态分布python 数据正态转换方法_线性模型_18

  (1.4)这里

数据转正态分布python 数据正态转换方法_线性模型_19

为变换Jacobi的行列式

数据转正态分布python 数据正态转换方法_数据转正态分布python_20

    (1.5)当

数据转正态分布python 数据正态转换方法_数据结构与算法_02

固定时,

数据转正态分布python 数据正态转换方法_正态分布_22

是不依赖于参数

数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

的常数因子。

数据转正态分布python 数据正态转换方法_数据结构与算法_25

的其余部分关于

数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

求导数,令其等于0,可以求得

数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

的极大似然估计

数据转正态分布python 数据正态转换方法_数据转正态分布python_30

      (1.6)

数据转正态分布python 数据正态转换方法_线性模型_31

        (1.7)为了求

数据转正态分布python 数据正态转换方法_数据_32

的最大值,考虑到lnx是x的单调函数,对

数据转正态分布python 数据正态转换方法_正态分布_33

求对数。略去与

数据转正态分布python 数据正态转换方法_数据结构与算法_02

无关的常数项,得到

数据转正态分布python 数据正态转换方法_正态分布_35

        (1.8)

其中

数据转正态分布python 数据正态转换方法_数据_36

    (1.9)

数据转正态分布python 数据正态转换方法_数据转正态分布python_37

      (1.10)

数据转正态分布python 数据正态转换方法_正态分布_38

    (1.11)1.9)式对Box-Cox变换带来很大方便,因为为了求

数据转正态分布python 数据正态转换方法_数据转正态分布python_39

的最大值,只需求残差平方和的

数据转正态分布python 数据正态转换方法_线性模型_40

最小值。

 

2 单变量的Box-Cox变换

设变量

数据转正态分布python 数据正态转换方法_正态分布_41

经变换后,

数据转正态分布python 数据正态转换方法_数据结构与算法_42

      (2.1)

对固定的

数据转正态分布python 数据正态转换方法_数据结构与算法_02


数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

的似然函数为

数据转正态分布python 数据正态转换方法_正态分布_46

  (2.2)

数据转正态分布python 数据正态转换方法_数据_47

同为变换Jacobi的行列式

数据转正态分布python 数据正态转换方法_数据转正态分布python_48

  (2.3)求得

数据转正态分布python 数据正态转换方法_数据结构与算法_16


数据转正态分布python 数据正态转换方法_数据_17

的极大似然估计为

数据转正态分布python 数据正态转换方法_数据_51

  (2.4)

数据转正态分布python 数据正态转换方法_数据_52

  (2.5)

对极大似然函数作对数变换

 

数据转正态分布python 数据正态转换方法_数据结构与算法_53

  (2.6)

化简得

数据转正态分布python 数据正态转换方法_数据_54

  (2.7)

其中

 

数据转正态分布python 数据正态转换方法_正态分布_55

    (2.8)

数据转正态分布python 数据正态转换方法_线性模型_56

    (2.9)

(2.9)亦即为几何平均值。

为了简单起见,重新将Box-Cox变换定义为

数据转正态分布python 数据正态转换方法_数据_57

      (2.10)为了最大化

数据转正态分布python 数据正态转换方法_数据转正态分布python_58

,只须最小化

数据转正态分布python 数据正态转换方法_数据结构与算法_59