Box-Cox变换

转载自:http://site.douban.com/182577/widget/notes/12866356/note/292509009/

Box-Cox变换_第1张图片

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

变换的形式是
f(x,λ)={(xλ−1)/λlog(x) if lambda≠0 if lambda=0

关于Box-Cox变换的详细内容参考: http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf

使用这个变换的问题是\lambda究竟取多少为好?这个值只能通过估计得到。

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

1.MASS包的boxcox函数

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

library(MASS)
library(car)
library(pander)

l <- lm(Volume ~ log(Height) + log(Girth), data = trees) #建立线性模型
qqPlot(l) #残差的QQ图,不大符合正态分布
 

 
 

 

 


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.65) - 1)/(-0.065) #变换
trees.t <- cbind(trees, volume) #重新拟合模型
l.t <- lm(volume ~ log(Height) + log(Girth), data = trees.t) #建立线性模型
qqPlot(l.t) #残差可认为是正态了

 

 

 

 

 
 

 

 


pander(l.t)

## 
## --------------------------------------------------------------
##   Estimate Std. Error t value Pr(>|t|) 
## ----------------- ---------- ------------ --------- ----------
## **(Intercept)** -0.1368 1.517 -0.09022 0.9288 
## 
## **log(Height)** 1.745 0.3877 4.502 0.000108 
## 
## **log(Girth)** 2.358 0.1422 16.58 5.213e-16 
## --------------------------------------------------------------
## 
## Table: Fitting linear model: volume ~ log(Height) + log(Girth)

pander(anova(l.t))

## 
## -------------------------------------------------------------
##   Df Sum Sq Mean Sq F value Pr(>F) 
## ----------------- ---- -------- --------- --------- ---------
## **log(Height)** 1 5.854 5.854 245.8 2.154e-15
## 
## **log(Girth)** 1 6.546 6.546 274.9 5.213e-16
## 
## **Residuals** 28 0.6669 0.02382 
## -------------------------------------------------------------
## 
## Table: Analysis of Variance Table

2.forecast包的BoxCox.lambda和BoxCox

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

library(forecast)

## Warning: package 'forecast' was built under R version 3.0.1

## This is forecast 4.04

BoxCox.lambda(trees$Volume, method = "loglik") #算出来的结果和boxcox有点差异

## [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 
## -------------------------------------------------------------
## 
## Table: Analysis of Variance Table

qqPlot(l.f)

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法学习)