回归分析在统计学中非常重要,目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来预测研究者感兴趣的变量。回归分析可以帮助人们了解在只有一个自变量变化时因变量的变化量。
例:UsingR包的galton数据集,包括配对的父母和孩子的身高。
查看父母身高和孩子身高的边缘分布,父母性别的身高差异通过母亲身高乘1.8校正:
library(UsingR)
data(galton)
library(reshape)
long <- melt(galton)
g <- ggplot(long, aes(x = value, fill = variable))
g <- g + geom_histogram(color = "black", binwidth =1)
g <- g + facet_grid(.~variable)
g
图1.孩子和父母身高的边缘分布
用父母的身高预测孩子的身高,不考虑父母的身高时,利用最小二乘法求孩子身高的最佳预测?:令
为第
个孩子的身高,
,当
最小时,孩子身高的真实值与预测值的差值最小,即残差平方和最小,此时?即为孩子身高的最佳预测,等于孩子身高分布估计的均值。
用manipulate()函数查看不同?值下残差平方的平均值变化:
library(manipulate)
myHist <- function(mu){
mse <- mean((galton$child - mu)^2) #对残差平方取均值而不是求和
g <- ggplot(galton, aes(x = child)) + geom_histogram(fill = "salmon", color = "black", binwidth = 1)
g <- g + geom_vline(xintercept = mu, size = 3)
g <- g + ggtitle(paste("mu = ", mu, "MSE = ", round(mse, 2), sep = ""))
g
}
manipulate(myHist(mu), mu = slider(62, 74, step = 0.5))
图2.不同?值下残差平方的平均值变化
可以看到?值变大向分布中心靠近时,残差平方的均值变小;?值从分布中心继续变大时,残差平方的均值重新变大。当?等于孩子身高均值时,残差平方的均值最小,即孩子身高的最小二乘估计是孩子身高的均值。
g <- ggplot(galton, aes(x = child)) + geom_histogram(fill = "salmon", color = "black", binwidth = 1)
g <- g + geom_vline(xintercept = mean(galton$child), size = 3)
g
图3.孩子身高的均值
证明孩子身高的均值
是使公式
最小的?值:
即?等于孩子身高均值
时,残差平方和最小。
比较配对的父母身高和孩子身高:
ggplot(galton, aes(x=parent, y=child))+ geom_point()
图4.父母身高及相应的孩子身高的散点图
这个图中有许多点被重复绘制,数据的频数信息没有被展示出来。
library(UsingR)
data(galton)
library(dplyr)
library(ggplot2)
freqData <- as.data.frame(table(galton$parent,galton$child))
names(freqData) <- c("child","parent","freq")
freqData$parent<- as.numeric(as.character(freqData$parent))
freqData$child <- as.numeric(as.character(freqData$child))
g <- ggplot(filter(freqData, freq > 0), aes(x = parent, y = child))
g <- g + scale_size(range = c(2, 20), guide = "none")
g <- g + geom_point(color = "grey50", aes(size = freq))
g <- g + geom_point(aes(color=freq,size = freq))
g <- g + scale_color_gradient(low = "lightblue", high = "white")
g
图5.父母身高与孩子身高关系的气泡图
气泡大小及颜色深浅表示在特定父母身高与相应孩子身高的配对组合的数量。
最小二乘法拟合线性模型解释父母身高与孩子身高的关系,令回归线经过原点,即截距为0,这条线可用
表示。令
为父母身高,最适合的线性模型的斜率?使实际观测值与预测值之间的残差平方和
最小。
使用manipulate()函数查看不同?值的残差平方和变化:
y <- galton$child - mean(galton$child)
x <- galton$parent - mean(galton$parent) #通过减去均值使数据回归线经过原点
freqData <- as.data.frame(table(x,y))
names(freqData) <- c("child","parent","freq")
freqData$parent<- as.numeric(as.character(freqData$parent))
freqData$child <- as.numeric(as.character(freqData$child))
myPlot <- function(beta){
g <- ggplot(filter(freqData, freq > 0), aes(x = parent, y = child))
g <- g + scale_size(range = c(2, 20), guide = "none")
g <- g + geom_point(color = "grey50", aes(size = freq+20))
g <- g + geom_point(aes(color=freq,size = freq))
g <- g + scale_color_gradient(low = "lightblue", high = "white")
g <- g + geom_abline(intercept = 0, slope = beta, size = 3)
mse <- mean((y - beta * x)^2)
g <- g + ggtitle(paste("beta = ", beta, "mse = ", round(mse, 3)))
g
}
manipulate(myPlot(beta), beta = slider(0.6, 1.2, step = 0.02))
图6.不同?值的残差平方和变化
可以看到,斜率?=0.64时,残差平方和最小。可以用
预测孩子的身高。
在R中可以用lm()函数快速拟合线性模型。
lm(I(child-mean(child))~I(parent-mean(parent))-1,data=galton)
Call:
lm(formula = I(child - mean(child)) ~ I(parent - mean(parent)) -
1, data = galton)
Coefficients:
I(parent - mean(parent))
0.6463
可以在图5基础上重新绘制线性回归线:
freqData <- as.data.frame(table(galton$parent,galton$child))
names(freqData) <- c("child","parent","freq")
freqData$parent<- as.numeric(as.character(freqData$parent))
freqData$child <- as.numeric(as.character(freqData$child))
g <- ggplot(filter(freqData, freq > 0), aes(x = parent, y = child))
g <- g + scale_size(range = c(2, 20), guide = "none")
g <- g + geom_point(color = "grey50", aes(size = freq))
g <- g + geom_point(aes(color=freq,size = freq))
g <- g + scale_color_gradient(low = "lightblue", high = "white")
g <- g + geom_smooth(method = lm, formula=y~x, se=FALSE, size = 3, color="red")
g
图7.添加回归线
,则
的均值为0。这个过程称为"居中"随机变量。
最小的最小二乘解
,注意标准差与数据有相同单位
的经验标准差为1,这个过程称为"缩放"数据。
代替分母
,后者为无偏估计
,经验均值为0,经验标准差为1。
,定义经验协方差为
代替分母
,后者为无偏估计
和
分别是
观测值和
观测值的标准差的估计值
或
观测值分别恰好落在正斜率线或负斜率线时,
和
度量
和
数据之间线性关系的强度
表示没有线性关系
回顾前面galton数据集中父母与孩子身高的例子
令
为第
个孩子的身高,
为父母身高,线性回归
,最小二乘法要求
最小。
,回归线为
,经过点
。
预测
,此时回归线斜率为
,回归线斜率相同,并经过原点
y<-galton$child
x<-galton$parent
beta1<-cor(y,x)* sd(y)/sd(x)
beta0<-mean(y)-beta1*mean(x)
rbind(c(beta0,beta1),coef(lm(y~x)))
(Intercept) x
[1,] 23.94 0.6463
[2,] 23.94 0.6463
在R中检查计算,根据公式计算的斜率和截距与lm()函数拟合回归线得到的结果一样。
beta1<-cor(y,x)* sd(x)/sd(y)
beta0<-mean(x)-beta1*mean(y)
rbind(c(beta0,beta1),coef(lm(x~y)))
(Intercept) y
[1,] 46.14 0.3256
[2,] 46.14 0.3256
用变量Y预测X,计算结果一致。
yc<-y-mean(y)
xc<-x-mean(x)
beta1<-sum(yc*xc)/sum(xc^2)
c(beta1,coef(lm(y~x))[2])
x
0.6463 0.6463
将数据居中,
,回归线斜率相同。
yn<-(y-mean(y))/sd(y)
xn<-(x-mean(x))/sd(x)
c(cor(y,x),cor(yn,xn),coef(lm(yn~xn))[2])
xn
0.4588 0.4588 0.4588
标准化数据,回归线斜率为相关系数
。