 # How to do Linear Regression in R

R has built in linear regression functions. Most of the time, lm() function should be good enough.

### Simple Linear Regression

For example, if you wanted to find out the relationship between the waiting time and eruption time of the old faithful data, you can do it like this.

```model = lm(waiting ~ eruptions , data = faithful)
```
```> coef = model\$coefficients
> coef
(Intercept)   eruptions
33.47440    10.72964
```
```require(ggplot2)
g = ggplot(data = faithful, aes(x = eruptions, y = waiting)) +
geom_point  ( ) +
geom_abline ( aes(intercept = coef,
slope     = coef))
```

### Multi linear Regression

Multi linear regression is where more than one variable is used as a predictor. For example, if you take the Boston Housing data in mlbench package,

```> library(mlbench)
crim zn indus chas   nox    rm  age    dis rad tax ptratio      b 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
```

medv (Median Value in 1000s. For example, 24.0 is 24,000 \$) is the response variable and the rest are all predictors. As usual, not all of the predictors have the same “predictive” power. There are many methods used to identify the best predictors. Let’s just use all the predictors and see how the linear model works.

```> model = lm ( medv ~ . , data = BostonHousing)
> summary(model)
Call:
lm(formula = medv ~ ., data = BostonHousing)
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
chas1        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 ***
b            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
```

Or you can use a specific subset of the predictors based on step wise regression in R. Say you have determined that the best predictors are

• crim ( Crime rate )
• chas ( Dummy variable )
• nox ( nitrous oxide )
• rm ( Number of rooms )

The final model now is

```> model = lm ( medv ~ crim + chas + nox + rm, data = BostonHousing)
> summary(model)
Call:
lm(formula = medv ~ crim + chas + nox + rm, data = BostonHousing)
Residuals:
Min      1Q  Median      3Q     Max
-21.797  -3.194  -0.803   2.461  39.301
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -17.25962    3.21548  -5.368 1.22e-07 ***
crim         -0.18461    0.03449  -5.353 1.32e-07 ***
chas1         4.67381    1.06618   4.384 1.42e-05 ***
nox         -14.96036    2.63920  -5.669 2.43e-08 ***
rm            7.70684    0.40273  19.137  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.987 on 501 degrees of freedom
Multiple R-squared:  0.5796,    Adjusted R-squared:  0.5763
F-statistic: 172.7 on 4 and 501 DF,  p-value: < 2.2e-16
```

### Formula to specify multi linear regression

```model = lm ( medv ~ crim + chas + nox + rm, data = BostonHousing)
```

The formula to specify multiple variables in a liner regression is easy. Just separate all the variables with a + .