很多同学在做线性回归的时候,不明白到底是直接那原始数据跑,还是要用中心化的数据跑,或者还是用标准化的数据跑。先说结论,相对于原始回归模型,中心化回归模型只是截距发生了改变(相当于平移到原点),标准化回归模型截距和斜率都有改变,但三个模型的拟合程度都是一致的,就是自变量对因变量的解释程度没有变化。
现在我们就具体看一下中心化和标准化对线性回归有哪些影响。
中心化其实就是把每个数据减去那列的均值,标准化其实就是对中心化后的数据再除以数据的标准差。在R里面中心化和标准化都可以用scale()计算, 只是在参数上会有一些变化。
数据中心化:scale(data,center=T,scale=F)
数据标准化:scale(data,center=T,scale=T)
还是以著名的iris数据集为例,因为数据集最后一列是字符型数据,所以我们取前四列数值型数据
data=iris[1:4]
数据集长这样,是一个150行4列的数据集。
我们对它进行回归分析
model_raw=lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,data=data)
summary(model_raw)
这是它的结果
我们先不解读结果,继续构建中心化和标准化后的数据集,先构建中心化数据集
data_center=scale(data,center=T,scale=F)
model_center=lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,data=data_center)
summary(model_center)
这是中心化数据集的结果
这里注意,e-01其实就是10的-1次方,所以我们中心化数据集和原始数据集的回归结果只在截距项(intercept)上有差异,在斜率(回归系数)上是不存在差异的,而且我们也可以看到两个模型在残差(Residuals),R^2(R-squared),F值(F-statistic)和p值(p-value)上都没有差异。而且我们可以看到,中心化数据集中,截距项小到可以忽略不计,e-16就是10的-16次方。所以我们知道,其实中心化只改变的截距项,也就是相当于将回归方程平移到了原点附近。
继续构建标准化的数据集
data_scale=data.frame(scale(data,center=T,scale=T))
model_scale=lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width,data=data_scale)
summary(data_scale)
这是标准化数据集的结果
这时我们可以看到,这个回归方程的截距项和斜率(回归系数)都改变了,但R^2(R-squared),F值(F-statistic)和p值(p-value)上都没变化,说明标准化回归模型的拟合程度其实和原始回归模型,以及中心化回归模型是一致的,也可以理解为在三个方程上,自变量对因变量的解释程度是一致的。甚至我们可以看到,虽然标准化回归模型的斜率变化了,但其实对斜率的t检验结果和原始回归模型,以及中心化回归模型也是一致的。
那么标准化有什么意义呢,标准化处理相当于消灭了量纲,比如身高的单位是“米”,而体重的单位是“斤”,我们做中心化时,只是减掉了均值,单位还是存在,而进行标准化后,就消灭了量纲的差异所带来的影响。
所以话又说回来,如果我们追求模型的可解释性,比如“身高增加1米,体重增加多少斤”这样带有量纲的问题,其实直接用原始数据或者中心化数据计算也没有问题。
最后希望今天的内容对大家有帮助。