The MASS library contains the Boston data set, which records medv (median house value) for 506 neighborhoods around Boston. We will seek to predict medv using 13 predictors such as rm (average number of rooms per house), age (average age of houses), and lstat (percent of households with low socioeconomic status).

library(tidyverse)
library(MASS)

Simple Linear Regression

First, we attempt to predict medv with a single predictor: lstat, i.e. we regress medv onto lstat.

lm.fit <- lm(medv ~ lstat, data = Boston)
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

Here we extract our coefficient estimates.

coef(lm.fit)
(Intercept)       lstat 
 34.5538409  -0.9500494 

We look at the confidence interval for our coefficient estimates.

confint(lm.fit)
                2.5 %     97.5 %
(Intercept) 33.448457 35.6592247
lstat       -1.026148 -0.8739505

We can produce confidence intervals and prediction intervals for the prediction of medv for a given value of lstat.

predict(lm.fit, data.frame(lstat = c(5, 10, 15)), 
        interval = "confidence")
       fit      lwr      upr
1 29.80359 29.00741 30.59978
2 25.05335 24.47413 25.63256
3 20.30310 19.73159 20.87461
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

Now we visualize our fitted model with base R graphics.

plot(Boston$lstat, Boston$medv, 
     xlab = "Lower status of the population (%)", 
     ylab = "Median value of owner-occupied homes in thousand dollars",
     cex.lab = 0.8, cex.axis = 0.8, col = "gray20")
abline(lm.fit, lwd = 2, col = "brown3")

Next, we examine some diagnostic plots.

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

On the basis of the residual plots, there is some evidence of non-linearity. Hence, we calculate the leverage statistics and identifies the observation which has the largest leverage statistic.

plot(hatvalues(lm.fit))

which.max(hatvalues(lm.fit))
375 
375 

Multiple Linear Regression

Now we try to fit a multiiple linear regression model using all the thirteen predictors.

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
LS0tCnRpdGxlOiAiQm9zdG9uIOKAlCBMaW5lYXIgUmVncmVzc2lvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgY29kZV9mb2xkaW5nOiBudWxsCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KClRoZSBgTUFTU2AgbGlicmFyeSBjb250YWlucyB0aGUgYEJvc3RvbmAgZGF0YSBzZXQsIHdoaWNoIHJlY29yZHMgYG1lZHZgIChtZWRpYW4gaG91c2UgdmFsdWUpIGZvciA1MDYgbmVpZ2hib3Job29kcyBhcm91bmQgQm9zdG9uLiBXZSB3aWxsIHNlZWsgdG8gcHJlZGljdCBgbWVkdmAgdXNpbmcgMTMgcHJlZGljdG9ycyBzdWNoIGFzIGBybWAgKGF2ZXJhZ2UgbnVtYmVyIG9mIHJvb21zIHBlciBob3VzZSksIGBhZ2VgIChhdmVyYWdlIGFnZSBvZiBob3VzZXMpLCBhbmQgYGxzdGF0YCAocGVyY2VudCBvZiBob3VzZWhvbGRzIHdpdGggbG93IHNvY2lvZWNvbm9taWMgc3RhdHVzKS4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShNQVNTKQpgYGAKCiMgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uCgpGaXJzdCwgd2UgYXR0ZW1wdCB0byBwcmVkaWN0IGBtZWR2YCB3aXRoIGEgc2luZ2xlIHByZWRpY3RvcjogYGxzdGF0YCwgaS5lLiB3ZSByZWdyZXNzIGBtZWR2YCBvbnRvIGBsc3RhdGAuCgpgYGB7cn0KbG0uZml0IDwtIGxtKG1lZHYgfiBsc3RhdCwgZGF0YSA9IEJvc3RvbikKc3VtbWFyeShsbS5maXQpCmBgYAoKSGVyZSB3ZSBleHRyYWN0IG91ciAqKmNvZWZmaWNpZW50IGVzdGltYXRlcyoqLgoKYGBge3J9CmNvZWYobG0uZml0KQpgYGAKCldlIGxvb2sgYXQgdGhlICoqY29uZmlkZW5jZSBpbnRlcnZhbCoqIGZvciBvdXIgY29lZmZpY2llbnQgZXN0aW1hdGVzLgoKYGBge3J9CmNvbmZpbnQobG0uZml0KQpgYGAKCldlIGNhbiBwcm9kdWNlIGNvbu+sgWRlbmNlIGludGVydmFscyBhbmQgcHJlZGljdGlvbiBpbnRlcnZhbHMgZm9yIHRoZSBwcmVkaWN0aW9uIG9mIGBtZWR2YCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiBgbHN0YXRgLgoKYGBge3J9CnByZWRpY3QobG0uZml0LCBkYXRhLmZyYW1lKGxzdGF0ID0gYyg1LCAxMCwgMTUpKSwgCiAgICAgICAgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIpCnByZWRpY3QobG0uZml0LCBkYXRhLmZyYW1lKGxzdGF0ID0gYyg1LCAxMCwgMTUpKSwgCiAgICAgICAgaW50ZXJ2YWwgPSAicHJlZGljdGlvbiIpCmBgYAoKTm93IHdlIHZpc3VhbGl6ZSBvdXIgZml0dGVkIG1vZGVsIHdpdGggYmFzZSBSIGdyYXBoaWNzLgoKYGBge3J9CnBsb3QoQm9zdG9uJGxzdGF0LCBCb3N0b24kbWVkdiwgCiAgICAgeGxhYiA9ICJMb3dlciBzdGF0dXMgb2YgdGhlIHBvcHVsYXRpb24gKCUpIiwgCiAgICAgeWxhYiA9ICJNZWRpYW4gdmFsdWUgb2Ygb3duZXItb2NjdXBpZWQgaG9tZXMgaW4gdGhvdXNhbmQgZG9sbGFycyIsCiAgICAgY2V4LmxhYiA9IDAuOCwgY2V4LmF4aXMgPSAwLjgsIGNvbCA9ICJncmF5MjAiKQphYmxpbmUobG0uZml0LCBsd2QgPSAyLCBjb2wgPSAiYnJvd24zIikKYGBgCgpOZXh0LCB3ZSBleGFtaW5lIHNvbWUgZGlhZ25vc3RpYyBwbG90cy4KCmBgYHtyfQpwYXIobWZyb3cgPSBjKDIsIDIpKQpwbG90KGxtLmZpdCwgY29sID0gImdyZXkyMCIpCmBgYAoKT24gdGhlIGJhc2lzIG9mIHRoZSByZXNpZHVhbCBwbG90cywgdGhlcmUgaXMgc29tZSBldmlkZW5jZSBvZiBub24tbGluZWFyaXR5LiBIZW5jZSwgd2UgY2FsY3VsYXRlIHRoZSBsZXZlcmFnZSBzdGF0aXN0aWNzIGFuZCBpZGVudGnvrIFlcyB0aGUgb2JzZXJ2YXRpb24gd2hpY2ggaGFzIHRoZSBsYXJnZXN0IGxldmVyYWdlIHN0YXRpc3RpYy4KCmBgYHtyfQpwbG90KGhhdHZhbHVlcyhsbS5maXQpKQp3aGljaC5tYXgoaGF0dmFsdWVzKGxtLmZpdCkpCmBgYAoKIyBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbgoKTm93IHdlIHRyeSB0byBmaXQgYSBtdWx0aWlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgdXNpbmcgYWxsIHRoZSB0aGlydGVlbiBwcmVkaWN0b3JzLgoKYGBge3J9CmxtLmZpdCA8LSBsbShtZWR2IH4gLiAsIGRhdGEgPSBCb3N0b24pCnN1bW1hcnkobG0uZml0KQpgYGAKCg==