--- title: "Lab 10 solutions" author: "Your Name Here" date: "" output: html_document --- ##### Remember to change the `author: ` field on this Rmd file to your own name. ### Learning objectives > In today's Lab you will gain practice with the following concepts from today's class: >- Interpreting linear regression coefficients of numeric covariates - Interpreting linear regression coefficients of categorical variables - Applying the "2 standard error rule" to construct approximate 95% confidence intervals for regression coefficients - Using the `confint` command to construct confidence intervals for regression coefficients - Using `pairs` plots to diagnose collinearity - Using the `update` command to update a linear regression model object - Diagnosing violations of linear model assumptions using `plot` We'll begin by loading some packages. ```{r} library(tidyverse) library(knitr) Cars93 <- as_tibble(MASS::Cars93) # If you want to experiment with the ggpairs command, # you'll want to run the following code: # install.packages("GGally") # library(GGally) ``` ### Linear regression with Cars93 data **(a)** Use the `lm()` function to regress Price on: EngineSize, Origin, MPG.highway, MPG.city and Horsepower. ```{r} cars.lm <- lm(Price ~ EngineSize + Origin + MPG.highway + MPG.city + Horsepower, data = Cars93) ``` **(b)** Use the `kable()` command to produce a nicely formatted coefficients table. Ensure that values are rounded to an appropriate number of decimal places. ```{r, results = 'asis'} kable(summary(cars.lm)\$coef, digits = c(3, 3, 3, 4), format = "markdown") ``` **(c)** Interpret the coefficient of `Originnon-USA`. Is it statistically significant? > The coefficient of `Originnon-USA` is `r round(coef(cars.lm)["Originnon-USA"], 2)`. This indicates that, all else in the model held constant, vehicles manufactured outside of the USA carry a price tag that is on average \$`r round(coef(cars.lm)["Originnon-USA"], 2)` thousand dollars higher than vehicles manufactered in the US. The coefficient is statistically significant at the 0.05 level. **(d)** Interpret the coefficient of `MPG.highway`. Is it statistically significant? > The coefficient of `MPG.highway` is `r round(coef(cars.lm)["MPG.highway"], 3)`, which is close to 0 numerically and is not statistically significant. Holding all else in the model constant, MPG.highway does not appear to have much association with Price. **(d)** Use the "2 standard error rule" to construct an approximate 95% confidence interval for the coefficient of `MPG.highway`. Compare this to the 95% CI obtained by using the `confint` command. ```{r} est <- coef(cars.lm)["MPG.highway"] se <- summary(cars.lm)\$coef["MPG.highway", "Std. Error"] # 2se rule confidence interval: c(est - 2 *se, est + 2 * se) # confint approach confint(cars.lm, parm = "MPG.highway") ``` > We see that the confidence intervals obtained via the two different approaches are essentially identical. **(e)** Run the `pairs` command on the following set of variables: EngineSize, MPG.highway, MPG.city and Horsepower. Display correlations in the Do you observe any collinearities? ```{r} panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...) { usr <- par("usr"); on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) r <- abs(cor(x, y)) txt <- format(c(r, 0.123456789), digits = digits)[1] txt <- paste0(prefix, txt) if(missing(cex.cor)) cex.cor <- 0.4/strwidth(txt) text(0.5, 0.5, txt, cex = pmax(1, cex.cor * r)) } pairs(Cars93[,c("EngineSize", "MPG.highway", "MPG.city", "Horsepower")], lower.panel = panel.cor) ``` > The MPG.highway and MPG.city variables are very highly correlated. **(f)** Use the `update` command to update your regression model to exclude `EngineSize` and `MPG.city`. Display the resulting coefficients table nicely using the `kable()` command. ```{r} cars.lm2 <- update(cars.lm, . ~ . - EngineSize - MPG.city) ``` ```{r} kable(summary(cars.lm2)\$coef, digits = c(3, 3, 3, 4), format = "markdown") ``` **(g)** Does the coefficient of `MPG.highway` change much from the original model? Calculate a 95% confidence interval and compare your answer to part (d). Does the CI change much from before? Explain. ```{r} # old confint(cars.lm, parm = "MPG.highway") # new confint(cars.lm2, parm = "MPG.highway") ``` > Both the estimate and the confidence interval change greatly. When we remove the highly collinear MPG.city variable from the model, the coefficient of MPG.highway increases (in magnitude). We also get a much narrower confidence interval, indicating that we are able to more precisely estimate the coefficient of MPG.highway. **(h)** Run the `plot` command on the linear model you constructed in part (f). Do you notice any issues? ```{r, fig.height = 12, fig.width = 12} par(mfrow = c(2, 2)) plot(cars.lm2) ``` - Residual vs Fitted curve: Shows some indication of non-linearity, but this could be a more of a non-constant variance issue. - Normal QQ plot: Shows possible deviation in the upper tail. Observation 59 is particularly worrisome. Without this observation, there wouldn't be much of an issue. - Scale-Location plot: There's a discernible upward trend in the red trend line in this plot, which indicates possible non-constant (increasing) variance. - Residual vs Leverage: Observation 59 has very high residual, but not particularly high leverage.