Problem 3

(a) Perform polynomial regression to predict wage using age. Use cross-validation to select the optimal degree d for the polynomial. What degree was chosen, and how does this compare to the results of hypothesis testing using ANOVA? Make a plot of the resulting polynomial fit to the data.

library(ISLR2)
attach(Wage)

cv_errors <- rep(NA, 10)
for (d in 1:10) {
  glm_fit <- glm(wage ~ poly(age, d), data = Wage)
  cv_errors[d] <- cv.glm(Wage, glm_fit, K = 10)$delta[1]
}
which.min(cv_errors) #7
[1] 5
fit1 <- lm(wage ~ poly(age, 1), data = Wage)
fit2 <- lm(wage ~ poly(age, 2), data = Wage)
fit3 <- lm(wage ~ poly(age, 3), data = Wage)
fit4 <- lm(wage ~ poly(age, 4), data = Wage)
fit5 <- lm(wage ~ poly(age, 5), data = Wage)

anova(fit1,fit2,fit3,fit4,fit5) #3
Analysis of Variance Table

Model 1: wage ~ poly(age, 1)
Model 2: wage ~ poly(age, 2)
Model 3: wage ~ poly(age, 3)
Model 4: wage ~ poly(age, 4)
Model 5: wage ~ poly(age, 5)
  Res.Df     RSS Df Sum of Sq        F    Pr(>F)    
1   2998 5022216                                    
2   2997 4793430  1    228786 143.5931 < 2.2e-16 ***
3   2996 4777674  1     15756   9.8888  0.001679 ** 
4   2995 4771604  1      6070   3.8098  0.051046 .  
5   2994 4770322  1      1283   0.8050  0.369682    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
bestfit <- lm(wage~poly(age,7), data = Wage)

agelims=range(age)
age.grid=seq(from=agelims[1],to=agelims[2])
preds=predict(bestfit,newdata = list(age=age.grid),se=T)
se.bands=cbind(preds$fit+2*preds$se.fit,preds$fit-2*preds$se.fit)
plot(age,wage,xlim=agelims,cex=.5,col='darkgrey')
title('Degree-7 Polynomial')
lines(age.grid, preds$fit, lwd=2, col='steelblue')
matlines(age.grid,se.bands,lwd = 1, col = 'lightblue',lty = 3)

(b) Fit a step function to predict wage using age, and perform cross validation to choose the optimal number of cuts. Make a plot of the fit obtained.

library(boot)
attach(Wage)

set.seed(1)

cv_errors_step <- rep(NA, 10)

for (k in 2:10) {
  Wage$age_cut <- cut(Wage$age, k)
  step_fit <- glm(wage ~ age_cut, data = Wage)
  cv_errors_step[k] <- cv.glm(Wage, step_fit, K = 10)$delta[1]
}
cv_errors_step
 [1]       NA 1734.489 1684.271 1635.552 1632.080 1623.415 1614.996 1601.318 1613.954 1606.331
which.min(cv_errors_step)
[1] 8
step_best <- lm(wage~cut(age,8), data = Wage)
plot(wage ~ age, data = Wage, col = "darkgrey",main = paste("Step Function Fit with 8 Cuts"))
preds_step=predict(step_best,newdata = list(age=age.grid),se=T)
se.bands_step=cbind(preds_step$fit+2*preds_step$se.fit,preds_step$fit-2*preds_step$se.fit)
lines(age.grid, preds_step$fit, col = "red", lwd = 2)
matlines(age.grid,se.bands_step,lwd = 1, col = 'hotpink',lty = 3)

Problem 10

(a) Split the data into a training set and a test set. Using out-of-state tuition as the response and the other variables as the predictors, perform forward stepwise selection on the training set in order to identify a satisfactory model that uses just a subset of the predictors.

names(coef(fit,6))
[1] "(Intercept)" "PrivateYes"  "Room.Board"  "Terminal"    "perc.alumni" "Expend"      "Grad.Rate"  

(b) Fit a GAM on the training data, using out-of-state tuition as the response and the features selected in the previous step as the predictors. Plot the results, and explain your findings.

library(gam)
gam_fit <- gam(Outstate~Private+s(Room.Board,4)+s(PhD,4)+s(perc.alumni,4)+s(Expend,4)+s(Grad.Rate,4),data = College.train)
par(mfrow=c(2,3))
plot(gam_fit,se=T,col="steelblue")

(c) Evaluate the model obtained on the test set, and explain the results obtained.

gam_pred <- predict(gam_fit,newdata = College.test)
gam_mse <- mean((College.test$Outstate - gam_pred)^2)
gam_mse
[1] 3324814

(d) For which variables, if any, is there evidence of a non-linear relationship with the response?

summary(gam_fit)

Call: gam(formula = Outstate ~ Private + s(Room.Board, 4) + s(PhD, 
    4) + s(perc.alumni, 4) + s(Expend, 4) + s(Grad.Rate, 4), 
    data = College.train)
Deviance Residuals:
     Min       1Q   Median       3Q      Max 
-7174.12 -1141.26   -86.67  1264.75  7506.52 

(Dispersion Parameter for gaussian family taken to be 3750826)

    Null Deviance: 6989966760 on 387 degrees of freedom
Residual Deviance: 1372800367 on 365.9994 degrees of freedom
AIC: 6997.793 

Number of Local Scoring Iterations: NA 

Anova for Parametric Effects
                   Df     Sum Sq    Mean Sq F value    Pr(>F)    
Private             1 1761501708 1761501708 469.630 < 2.2e-16 ***
s(Room.Board, 4)    1 1563405241 1563405241 416.816 < 2.2e-16 ***
s(PhD, 4)           1  334516516  334516516  89.185 < 2.2e-16 ***
s(perc.alumni, 4)   1  331488702  331488702  88.377 < 2.2e-16 ***
s(Expend, 4)        1  525593541  525593541 140.127 < 2.2e-16 ***
s(Grad.Rate, 4)     1   87873241   87873241  23.428 1.916e-06 ***
Residuals         366 1372800367    3750826                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Anova for Nonparametric Effects
                  Npar Df  Npar F     Pr(F)    
(Intercept)                                    
Private                                        
s(Room.Board, 4)        3  1.9158    0.1266    
s(PhD, 4)               3  0.8504    0.4671    
s(perc.alumni, 4)       3  0.3520    0.7877    
s(Expend, 4)            3 23.6176 5.373e-14 ***
s(Grad.Rate, 4)         3  1.0701    0.3617    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyBQcm9ibGVtIDMNCg0KX18oYSkgUGVyZm9ybSBwb2x5bm9taWFsIHJlZ3Jlc3Npb24gdG8gcHJlZGljdCB3YWdlIHVzaW5nIGFnZS4gVXNlIGNyb3NzLXZhbGlkYXRpb24gdG8gc2VsZWN0IHRoZSBvcHRpbWFsIGRlZ3JlZSBkIGZvciB0aGUgcG9seW5vbWlhbC4gV2hhdCBkZWdyZWUgd2FzIGNob3NlbiwgYW5kIGhvdyBkb2VzIHRoaXMgY29tcGFyZSB0byB0aGUgcmVzdWx0cyBvZiBoeXBvdGhlc2lzIHRlc3RpbmcgdXNpbmcgQU5PVkE/IE1ha2UgYSBwbG90IG9mIHRoZSByZXN1bHRpbmcgcG9seW5vbWlhbCBmaXQgdG8gdGhlIGRhdGEuX18NCg0KYGBge3J9DQpsaWJyYXJ5KElTTFIyKQ0KYXR0YWNoKFdhZ2UpDQoNCmN2X2Vycm9ycyA8LSByZXAoTkEsIDEwKQ0KZm9yIChkIGluIDE6MTApIHsNCiAgZ2xtX2ZpdCA8LSBnbG0od2FnZSB+IHBvbHkoYWdlLCBkKSwgZGF0YSA9IFdhZ2UpDQogIGN2X2Vycm9yc1tkXSA8LSBjdi5nbG0oV2FnZSwgZ2xtX2ZpdCwgSyA9IDEwKSRkZWx0YVsxXQ0KfQ0Kd2hpY2gubWluKGN2X2Vycm9ycykgIzcNCg0KZml0MSA8LSBsbSh3YWdlIH4gcG9seShhZ2UsIDEpLCBkYXRhID0gV2FnZSkNCmZpdDIgPC0gbG0od2FnZSB+IHBvbHkoYWdlLCAyKSwgZGF0YSA9IFdhZ2UpDQpmaXQzIDwtIGxtKHdhZ2UgfiBwb2x5KGFnZSwgMyksIGRhdGEgPSBXYWdlKQ0KZml0NCA8LSBsbSh3YWdlIH4gcG9seShhZ2UsIDQpLCBkYXRhID0gV2FnZSkNCmZpdDUgPC0gbG0od2FnZSB+IHBvbHkoYWdlLCA1KSwgZGF0YSA9IFdhZ2UpDQoNCmFub3ZhKGZpdDEsZml0MixmaXQzLGZpdDQsZml0NSkgIzMNCg0KYmVzdGZpdCA8LSBsbSh3YWdlfnBvbHkoYWdlLDcpLCBkYXRhID0gV2FnZSkNCg0KYWdlbGltcz1yYW5nZShhZ2UpDQphZ2UuZ3JpZD1zZXEoZnJvbT1hZ2VsaW1zWzFdLHRvPWFnZWxpbXNbMl0pDQpwcmVkcz1wcmVkaWN0KGJlc3RmaXQsbmV3ZGF0YSA9IGxpc3QoYWdlPWFnZS5ncmlkKSxzZT1UKQ0Kc2UuYmFuZHM9Y2JpbmQocHJlZHMkZml0KzIqcHJlZHMkc2UuZml0LHByZWRzJGZpdC0yKnByZWRzJHNlLmZpdCkNCnBsb3QoYWdlLHdhZ2UseGxpbT1hZ2VsaW1zLGNleD0uNSxjb2w9J2RhcmtncmV5JykNCnRpdGxlKCdEZWdyZWUtNyBQb2x5bm9taWFsJykNCmxpbmVzKGFnZS5ncmlkLCBwcmVkcyRmaXQsIGx3ZD0yLCBjb2w9J3N0ZWVsYmx1ZScpDQptYXRsaW5lcyhhZ2UuZ3JpZCxzZS5iYW5kcyxsd2QgPSAxLCBjb2wgPSAnbGlnaHRibHVlJyxsdHkgPSAzKQ0KYGBgDQoNCg0KX18oYikgRml0IGEgc3RlcCBmdW5jdGlvbiB0byBwcmVkaWN0IHdhZ2UgdXNpbmcgYWdlLCBhbmQgcGVyZm9ybSBjcm9zcyB2YWxpZGF0aW9uIHRvIGNob29zZSB0aGUgb3B0aW1hbCBudW1iZXIgb2YgY3V0cy4gTWFrZSBhIHBsb3Qgb2YgdGhlIGZpdCBvYnRhaW5lZC5fXw0KDQpgYGB7cn0NCmxpYnJhcnkoYm9vdCkNCmF0dGFjaChXYWdlKQ0KDQpzZXQuc2VlZCgxKQ0KDQpjdl9lcnJvcnNfc3RlcCA8LSByZXAoTkEsIDEwKQ0KDQpmb3IgKGsgaW4gMjoxMCkgew0KICBXYWdlJGFnZV9jdXQgPC0gY3V0KFdhZ2UkYWdlLCBrKQ0KICBzdGVwX2ZpdCA8LSBnbG0od2FnZSB+IGFnZV9jdXQsIGRhdGEgPSBXYWdlKQ0KICBjdl9lcnJvcnNfc3RlcFtrXSA8LSBjdi5nbG0oV2FnZSwgc3RlcF9maXQsIEsgPSAxMCkkZGVsdGFbMV0NCn0NCmN2X2Vycm9yc19zdGVwDQp3aGljaC5taW4oY3ZfZXJyb3JzX3N0ZXApDQoNCnN0ZXBfYmVzdCA8LSBsbSh3YWdlfmN1dChhZ2UsOCksIGRhdGEgPSBXYWdlKQ0KcGxvdCh3YWdlIH4gYWdlLCBkYXRhID0gV2FnZSwgY29sID0gImRhcmtncmV5IixtYWluID0gcGFzdGUoIlN0ZXAgRnVuY3Rpb24gRml0IHdpdGggOCBDdXRzIikpDQpwcmVkc19zdGVwPXByZWRpY3Qoc3RlcF9iZXN0LG5ld2RhdGEgPSBsaXN0KGFnZT1hZ2UuZ3JpZCksc2U9VCkNCnNlLmJhbmRzX3N0ZXA9Y2JpbmQocHJlZHNfc3RlcCRmaXQrMipwcmVkc19zdGVwJHNlLmZpdCxwcmVkc19zdGVwJGZpdC0yKnByZWRzX3N0ZXAkc2UuZml0KQ0KbGluZXMoYWdlLmdyaWQsIHByZWRzX3N0ZXAkZml0LCBjb2wgPSAicmVkIiwgbHdkID0gMikNCm1hdGxpbmVzKGFnZS5ncmlkLHNlLmJhbmRzX3N0ZXAsbHdkID0gMSwgY29sID0gJ2hvdHBpbmsnLGx0eSA9IDMpDQpgYGANCg0KDQojIyMgUHJvYmxlbSAxMA0KDQpfXyhhKSBTcGxpdCB0aGUgZGF0YSBpbnRvIGEgdHJhaW5pbmcgc2V0IGFuZCBhIHRlc3Qgc2V0LiBVc2luZyBvdXQtb2Ytc3RhdGUgdHVpdGlvbiBhcyB0aGUgcmVzcG9uc2UgYW5kIHRoZSBvdGhlciB2YXJpYWJsZXMgYXMgdGhlIHByZWRpY3RvcnMsIHBlcmZvcm0gZm9yd2FyZCBzdGVwd2lzZSBzZWxlY3Rpb24gb24gdGhlIHRyYWluaW5nIHNldCBpbiBvcmRlciB0byBpZGVudGlmeSBhIHNhdGlzZmFjdG9yeSBtb2RlbCB0aGF0IHVzZXMganVzdCBhIHN1YnNldCBvZiB0aGUgcHJlZGljdG9ycy5fXyANCg0KYGBge3J9DQpsaWJyYXJ5KGxlYXBzKQ0KDQpzZXQuc2VlZCgxKQ0KYXR0YWNoKENvbGxlZ2UpDQp0cmFpbiA8LSBzYW1wbGUobGVuZ3RoKE91dHN0YXRlKSwgbGVuZ3RoKE91dHN0YXRlKSAvIDIpDQp0ZXN0ICA8LSAtdHJhaW4NCkNvbGxlZ2UudHJhaW4gPC0gQ29sbGVnZVt0cmFpbiwgXQ0KQ29sbGVnZS50ZXN0ICA8LSBDb2xsZWdlW3Rlc3QsIF0NCg0KZml0IDwtIHJlZ3N1YnNldHMoT3V0c3RhdGUgfiAuLCBkYXRhID0gQ29sbGVnZS50cmFpbiwgbnZtYXggPSAxNyxtZXRob2QgPSAiZm9yd2FyZCIpDQpmaXQuc3VtbWFyeSA8LSBzdW1tYXJ5KGZpdCkNCg0Kd2hpY2gubWluKGZpdC5zdW1tYXJ5JGNwKQ0Kd2hpY2gubWluKGZpdC5zdW1tYXJ5JGJpYykNCndoaWNoLm1heChmaXQuc3VtbWFyeSRhZGpyMikNCg0KY29lZihmaXQsIGlkID0gNikNCmNvZWYoZml0LCBpZCA9IDE0KQ0KDQpuYW1lcyhjb2VmKGZpdCw2KSkNCmBgYA0KDQpfXyhiKSBGaXQgYSBHQU0gb24gdGhlIHRyYWluaW5nIGRhdGEsIHVzaW5nIG91dC1vZi1zdGF0ZSB0dWl0aW9uIGFzIHRoZSByZXNwb25zZSBhbmQgdGhlIGZlYXR1cmVzIHNlbGVjdGVkIGluIHRoZSBwcmV2aW91cyBzdGVwIGFzIHRoZSBwcmVkaWN0b3JzLiBQbG90IHRoZSByZXN1bHRzLCBhbmQgZXhwbGFpbiB5b3VyIGZpbmRpbmdzLl9fDQoNCmBgYHtyfQ0KbGlicmFyeShnYW0pDQpnYW1fZml0IDwtIGdhbShPdXRzdGF0ZX5Qcml2YXRlK3MoUm9vbS5Cb2FyZCw0KStzKFBoRCw0KStzKHBlcmMuYWx1bW5pLDQpK3MoRXhwZW5kLDQpK3MoR3JhZC5SYXRlLDQpLGRhdGEgPSBDb2xsZWdlLnRyYWluKQ0KcGFyKG1mcm93PWMoMiwzKSkNCnBsb3QoZ2FtX2ZpdCxzZT1ULGNvbD0ic3RlZWxibHVlIikNCmBgYA0KICAtIEJ5IGV2YWx1YXRpbmcgdGhlIGNoYXJ0cyB5b3UgY2FuIHNlZSB0aGF0IHNvbWUgYXJlIGFjdHVhbGx5IHByZXR0eSBjbG9zZSB0byBoYXZpbmcgYSBsaW5lYXIgcmVsYXRpb25zaGlwIHdpdGggYE91dHN0YXRlYC4gVGhlIG9uZSB0aGF0IHN0YW5kcyBvdXQgdG8gYmUgbm9uLWxpbmVhciBpcyB0aGUgYEV4cGVuZGAgdmFyaWFibGUuIFRoaXMgc3VnZ2VzdHMgdGhhdCBhIEdBTSBtYXkgYmV0dGVyIGNhcHR1cmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGBPdXRzdGF0ZWAgYW5kIGBFeHBlbmRgLg0KDQpfXyhjKSBFdmFsdWF0ZSB0aGUgbW9kZWwgb2J0YWluZWQgb24gdGhlIHRlc3Qgc2V0LCBhbmQgZXhwbGFpbiB0aGUgcmVzdWx0cyBvYnRhaW5lZC5fXw0KDQpgYGB7cn0NCmdhbV9wcmVkIDwtIHByZWRpY3QoZ2FtX2ZpdCxuZXdkYXRhID0gQ29sbGVnZS50ZXN0KQ0KZ2FtX21zZSA8LSBtZWFuKChDb2xsZWdlLnRlc3QkT3V0c3RhdGUgLSBnYW1fcHJlZCleMikNCmdhbV9tc2UNCmBgYA0KIC0gVGhlIG1vZGVsIGhhcyBhbiBNU0Ugb2YgMzMyNDgxNCANCiANCl9fKGQpIEZvciB3aGljaCB2YXJpYWJsZXMsIGlmIGFueSwgaXMgdGhlcmUgZXZpZGVuY2Ugb2YgYSBub24tbGluZWFyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZSByZXNwb25zZT9fXw0KDQpgYGB7cn0NCnN1bW1hcnkoZ2FtX2ZpdCkNCmBgYA0KICAtIFRoZSBBTk9WQSByZXN1bHRzIHNob3cgYSBzdHJvbmcgbm9uLWxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBgT3V0c3RhdGVgIGFuZCBgRXhwZW5kYC4gVGhlIG90aGVyIHByZWRpY3RvcnMgZG8gbm90IHNob3cgc2lnbmlmaWNhbnQgZXZpZGVuY2Ugb2YgYSBub24tbGluZWFyIHJlbGF0aW9uc2hpcC4NCiAgDQogIA==