【前文说明]】其实自己是刚刚接触R语言的小白一枚,最近在学习的过程中遇到很多问题,比如最近纠结的这个boxcox变换问题。当时满怀希望的上论坛找,想求得操作说明,但是无奈放眼望去木有答案。可能与我一样的小白众多,大牛也不愿意解答这么easy的问题吧。所以秉承和小白们惺惺相惜的原则,就当做笔记了,把自己从国外网站翻译过来的东西,加上自己的操作写下来,对与不对,还请大牛指导。##############################################################################
1 什么是boxcox变换?
在做线性回归的过程中,不可观测的误差可能是和预测变量相关,于是给线性回归的最小二乘法估计系数的结果带来误差,为了解决这样的方差齐性问题,所以考虑对相应应变量做Box-Cox变换,变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。 也就是说,在实际使用数据分析的时候,想对数据做正态性假设,但是数据往往是不是正态分布的。这个时候考虑boxcox变换。
2 boxcox变换
具体的数学公式如下所示,通过确定λ的值来将x转换为正态分布——
(1)首先,在r中运行这个计算,要运用car这个package.命令如下——
>install.packages("car")
>library(car)
其中,可以先看一下原数据的分布。如hist(wool$cycle)
(2)接下来,运用powerTansform函数,确定λ,然后以此为基础进行bcPower变换。
> summary(p1 <- powerTransform(Wool$cycles))
bcPower Transformation to Normality
Est.Power Std.Err. Wald Lower Bound Wald Upper
BoundWool$cycles -0.0473 0.1931 -0.4259 0.3313
Likelihood ratio tests about transformation parameters
LRT df pval
LR test, lambda = (0) 0.05994796 1 8.065782e-01
LR test, lambda = (1) 27.29886008 1 1.743141e-07
hist(bcPower(Wool$cycles, p1$roundlam))
其中需要说明的是,要进行powerTransform的函数,x中不能有0或者负数。因此,常用的做法是将x加上一定的数,平移后使其没有负数。
##############################################################################
以上是关于boxcox的方法。
以下是我在实际操作过程中的r代码,因为我计算得出的x中都是负数,所以我是对x取的相反数。不知道这样对不对。
x=read.csv("hedonic.csv",header=T)
z=read.csv("z.csv",header=T)
m=0
for(i in 1:3){
m=m+exp(-z[,(i-1)*2+2]/188)*(1-exp(z[,(i-1)*2+1]/12))
}
m1=m/abs(min(m)) #########对m进行变换########
m2=-m1
summary(z<-powerTransform(m2)) #####decide the best λ ######
p=bcPower(m2,0.1) ########其中m2是需要变换的数据,0.1是上一步确定的最优的λ#############
hist(p)
#############################################################################