用R语言做数据分析:回归分析(一)

R中的lm函数可以用来做回归分析。

我们去R中的datasets包中的cars数据。这个数据由50个汽车速度和刹车距离的观察值组成。以下是前6条数据

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

现在我们想要找出车速和刹车距离之间的关系,看看他们之间有什么关系。首先试着进行线性拟合,然后画出这些点图和拟合图

> yy=lm(dist~speed,data=cars)
> plot(cars$speed,cars$dist)
> abline(yy)

线性拟合 线性拟合

从图上可以看出,这些点分布在直线的附近,但是不算太近。利用summary函数来查看下拟合的统计结果

> summary(yy)

Call:
lm(formula = dist ~ speed, data = cars)

Residuals:
    Min      1Q  Median      3Q     Max 
-29.069  -9.525  -2.272   9.215  43.201 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -17.5791     6.7584  -2.601   0.0123 *  
speed         3.9324     0.4155   9.464 1.49e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 15.38 on 48 degrees of freedom
Multiple R-squared:  0.6511,    Adjusted R-squared:  0.6438 
F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

从这里看出,残差的方差为15.38。R^2值为0.65,不算太大,F值远大于1,表明speed的系数不显著为零。在系数栏那里看到speed系数和截距为零的p值较小,也就是二者不显著为零。表明二者存在线性关系。

进一步的,如果取二者的对数值进行拟合情况如何呢?

> cars$logdist=log(cars$dist)
> cars$logspeed=log(cars$speed)
> yy3=lm(logdist~logspeed,data=cars)
> summary(yy3)

Call:
lm(formula = logdist ~ logspeed, data = cars)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.00215 -0.24578 -0.02898  0.20717  0.88289 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -0.7297     0.3758  -1.941   0.0581 .  
logspeed      1.6024     0.1395  11.484 2.26e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4053 on 48 degrees of freedom
Multiple R-squared:  0.7331,    Adjusted R-squared:  0.7276 
F-statistic: 131.9 on 1 and 48 DF,  p-value: 2.259e-15

对数线性拟合 对数线性拟合

可见这个拟合度要好一点,R^2 = 0.733 , 比上面的值有了明显的增大。F值也有所增加。说明这个拟合要好于上面的拟合。

另外, 我试了一个基本上有线性关系的数据dd$x=c(1,2,3,4,5,6,7) dd$y=c(2,4,6,8,10,11,14) , 基本上是y=2*x
拟合的结果是如下

> summary(yy)

Call:
lm(formula = y ~ x, data = dd)

Residuals:
         1          2          3          4          5          6          7 
-7.143e-02  7.428e-16  7.143e-02  1.429e-01  2.143e-01 -7.143e-01  3.571e-01 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.14286    0.31944   0.447    0.673    
x            1.92857    0.07143  27.000  1.3e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.378 on 5 degrees of freedom
Multiple R-squared:  0.9932,    Adjusted R-squared:  0.9918 
F-statistic:   729 on 1 and 5 DF,  p-value: 1.304e-06

可以看到R^2已经到0.99了,说明拟合度很好,F值也很大,说明二者有线性关系。在系数那里,其中的Pr(>|t|)表示其系数为零的p值,其p值越小,表明其系数为零的概率越低。因此,x的系数显著不为零,但是截距是显著为零的,这与我们期望的一致(y=2*x+0 , 其中的截距为零)

注:关于F值的问题:
为了检验线性系数是否显著为零,假设其显著为零,则F=Sr/(Se/(n-2)) 是一个F(1,n-2)分布。其中Sr是回归平方和,Se是残差平方和。根据计算出的F值,查找F分布表,可知当前F值对应的概率,如果F值在1附近取值,则表明系数显著为零,二者不存在线性关系。否则,可认为线性系数不显著为零。线性拟合成立。



本文地址: http://www.bagualu.net/wordpress/archives/4933 转载请注明




“用R语言做数据分析:回归分析(一)”的2个回复

    1. 前面的非对数拟合中,按照文中的代码应该是有直线的。
      在对数拟合的代码中,省去了绘图的代码。其代码可参考
      非对数拟合,利用plot和abline可绘制散点图和拟合直线。

发表评论

电子邮件地址不会被公开。 必填项已用*标注