回归分析
这里列出的是一些常用的回归方法
回归类型 | 用途 |
---|---|
简单线性 | 一个量化的解释变量来预测一个量化的响应变量(一个因变量x、一个自变量y) |
多项式 | 一个量化的解释变量预测一个量化的响应变量,模型的关系是n阶多项式((一个因变量x、一个自变量y)) |
多元线性 | 用两个或多个量化的解释变量预测一个量化的响应变量(x1,x2,x3......;y) |
Logistic | 用一个或多个解释变量预测一个类别型变量 |
非线性 | 用一个或多个量化的解释变量预测一个量化的响应变量,不过模型是非线性的,比如指数回归,对数回归等(一个因变量x、一个自变量y) |
非参数 | 用一个或多个量化的解释变量预测一个量化的响应变量,模型的形式源自数据形式,不事先设定(一个因变量x、一个自变量y) |
1.1参数回归分析,也即拟合曲线。一般采用最小二乘法实现拟合曲线的参数计算(使残差平方和最小)
按自变量的多少分为一元和多元回归分析;按自变量和因变量的关系分为线性和非线性回归;比较常用的是多项式回归、线性回归和指数回归。
1.2 用lm()拟合回归模
拟合线性模型最基本的函数就是lm(),格式为:
myfit<-lm(formula,data)
formula指要拟合的模型形式,data是一个数据框,包含了用于拟合模型的数据
formula形式如下:Y~X1 X2 …… Xk (~左边为响应变量,右边为各个预测变量,预测变量之间用 符号分隔)
R表达式中常用的符号 | |
---|---|
符号 | 用途 |
~ | 分隔符号,左边为响应变量,右边为解释变量,eg:要通过x、z和w预测y,代码为y~x z w |
| 分隔预测变量 |
: | 表示预测变量的交互项 eg:要通过x、z及x与z的交互项预测y,代码为y~x z x:z |
* | 表示所有可能交互项的简洁方式,代码y~x*z*w可展开为y~x z w x:z x:w z:w x:z:w |
^ | 表示交互项达到某个次数,代码y~(x z w)^2可展开为y~x z w x:z x:w z:w |
. | 表示包含除因变量外的所有变量,eg:若一个数据框包含变量x、y、z和w,代码y~.可展开为y~x z w |
- | 减号,表示从等式中移除某个变量,eg:y~(x z w)^2-x:w可展开为y~x z w x:z z:w |
-1 | 删除截距项,eg:y~x-1表示拟合y在x上的回归,并强制直线通过原点 |
I() | 从算术的角度来解释括号中的元素。Eg:y~x (z w)^2将展开为y~x z w z:w。相反,代码y~x I((z w)^2)将展开为y~x h,h是一个由z和w的平方和创建的新变量 |
function | 可以在表达式中用的数学函数,例如log(y)~x z w表示通过x、z和w来预测log(y) |
1.3. 简单线性回归
直线回归的假设检验
任何两个变量之间都可以建立直线回归方程,而该方程是否有意义,关键在于回归是否达到显著水平/因为即使x,y之间不纯在线性关系,即β=0,但由于抽样误差,其回归系数b也不一定为0,因此我们需要用到方差分析或者t检验进行β是否为零的假设检验。
直线回归的变异来源
2、一元线性回归的假设检验
在一元线性回归中(多元也一样),假设检验主要分两块,分为对回归方程的检验和对回归系数的检验,这两个检验虽然构造的统计量不同,但在一元线性回归中,这两个检验结果是一样的。
对回归方程的检验
y的变异我们可以对其进行分解,即总编一可以分解为由x引起的变异和误差引起的变异
其中:
所以平方和分解式可以写成:
F检验。
假设H0:两个变量之间无线性关系, HA:两个变量之间存在线性关系。在无效假设下,SSR与SSE之间的比值服从df=1和df=n-2的F分布
构造统计量:
后面就是计算统计量,计算P值,确定是否显著。
T检验
我们也可以采用T检验检验线性回归的显著性。H0:β=0,HA:β不等于0
知道了一个统计量的值以及他的样本方差,便可以对进行t检验,比如我们检验β均值为0, t值如下,通过t分布,可以查出某一个t值对应的p值,如果p值<0.05, 那么我可以拒绝该假设。
R方
R方的取值范围是0到1,所以它给出的信息是一个相对的RSE值,计算方式如下。如果R方越接近于1,越是说明RSS即残差平方和足够小。所以R方与F统计值有很强的关系,可以看作F值的另一种形式。
综合上述,对一个拟合的检验有三种统计量衡量,分别为t,F,和R方,在R中如下图所示:
eg:
代码语言:javascript复制fit<-lm(weight~height,data=women)
summary(fit)
> summary(fit)
lm(formula = weight ~ height, data = women)
Residuals:
Min 1Q Median 3Q Max
-1.7333 -1.1333 -0.3833 0.7417 3.1167
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -87.51667 5.93694 -14.74 1.71e-09 ***
height 3.45000 0.09114 37.85 1.09e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.525 on 13 degrees of freedom
Multiple R-squared: 0.991, Adjusted R-squared: 0.9903
F-statistic: 1433 on 1 and 13 DF, p-value: 1.091e-14
在Pr(>|t|)栏,可以看到回归系数(3.45)显著不为0(p<0.001),表明身高每增加1英寸,体重将预期地增加3.45磅
R平方项(0.991)表明模型可以解释体重99.1%的方差,它也是实际和预测值之间的相关系数(R^2=r^2)
残差的标准误(1.53lbs)则可认为模型用身高预测体重的平均误差
F统计量检验所有的预测变量预测响应变量是否都在某个几率水平之上
对拟合线性模型非常有用的其他函数 | |
---|---|
函数 | 用途 |
Summary() | 展示拟合的详细结果 |
Coefficients() | 列出拟合模型的模型参数(截距项和斜率) |
Cofint() | 提供模型参数的置信区间(默认95%) |
Fitted() | 列出拟合模型的预测值 |
Residuals() | 列出拟合模型的残差值 |
Anova() | 生成一个拟合模型的方差分析,或者比较两个或更多拟合模型的方差分析表 |
Vcov() | 列出模型参数的协方差矩阵 |
AIC() | 输出赤池信息统计量 |
Plot() | 生成评价拟合模型的诊断图 |
Predict() | 用拟合模型对新的数据集预测响应变量值 |
residuals(fit)#拟合模型的残差值
绘制带回归线的散点图
代码语言:javascript复制fit<-lm(weight~height,data=women)
summary(fit)
myintercept<-fit$coefficients[[1]]
myslope<-fit$coefficients[[2]]
ggplot(data=women,aes(height,weight))
geom_point(size=5,color="red")
geom_abline(slope=myslope,intercept=myintercept)
绘制带残差显得散点图
代码语言:javascript复制fit<-lm(weight~height,data=women)
summary(fit)
women$predicted <- predict(fit) # Save the predicted values
women$residuals <- residuals(fit) # Save the residual values
women$Abs_Residuals<-abs(women$residuals)
myintercept<-fit$coefficients[[1]]
myslope<-fit$coefficients[[2]]
ggplot(data=women,aes(x=height,y=weight))
geom_point(aes(size=Abs_Residuals,color=Abs_Residuals)) # 根据残差大小绘制点
scale_fill_continuous(low = "black", high = "red")
geom_abline(slope=myslope,intercept=myintercept) #添加回归线
geom_segment(aes(xend = height, yend = predicted), alpha = .2) #添加纵向残差线
theme_classic()
用geom_smooth方法绘制回归线
代码语言:javascript复制fit<-lm(weight~height,data=women)
summary(fit)
women$predicted <- predict(fit) # Save the predicted values
women$residuals <- residuals(fit) # Save the residual values
women$Abs_Residuals<-abs(women$residuals)
myintercept<-fit$coefficients[[1]]
myslope<-fit$coefficients[[2]]
ggplot(data=women,aes(x=height,y=weight))
geom_point(aes(size=Abs_Residuals,color=Abs_Residuals))
scale_fill_continuous(low = "black", high = "red")
#geom_abline(slope=myslope,intercept=myintercept)
geom_segment(aes(xend = height, yend = predicted), alpha = .2)
geom_smooth(method = "lm", se =F, color = "lightgrey")
theme_classic()