ISLR2库包含波士顿数据集,该数据集记录波士顿506个人口普查区的medv(房屋价值中值)。
我们将使用12个预测变量,如rmvar(每户平均房间数)、年龄(平均房屋年龄)和lstat(低社会经济地位家庭的百分比),来预测medv。
library(ISLR2)
library(MASS)
head(Boston)
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)
# 相关系数
coef(lm.fit)
# 置信区间
confint(lm.fit)
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')
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)
函数的作用是:绘制任意直线,而不仅仅是最小二乘回归线。要用截距a和斜率b绘制一条线,我们需要键入一条线(a,b)。下面我们将试验一些用于线和点的附加设置。lwd=3命令使回归线的宽度增加3倍;
这也适用于plot()和lines()函数。我们还可以使用pch选项创建不同的符号。
plot(lstat, medv)
abline(lm.fit, lwd = 3, col='red')
plot(lstat, medv, pch = 20)
plot(lstat, medv, pch = "+")
plot(1:20, 1:20, pch = 1:20)
par(mfrow = c(2, 2))
plot(lm.fit)
which.max(hatvalues(lm.fit))
375: 375
which.max()函数的作用是:标识向量中最大元素的索引。在本例中,它告诉我们哪个观测具有最大的杠杆统计。
为了使用最小二乘法拟合多元线性回归模型,我们再次使用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)
如果我们想使用除一个变量外的所有变量执行回归,该怎么办?例如,在上述回归输出中,年龄具有较高的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
使用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
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)
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)
然后我们看到,当 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
现在我们将检查Carseats数据,它是ISLR2库的一部分。我们将尝试根据一些解释变量预测400个地点的sales(儿童汽车座椅销售)。
head(Carseats)
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)
Good | Medium | |
---|---|---|
Bad | 0 | 0 |
Good | 1 | 0 |
Medium | 0 | 1 |
R创建了一个ShelveLocGood伪变量,如果搁置位置良好,则该变量的值为1,否则为0。它还创建了一个ShelveLocMedium伪变量,如果搁置位置为中等,则该变量等于1,否则为0。错误的搁置位置对应于两个虚拟变量中每个变量的零。回归输出中货架商品系数为正的事实表明,良好的货架位置与较高的销售额相关(相对于糟糕的位置)。而ShelveLocMedium的正系数较小,表明中等货架位置的销售额高于不良货架位置,但低于良好货架位置。
正如我们所看到的,R附带了许多有用的函数,还有更多的函数可以通过R库获得。然而,我们通常对执行一个没有可以直接使用的函数的操作感兴趣。在此设置中,我们可能需要编写自己的函数。例如,下面我们提供了一个简单的函数,名为LoadLibraries(),用于读取ISLR2和MASS库。在我们创建函数之前,如果我们试图调用它,R将返回一个错误。
LoadLibraries <- function(){
library(ISLR2)
library(MASS)
print("相关库已经导入")
}
LoadLibraries()
[1] "相关库已经导入"