R 语言与简单的回归分析


           回归模型是计量里最基础也最常见的模型之一。究其原因,我想是因为在实际问题中我们并不知道总体分布如何,而且只有一组数据,那么试着对数据作回归分析将会是一个不错的选择。

一、简单线性回归

           简单的线性回归涉及到两个变量:一个是解释变量,通常称为x;另一个是被解释变量,通常称为y。回归会用常见的最小二乘算法拟合线性模型:

yi = β0 + β1xi +εi

其中β0和β1是回归系数,εi表示误差。

在R中,你可以通过函数lm()去计算他。Lm()用法如下:

lm(formula, data, subset, weights, na.action,

  method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE,

  singular.ok = TRUE, contrasts = NULL, offset, ...)

 

      参数是formula模型公式,例如y ~ x。公式中波浪号(~)左侧的是响应变量,右侧是预测变量。函数会估计回归系数β0和β1,分别以截距(intercept)和x的系数表示。

      有三种方式可以实现最小二乘法的简单线性回归,假设数据wage1(可以通过names函数查看数据框各项名称)

(1)lm(wage1$wage ~ wage1$educ + wage1$exper)

(2)lm (wage ~ educ + exper, data= wage1)

(3)attach(wage1)

    lm(wage~educ+exper)#不要忘记处理完后用detach()解出关联

         我们以数据wage1为例,可以看到工资与教育水平的线性关系:

运行下列代码:

library(foreign)

A<-read.dta("D:/R/data/WAGE1.dta")#导入数据

lm(wage~educ,data=A)

>lm(wage~educ,data=A)

Call:

lm(formula = wage~ educ, data = A)

Coefficients:

(Intercept)         educ 

-0.9049      0.5414

           当然得到这些数据是不够的,我们必须要有足够的证据去证明我们所做的回归的合理性。那么如何获取回归的信息呢?

          尝试运行以下代码:

result<-lm(wage~educ,data=A)

summary(result)

我们可以得到以下结果:

Call:

lm(formula = wage~ educ, data = A)

Residuals:

    Min     1Q     Median     3Q     Max

-5.3396   -2.1501    -0.9674     1.1921    16.6085

Coefficients:

            Estimate   Std.Error    t value  Pr(>|t|)   

(Intercept)   -0.90485   0.68497   -1.321   0.187   

educ         0.54136    0.05325 10.167   <2e-16 ***

---

Signif.codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05‘.’ 0.1 ‘ ’ 1

Residual standarderror: 3.378 on 524 degrees of freedom

MultipleR-squared: 0.1648,     AdjustedR-squared: 0.1632

F-statistic: 103.4on 1 and 524 DF,   p-value: < 2.2e-16

              解读上述结果,我们不难看出,单从判决系数R-squared上看,回归结果是不理想的,但是,从p值来看,我们还是可以得到回归系数是很显著地(注意,这里的P<0.05就可以认为拒绝回归系数为0,即回归变量与被解释变量无关的原择假设,选择备择假设)所以说我们的回归的效果不好但还是可以接受的。当然,这一点也可以通过做散点图给我们直观的印象:

R 语言与简单的回归分析_第1张图片

             但是影响薪酬的因素不只是education,可能还有其他的,比如工作经验,工作任期。为了更好地解释影响薪酬的因素,我们就必须用到多元线性回归。

             如果不需要那么多的信息,比如我们只需要F统计量,那么运行anova(result)即可得到方差分析表,更适合阅读。

            另外,再介绍一下函数predict,用法如下:

predict(object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
        interval = c("none", "confidence", "prediction"),
        level = 0.95, type = c("response", "terms"),
        terms = NULL, na.action = na.pass,
        pred.var = res.var/weights, weights = 1, ...)
      说明一下,newdata的数据结构是一个数据框。
           这里还值得一提的参数时interval,他有三个选项:none代表不作区间预测,仅给出响应变量的估计;confidence是给出E(Y|X=x)的置信区间;prediction是给出真实Y的置信区间,运行代码你就会发现两者的差别。出于稳健性考虑,给出自变量取值时,预测Y值通常会采用prediction参数,但是对于X=x时Y的均值的预测就应该用confidence参数(因为回归模型是Y=βX+e,所以自变量相同,响应变量也未必一样)

二、多元线性回归

               还是使用lm函数。在公式的右侧指定多个预测变量,用加号(+)连接:

> lm(y ~ u + v+ w)

                显然,多元线性回归是简单的线性回归的扩展。可以有多个预测变量,还是用OLS计算多项式的系数。三变量的回归等同于这个线性模型:

yi = β0 + β1ui +β2vi + β3wi + εi

              在R中,简单线性回归和多元线性回归都是用lm函数。只要在模型公式的右侧增加变量即可。输出中会有拟合的模型的系数:

>result1<-lm(wage~educ+exper+tenure,data=A)

>summary(result1)

Call:

lm(formula = wage~ educ + exper + tenure, data = A)

Residuals:

    Min     1Q    Median      3Q    Max

-866.29    -249.23   -51.07   189.62   2190.01

Coefficients:

            Estimate    Std.Error    t value   Pr(>|t|)   

(Intercept)    -276.240   106.702   -2.589   0.009778 **

educ          74.415      6.287  11.836   <2e-16 ***

exper         14.892      3.253  4.578   5.33e-06 ***

tenure         8.257      2.498  3.306   0.000983 ***

---

Signif.codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05‘.’ 0.1 ‘ ’ 1

Residual standarderror: 374.3 on 931 degrees of freedom

MultipleR-squared: 0.1459,     AdjustedR-squared: 0.1431

F-statistic:    53 on 3 and 931 DF,   p-value: < 2.2e-16

           我们将数据稍作平稳化处理,将wage换成log(wage),再来看看。

>plot(wage~educ,data=A)

>A$logwage<-log(A$wage)

>result1<-lm(logwage~educ+exper+tenure,data=A)

>summary(result1)

Call:

lm(formula =logwage ~ educ + exper + tenure, data = A)

Residuals:

     Min      1Q    Median      3Q      Max

-2.05802     -0.29645   -0.03265  0.28788   1.42809

Coefficients:

            Estimate   Std. Error   t value   Pr(>|t|)   

(Intercept)   0.284360  0.104190   2.729   0.00656**

educ        0.092029   0.007330 12.555  < 2e-16 ***

exper       0.004121   0.001723  2.391  0.01714 * 

tenure      0.022067  0.003094   7.133 3.29e-12 ***

---

Signif.codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05‘.’ 0.1 ‘ ’ 1

Residual standarderror: 0.4409 on 522 degrees of freedom

MultipleR-squared: 0.316,      AdjustedR-squared: 0.3121

F-statistic: 80.39on 3 and 522 DF,   p-value: < 2.2e-16

             看得出,平稳化后的数据线性性是更加好的。

            下面我们来提取回归分析的各项统计数据:

           一些统计量和参数都被存储在lm或者summary中

output <-summary (result1)

SSR<- deviance(result1)#残差平方和;(另一种方法:RSquared <- output$r.squared)

LL<-logLik(result1) #对数似然统计量

DegreesOfFreedom<-result1$df #自由度

Yhat<- result1$fitted.values#拟合值向量

Resid<- result1$residuals

s<-output$sigma #误差标准差的估计值(假设同方差)

CovMatrix <-s^2*output$cov #系数的方差-协方差矩阵(与vcov(result1)同)

ANOVA<-anova(result1)#F统计量

confidentinterval<-confint(result1)#回归系数的置信区间,level=0.95

effects(result1)#计算正交效应向量(Vector of orthogonal effects )

predict函数用法与一元完全相同

三、检查结果

      检查回归结果是一件复杂而痛苦地事情,需要检验的东西也很多,当然有不少事是应该在数据进行回归分析之前就该处理的,比如检查复共线性;也有处理中需要考虑的,比如模型的选择,数据的变换;也有事后需要做的,比如残差正态性检验;还有需要关注与特别处理的数据,比如离群点,杠杆点。

     这里我们只提最简单与最常见的事后处理的基本分析。

    通过图形我们可以以一种十分直观的办法检测我们的拟合效果:

plot(result1)

R 语言与简单的回归分析_第2张图片

     通过扩展包car中的函数来检测异常值与主要影响因子。代码如下:
library(car) 
outlierTest(result1)
influence.measures(result1)

      在R中,线性回归计算变得无比简单,一个lm函数(或glm函数)基本上就摆平了OLS的一切。但拟合数据还仅仅是万里长征第一步。最终决定成败的是拟合的模型是否能真正地派上用场。这样对结果的检测与分析就显得尤为重要。


你可能感兴趣的:(R 语言与简单的回归分析)