在许多情况下,为了满足经典线性模型的正态性假设,常常需要使用指数变换或者对数转化,使其转换后的数据接近正态,比如数据是非单峰分布的,或者各种混合分布,虽然不一定起作用,但是不妨试试。
我们使用平日最常见的box-cox转换,因为之前看到有人问到如何使用spss进行转换,到网上找了资料,是需要语法的,在spss中进行语法指令,显然相比较用R,还是很不方便。
分两步,第一步需要计算出,lambda值,然后把转化后的lambda值带入方程中,同时对于转换后的数据拟合出来的方程依然进行正态性的检验
语句如下:
library(MASS)
D=read.csv("/Users/hjs/Documents/train_test_model/ridgereg1.csv",sep=",") # 加载数据
#2拟合BOXCOX 模型
b=boxcox(y~., data=D) # 定义函数类型和数据
I=which(b$y==max(b$y))
b$x[I]#lambda=0.83
#得到
0.828就
是下图的最高点
依据上一步boxcox转化的lambda值,即0.83次方,代入模型
c=lm(y^0.83 ~ long + touwei + weight,data=D) # 定义一个多元回归,同理y x1 x2 x3 是cvs文件中,带变量名的字母
d=step(c) # 使用逐步法,进入多个自变量
summary(d) # 模型汇总
anova(d) # 用方差分析法对拟合的模型进行检验
shapiro.test(d$res) # 用残差对boxcox变化后的这个逐步回归方程 正态性进行检验
Start: AIC=-21.51
y^0.83 ~ long + touwei + weight
Df Sum of Sq RSS AIC
<none> 5.7518 -21.5136
- touwei 1 4.7894 10.5412 -10.1865
- long 1 6.5893 12.3411 -6.7184
- weight 1 11.3733 17.1251 0.4891
Residuals:
Min 1Q Median 3Q Max
-0.88677 -0.36357 -0.05594 0.38686 1.33507
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.1472866 0.8353396 8.556 9.29e-08 ***
long 0.8158515 0.1796633 4.541 0.000253 ***
touwei -1.0078211 0.2603217 -3.871 0.001118 **
weight 0.0033182 0.0005562 5.966 1.21e-05 ***
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5653 on 18 degrees of freedom
Multiple R-squared: 0.9753, Adjusted R-squared: 0.9712
F-statistic: 237.4 on 3 and 18 DF, p-value: 1.173e-14
在许多情况下,为了满足经典线性模型的正态性假设,常常需要使用指数变换或者对数转化,使其转换后的数据接近正态,比如数据是非单峰分布的,或者各种混合分布,,虽然不一定起作用,但是不妨试试。我们使用平日最常见的box-cox转换,因为之前看到有人问到如何使用,spss进行转换,到网上找了资料,是需要语法的,在spss中进行语法指令,显然相比较用R,还是很不方便的。D=read.csv("/Use
R语言进行Box-Cox变换
为什么要进行Box-Cox转换
Box-Cox是一种广义幂变换,统计建模中常用的变换,用于连续响应变量不满足正态时的情况。Box-Cox的一个显著的有点是通过求变参数λ来确定变换形式,而这个过程完全基于数据本身而无需任何先导信息,这比凭经验的对数,平方根变换更客观。
Box-Cox变换公式
其中,y必须取正值,y值为负,首先y+a,对不同的λ所做的变换不同。λ=0对数变换;λ=-1倒数变换;λ=0.5平方根变换。
基于R语言进行Box-Cox转换
STEP1:加载程序包并
R语言Box-Cox变换实战(Box-Cox Transformation):将非正态分布数据转换为正态分布数据
#拟合两个回归模型(一个使用box-cox处理响应变量并获取最佳λ)
#创建两个Q-Q图可视化两个回归模型之间残差的差异
box-cox变换是将非正态分布数据集转换为正态分布数据集的常用方法。
这种方法背后的基本思想是使用以下公式为λ找到一些值,以便转换后的
Box-Cox变换的作用是把不怎么正态化的一组数,让它们变得更加正态化。详情可以参考百度百科:Box-Cox变换。
R语言有好几个包可以实现Box-Cox变换,比如car、MASS、forecast。发现forecast是最简单而且容易理解的。
2.求最优的λ
比如对于随便一个数组y,例如
y=c(269,321,585,871,1475,2821,392,594,4950,2577,5...
1.消除异方差
代码实现如下:
data3.2&lt;-read.csv("C:/Users/Administrator/Desktop/data3.2.csv",head=TRUE)
library(MASS)
bc3.2&lt;-boxcox(y~x1+x2,data=data3.2,lambda=seq(-2,2,0.01))
# λ的取值为区间[-2,2]上步长为0.01的值,bc3.2中...
参加kaggle比赛过程中,看到很多人在预处理阶段会对某些特征X做如下操作 Y = log(1+X), 说是可以把这个特征的分布正态化, 使其更加符合后面数据挖掘方法对数据分布的假设. 自己试了一下,有时的确可以提高准确度,有时却降低了准确度,很好奇其中的原理,遂在网上搜索了一番,整理如下.
Y = log(1+X)这个操作的真名应该时boxcox变换,用来降低X的skewness值,达到接近正...
y=c(160,260,210,265,240,220,275,160,275,250)
x1=c(70,75,65,74,72,68,78,66,70,65)
x2=c(35,40,40,42,38,45,42,36,44,42)
x3=c(1,2.4,2,3,1.2,1.5,4,2,3.2,3)
shuju
shuju
shuju.reg=lm(y~.,data=shuju)#(2
Box和Cox在1964年提出的变换可以使线性回归模型满足线性性、独立性、方差齐性以及正态性的同时,又不丢失信息,此种变换称之为Box—Cox变换。
进行boxcox转换,以及逆变换