ISLR统计学习概论(三):线性回归之R语言代码实战

第二章 线性回归

2.1简单线性回归

ISLR2库包含波士顿数据集,该数据集记录波士顿506个人口普查区的medv(房屋价值中值)。
我们将使用12个预测变量,如rmvar(每户平均房间数)、年龄(平均房屋年龄)和lstat(低社会经济地位家庭的百分比),来预测medv。

library(ISLR2)
library(MASS)
head(Boston)
A data.frame: 6 × 14
crim zn indus chas nox rm age dis rad tax ptratio black lstat medv
1 0.00632 18 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 24.0
2 0.02731 0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 21.6
3 0.02729 0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 34.7
4 0.03237 0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 33.4
5 0.06905 0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 36.2
6 0.02985 0 2.18 0 0.458 6.430 58.7 6.0622 3 222 18.7 394.12 5.21 28.7

要了解有关数据集的更多信息,我们可以键入?Boston。
我们将首先使用lm()函数拟合一个简单的线性回归模型,
以medv作为被解释变量,以lstat作为解释变量。

lm.fit <- lm(medv~lstat, data = Boston)
lm.fit

Call:
lm(formula = medv ~ lstat, data = Boston)

Coefficients:
(Intercept)        lstat  
      34.55        -0.95  
summary(lm.fit)
Call:
lm(formula = medv ~ lstat, data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.168  -3.990  -1.318   2.034  24.500 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 34.55384    0.56263   61.41   <2e-16 ***
lstat       -0.95005    0.03873  -24.53   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.216 on 504 degrees of freedom
Multiple R-squared:  0.5441,	Adjusted R-squared:  0.5432 
F-statistic: 601.6 on 1 and 504 DF,  p-value: < 2.2e-16

我们可以使用names()函数来找出lm中存储了哪些其他信息。我们可以通过名称提取这些数量,
例如lm.fit$coefficients,使用诸如coef()之类的提取器函数来访问它们更安全。

names(lm.fit)
  1. 'coefficients'
  2. 'residuals'
  3. 'effects'
  4. 'rank'
  5. 'fitted.values'
  6. 'assign'
  7. 'qr'
  8. 'df.residual'
  9. 'xlevels'
  10. 'call'
  11. 'terms'
  12. 'model'
# 相关系数
coef(lm.fit)
(Intercept)
34.5538408793831
lstat
-0.95004935375799
# 置信区间
confint(lm.fit)
A matrix: 2 × 2 of type dbl
2.5 % 97.5 %
(Intercept) 33.448457 35.6592247
lstat -1.026148 -0.8739505

predict()函数可用于生成置信区间和预测区间,用于预测给定lstat值的medv。

predict(lm.fit, data.frame(lstat = c(5,10,15)), interval = 'prediction')
A matrix: 3 × 3 of type dbl
fit lwr upr
1 29.80359 17.565675 42.04151
2 25.05335 12.827626 37.27907
3 20.30310 8.077742 32.52846
attach(Boston)
plot(lstat, medv)
abline(lm.fit)

ISLR统计学习概论(三):线性回归之R语言代码实战_第1张图片

函数的作用是:绘制任意直线,而不仅仅是最小二乘回归线。要用截距a和斜率b绘制一条线,我们需要键入一条线(a,b)。下面我们将试验一些用于线和点的附加设置。lwd=3命令使回归线的宽度增加3倍;
这也适用于plot()和lines()函数。我们还可以使用pch选项创建不同的符号。

plot(lstat, medv)
abline(lm.fit, lwd = 3, col='red')

ISLR统计学习概论(三):线性回归之R语言代码实战_第2张图片

plot(lstat, medv, pch = 20)

ISLR统计学习概论(三):线性回归之R语言代码实战_第3张图片

plot(lstat, medv, pch = "+")

ISLR统计学习概论(三):线性回归之R语言代码实战_第4张图片

plot(1:20, 1:20, pch = 1:20)

ISLR统计学习概论(三):线性回归之R语言代码实战_第5张图片

par(mfrow = c(2, 2))
plot(lm.fit)

ISLR统计学习概论(三):线性回归之R语言代码实战_第6张图片

which.max(hatvalues(lm.fit))

375: 375

which.max()函数的作用是:标识向量中最大元素的索引。在本例中,它告诉我们哪个观测具有最大的杠杆统计。

2.2多元线性回归

为了使用最小二乘法拟合多元线性回归模型,我们再次使用lm()函数,summary()函数现在输出所有预测值的回归系数。

mfit <- lm(medv~lstat + age)
summary(mfit)

Call:
lm(formula = medv ~ lstat + age)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.981  -3.978  -1.283   1.968  23.158 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 33.22276    0.73085  45.458  < 2e-16 ***
lstat       -1.03207    0.04819 -21.416  < 2e-16 ***
age          0.03454    0.01223   2.826  0.00491 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.173 on 503 degrees of freedom
Multiple R-squared:  0.5513,	Adjusted R-squared:  0.5495 
F-statistic:   309 on 2 and 503 DF,  p-value: < 2.2e-16

波士顿数据集包含12个变量,因此必须键入所有这些变量才能使用所有预测值进行回归,这将是一件麻烦的事情。相反,我们可以使用以下简称:

lm.fit <- lm(medv ~ ., data = Boston)
summary(lm.fit)

Call:
lm(formula = medv ~ ., data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.595  -2.730  -0.518   1.777  26.199 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.646e+01  5.103e+00   7.144 3.28e-12 ***
crim        -1.080e-01  3.286e-02  -3.287 0.001087 ** 
zn           4.642e-02  1.373e-02   3.382 0.000778 ***
indus        2.056e-02  6.150e-02   0.334 0.738288    
chas         2.687e+00  8.616e-01   3.118 0.001925 ** 
nox         -1.777e+01  3.820e+00  -4.651 4.25e-06 ***
rm           3.810e+00  4.179e-01   9.116  < 2e-16 ***
age          6.922e-04  1.321e-02   0.052 0.958229    
dis         -1.476e+00  1.995e-01  -7.398 6.01e-13 ***
rad          3.060e-01  6.635e-02   4.613 5.07e-06 ***
tax         -1.233e-02  3.760e-03  -3.280 0.001112 ** 
ptratio     -9.527e-01  1.308e-01  -7.283 1.31e-12 ***
black        9.312e-03  2.686e-03   3.467 0.000573 ***
lstat       -5.248e-01  5.072e-02 -10.347  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.745 on 492 degrees of freedom
Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7338 
F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16

summary(lm.fit)$r.sq 得到 $ R 2 {R^2} R2,(lm.fit)$sigma为我们提供了RSE,vif()函数是car包的一部分,可用于计算方差膨胀系数。

library(car)
Warning message:
"package 'car' was built under R version 4.0.5"
Loading required package: carData

Warning message:
"package 'carData' was built under R version 4.0.3"
vif(lm.fit)
crim
1.79219154743324
zn
2.29875817874944
indus
3.99159641834602
chas
1.07399532755379
nox
4.39371984757748
rm
1.93374443578326
age
3.10082551281533
dis
3.95594490637272
rad
7.48449633527445
tax
9.00855394759706
ptratio
1.79908404924889
black
1.34852107640637
lstat
2.94149107809193

如果我们想使用除一个变量外的所有变量执行回归,该怎么办?例如,在上述回归输出中,年龄具有较高的p值。因此,我们可能希望运行一个不包括该预测值的回归。以下语法导致使用除年龄以外的所有预测值进行回归。

mfit2 <- lm(medv ~.- age, data=Boston)
summary(mfit2)

Call:
lm(formula = medv ~ . - age, data = Boston)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.6054  -2.7313  -0.5188   1.7601  26.2243 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  36.436927   5.080119   7.172 2.72e-12 ***
crim         -0.108006   0.032832  -3.290 0.001075 ** 
zn            0.046334   0.013613   3.404 0.000719 ***
indus         0.020562   0.061433   0.335 0.737989    
chas          2.689026   0.859598   3.128 0.001863 ** 
nox         -17.713540   3.679308  -4.814 1.97e-06 ***
rm            3.814394   0.408480   9.338  < 2e-16 ***
dis          -1.478612   0.190611  -7.757 5.03e-14 ***
rad           0.305786   0.066089   4.627 4.75e-06 ***
tax          -0.012329   0.003755  -3.283 0.001099 ** 
ptratio      -0.952211   0.130294  -7.308 1.10e-12 ***
black         0.009321   0.002678   3.481 0.000544 ***
lstat        -0.523852   0.047625 -10.999  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 4.74 on 493 degrees of freedom
Multiple R-squared:  0.7406,	Adjusted R-squared:  0.7343 
F-statistic: 117.3 on 12 and 493 DF,  p-value: < 2.2e-16

2.3交互项

使用lm()函数可以很容易地在线性模型中包含交互项。语法lstat:black告诉R在lstat和black之间包含一个交互项。语法lstat*age同时包括lstat、age和交互项lstat×age作为预测器;它是lstat+age+lstat:age的缩写我们还可以传递经过转换的预测值。

summary(lm(medv ~ lstat * age, data = Boston))

Call:
lm(formula = medv ~ lstat * age, data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.806  -4.045  -1.333   2.085  27.552 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 36.0885359  1.4698355  24.553  < 2e-16 ***
lstat       -1.3921168  0.1674555  -8.313 8.78e-16 ***
age         -0.0007209  0.0198792  -0.036   0.9711    
lstat:age    0.0041560  0.0018518   2.244   0.0252 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.149 on 502 degrees of freedom
Multiple R-squared:  0.5557,	Adjusted R-squared:  0.5531 
F-statistic: 209.3 on 3 and 502 DF,  p-value: < 2.2e-16

2.4 非线性转换

lm()函数还可以对解释变量的非线性变换。
例如,给定一个解释变量X,我们可以使用I(X2)创建${X^2}$。函数I()是必需的,因为在公式对象中具有特殊意义;
我们所做的包装允许在R中使用标准用法,即将X提高到2的幂。我们现在将medv对lstat和lstat^2的回归。

lm.fit2 <- lm(medv ~ lstat + I(lstat^2))
summary(lm.fit2)

Call:
lm(formula = medv ~ lstat + I(lstat^2))

Residuals:
     Min       1Q   Median       3Q      Max 
-15.2834  -3.8313  -0.5295   2.3095  25.4148 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 42.862007   0.872084   49.15   <2e-16 ***
lstat       -2.332821   0.123803  -18.84   <2e-16 ***
I(lstat^2)   0.043547   0.003745   11.63   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.524 on 503 degrees of freedom
Multiple R-squared:  0.6407,	Adjusted R-squared:  0.6393 
F-statistic: 448.5 on 2 and 503 DF,  p-value: < 2.2e-16
# 通过方差分析比较两个模型的好坏
lm.fit <- lm(medv ~ lstat)
anova(lm.fit, lm.fit2)
A anova: 2 × 6
Res.Df RSS Df Sum of Sq F Pr(>F)
1 504 19472.38 NA NA NA NA
2 503 15347.24 1 4125.138 135.1998 7.630116e-28

这里,模型1表示仅包含一个解释变量lstat的线性子模型,而模型2对应于具有两个解释变量lstat和lstat^2的二次模型。函数的作用是对两个模型进行假设检验。
零假设是两个模型都能很好地拟合数据,被择假设是全模型更优。此处F统计值为135,p值几乎为零。这提供了非常明确的证据,表明包含lstat和lstat^2的模型远远优于仅包含lstat的模型。这并不奇怪,因为早些时候我们看到了medv和lstat之间关系的非线性证据

par(mfrow = c(2, 2))
plot(lm.fit2)

ISLR统计学习概论(三):线性回归之R语言代码实战_第7张图片

然后我们看到,当 l s t a t 2 lstat^2 lstat2 项包含在模型中时,残差图中表现的更好。为了创建三次拟合,我们可以包括形式I(X^3)的预测值。然而,对于高阶多项式,这种方法可能开始变得麻烦。更好的方法是使用poly()函数在lm()中创建多项式。例如,以下命令生成五阶多项式拟合:

mfit5 <- lm(medv ~ poly(lstat, 5))
summary(mfit5)

Call:
lm(formula = medv ~ poly(lstat, 5))

Residuals:
     Min       1Q   Median       3Q      Max 
-13.5433  -3.1039  -0.7052   2.0844  27.1153 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)       22.5328     0.2318  97.197  < 2e-16 ***
poly(lstat, 5)1 -152.4595     5.2148 -29.236  < 2e-16 ***
poly(lstat, 5)2   64.2272     5.2148  12.316  < 2e-16 ***
poly(lstat, 5)3  -27.0511     5.2148  -5.187 3.10e-07 ***
poly(lstat, 5)4   25.4517     5.2148   4.881 1.42e-06 ***
poly(lstat, 5)5  -19.2524     5.2148  -3.692 0.000247 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 5.215 on 500 degrees of freedom
Multiple R-squared:  0.6817,	Adjusted R-squared:  0.6785 
F-statistic: 214.2 on 5 and 500 DF,  p-value: < 2.2e-16

这表明,包括额外的多项式项,高达五阶,可以改善模型拟合!然而,对数据的进一步研究表明,五阶以上的多项式项在回归拟合中并没有显著的p值。


# 取对数变换
summary(lm(medv ~ log(rm), data = Boston))

Call:
lm(formula = medv ~ log(rm), data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-19.487  -2.875  -0.104   2.837  39.816 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -76.488      5.028  -15.21   <2e-16 ***
log(rm)       54.055      2.739   19.73   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.915 on 504 degrees of freedom
Multiple R-squared:  0.4358,	Adjusted R-squared:  0.4347 
F-statistic: 389.3 on 1 and 504 DF,  p-value: < 2.2e-16

2.5定性解释变量

现在我们将检查Carseats数据,它是ISLR2库的一部分。我们将尝试根据一些解释变量预测400个地点的sales(儿童汽车座椅销售)。

head(Carseats)
A data.frame: 6 × 11
Sales CompPrice Income Advertising Population Price ShelveLoc Age Education Urban US
1 9.50 138 73 11 276 120 Bad 42 17 Yes Yes
2 11.22 111 48 16 260 83 Good 65 10 Yes Yes
3 10.06 113 35 10 269 80 Medium 59 12 Yes Yes
4 7.40 117 100 4 466 97 Medium 55 14 Yes Yes
5 4.15 141 64 3 340 128 Bad 38 13 Yes No
6 10.81 124 113 13 501 72 Bad 78 16 No Yes

汽车座椅数据包括定性预测因子,如shelveloc,这是货架位置质量的指示器,即商店内每个位置显示汽车座椅的空间。预测器shelveloc有三个可能的值:坏、中等和好。给定一个定性变量(如shelveloc),R会自动生成虚拟变量。下面我们拟合了一个多元回归模型,其中包括一些相互作用项。

lm.fit <- lm(Sales ~ . + Income:Advertising + Price:Age, 
    data = Carseats)
summary(lm.fit)

Call:
lm(formula = Sales ~ . + Income:Advertising + Price:Age, data = Carseats)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9208 -0.7503  0.0177  0.6754  3.3413 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)         6.5755654  1.0087470   6.519 2.22e-10 ***
CompPrice           0.0929371  0.0041183  22.567  < 2e-16 ***
Income              0.0108940  0.0026044   4.183 3.57e-05 ***
Advertising         0.0702462  0.0226091   3.107 0.002030 ** 
Population          0.0001592  0.0003679   0.433 0.665330    
Price              -0.1008064  0.0074399 -13.549  < 2e-16 ***
ShelveLocGood       4.8486762  0.1528378  31.724  < 2e-16 ***
ShelveLocMedium     1.9532620  0.1257682  15.531  < 2e-16 ***
Age                -0.0579466  0.0159506  -3.633 0.000318 ***
Education          -0.0208525  0.0196131  -1.063 0.288361    
UrbanYes            0.1401597  0.1124019   1.247 0.213171    
USYes              -0.1575571  0.1489234  -1.058 0.290729    
Income:Advertising  0.0007510  0.0002784   2.698 0.007290 ** 
Price:Age           0.0001068  0.0001333   0.801 0.423812    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.011 on 386 degrees of freedom
Multiple R-squared:  0.8761,	Adjusted R-squared:  0.8719 
F-statistic:   210 on 13 and 386 DF,  p-value: < 2.2e-16

contrasts() 函数返回虚拟变量

attach(Carseats)
contrasts(ShelveLoc)
A matrix: 3 × 2 of type dbl
Good Medium
Bad 0 0
Good 1 0
Medium 0 1

R创建了一个ShelveLocGood伪变量,如果搁置位置良好,则该变量的值为1,否则为0。它还创建了一个ShelveLocMedium伪变量,如果搁置位置为中等,则该变量等于1,否则为0。错误的搁置位置对应于两个虚拟变量中每个变量的零。回归输出中货架商品系数为正的事实表明,良好的货架位置与较高的销售额相关(相对于糟糕的位置)。而ShelveLocMedium的正系数较小,表明中等货架位置的销售额高于不良货架位置,但低于良好货架位置。

2.6 函数编写

正如我们所看到的,R附带了许多有用的函数,还有更多的函数可以通过R库获得。然而,我们通常对执行一个没有可以直接使用的函数的操作感兴趣。在此设置中,我们可能需要编写自己的函数。例如,下面我们提供了一个简单的函数,名为LoadLibraries(),用于读取ISLR2和MASS库。在我们创建函数之前,如果我们试图调用它,R将返回一个错误。

LoadLibraries <- function(){
    library(ISLR2)
    library(MASS)
    print("相关库已经导入")
}
LoadLibraries()
[1] "相关库已经导入"

你可能感兴趣的:(统计学习概论,线性回归,r语言,算法)