# generalized additive model library(ISLR) library(splines) library(gam) model = gam(wage ~ ns(year, 4) + ns(age, 5) + education, data = Wage) mean((Wage$wage - predict(model, Wage))^2) model$coefficients # simple generalized additive model implementation y = Wage$wage X = data.frame(Wage$year, Wage$age, Wage$education) alpha = mean(y) current.predictions = array(0, c(length(y), 3)) current.model = list() for (i in 1:30) { desired.response = y - (alpha + apply(current.predictions[,-1], 1, sum)) current.model[[1]] = lm(desired.response ~ ns(X[,1], 4)) current.predictions[,1] = predict(current.model[[1]], data.frame(X[,1])) desired.response = y - (alpha + apply(current.predictions[,-2], 1, sum)) current.model[[2]] = lm(desired.response ~ ns(X[,2], 5)) current.predictions[,2] = predict(current.model[[2]], data.frame(X[,2])) desired.response = y - (alpha + apply(current.predictions[,-3], 1, sum)) current.model[[3]] = lm(desired.response ~ X[,3]) current.predictions[,3] = predict(current.model[[3]], data.frame(X[,3])) } mean((y - (alpha + apply(current.predictions, 1, sum)))^2) c(alpha + current.model[[1]]$coefficients[1] + current.model[[2]]$coefficients[1] + current.model[[3]]$coefficients[1], current.model[[1]]$coefficients[2:5], current.model[[2]]$coefficients[2:6], current.model[[3]]$coefficients[2:5]) # anova library(ISLR) library(gam) m1 = gam(wage ~ year, data = Wage) summary(m1) m2 = gam(wage ~ s(year), data = Wage) summary(m2) m3 = gam(wage ~ education + s(age) + year, data = Wage) summary(m3) par(mfrow = c(1, 3)) plot(m3)