This method involves randomly dividing the observations into k groups, or folds, of approximately equal sizes. Initially, one fold serves as the validation set while the method is trained on the remaining k − 1 folds. The mean squared error (MSE1) is calculated based on the data in the held-out fold. This process repeats k times, with each iteration using a different set of observations as the validation set. As a result, k estimates of the test error are obtained. The k-fold cross-validation estimate is derived by averaging these values.
Advantages: The validation set approach is straightforward in concept and simple to implement. Disadvantages: The validation MSE may exhibit significant variability, and the model is trained only on a subset of observations (training data).
Advantages: LOOCV exhibits reduced bias. Unlike the validation approach, which generates varying MSE values due to randomness in the splitting process, LOOCV consistently produces the same results when applied repeatedly, as each split is based on one observation at a time. Disadvantage: LOOCV demands significant computational resources.
library(ISLR)
attach(Default)
set.seed(1)
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial")
summary(fit.glm)
##
## Call:
## glm(formula = default ~ income + balance, family = "binomial",
## data = Default)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.154e+01 4.348e-01 -26.545 < 2e-16 ***
## income 2.081e-05 4.985e-06 4.174 2.99e-05 ***
## balance 5.647e-03 2.274e-04 24.836 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2920.6 on 9999 degrees of freedom
## Residual deviance: 1579.0 on 9997 degrees of freedom
## AIC: 1585
##
## Number of Fisher Scoring iterations: 8
## i
train <- sample(dim(Default)[1], dim(Default)[1] / 2)
## ii
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial", subset = train)
summary(fit.glm)
##
## Call:
## glm(formula = default ~ income + balance, family = "binomial",
## data = Default, subset = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.194e+01 6.178e-01 -19.333 < 2e-16 ***
## income 3.262e-05 7.024e-06 4.644 3.41e-06 ***
## balance 5.689e-03 3.158e-04 18.014 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1523.8 on 4999 degrees of freedom
## Residual deviance: 803.3 on 4997 degrees of freedom
## AIC: 809.3
##
## Number of Fisher Scoring iterations: 8
## iii
probs <- predict(fit.glm, newdata = Default[-train, ], type = "response")
pred.glm <- rep("No", length(probs))
pred.glm[probs > 0.5] <- "Yes"
## iv
mean(pred.glm != Default[-train, ]$default)
## [1] 0.0254
The validation set approach gave us a 2.54% test error rate.
train <- sample(dim(Default)[1], dim(Default)[1] / 2)
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial", subset = train)
probs <- predict(fit.glm, newdata = Default[-train, ], type = "response")
pred.glm <- rep("No", length(probs))
pred.glm[probs > 0.5] <- "Yes"
mean(pred.glm != Default[-train, ]$default)
## [1] 0.0274
train <- sample(dim(Default)[1], dim(Default)[1] / 2)
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial", subset = train)
probs <- predict(fit.glm, newdata = Default[-train, ], type = "response")
pred.glm <- rep("No", length(probs))
pred.glm[probs > 0.5] <- "Yes"
mean(pred.glm != Default[-train, ]$default)
## [1] 0.0244
train <- sample(dim(Default)[1], dim(Default)[1] / 2)
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial", subset = train)
probs <- predict(fit.glm, newdata = Default[-train, ], type = "response")
pred.glm <- rep("No", length(probs))
pred.glm[probs > 0.5] <- "Yes"
mean(pred.glm != Default[-train, ]$default)
## [1] 0.0244
Each of the three different splits produced a different resulting error rate and this shows the rate varies by which observations are in the training/validation sets.
train <- sample(dim(Default)[1], dim(Default)[1] / 2)
fit.glm <- glm(default ~ income + balance + student, data = Default, family = "binomial", subset = train)
pred.glm <- rep("No", length(probs))
probs <- predict(fit.glm, newdata = Default[-train, ], type = "response")
pred.glm[probs > 0.5] <- "Yes"
mean(pred.glm != Default[-train, ]$default)
## [1] 0.0278
Including a dummy variable for student did not lead to a reduction in the test error rate.
set.seed(1)
attach(Default)
## The following objects are masked from Default (pos = 3):
##
## balance, default, income, student
fit.glm <- glm(default ~ income + balance, data = Default, family = "binomial")
summary(fit.glm)
##
## Call:
## glm(formula = default ~ income + balance, family = "binomial",
## data = Default)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.154e+01 4.348e-01 -26.545 < 2e-16 ***
## income 2.081e-05 4.985e-06 4.174 2.99e-05 ***
## balance 5.647e-03 2.274e-04 24.836 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2920.6 on 9999 degrees of freedom
## Residual deviance: 1579.0 on 9997 degrees of freedom
## AIC: 1585
##
## Number of Fisher Scoring iterations: 8
The glm() estimates of the standard errors for the coefficients intercept, income and balance are 4.348e-01, 4.985e-06 and 2.274e-04, respectively.
boot.fn <- function(data, index) {
fit <- glm(default ~ income + balance, data = data, family = "binomial", subset = index)
return (coef(fit))
}
library(boot)
boot(Default, boot.fn, 1000)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = Default, statistic = boot.fn, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* -1.154047e+01 -3.945460e-02 4.344722e-01
## t2* 2.080898e-05 1.680317e-07 4.866284e-06
## t3* 5.647103e-03 1.855765e-05 2.298949e-04
The bootstrap estimates of the standard errors for the coefficients B0, B1 and B2 are respectively 0.4245, 4.866 x 10^(-6) and 2.298 x 10^(-4).
library(MASS)
attach(Boston)
myboston <- Boston
mu_hat <- mean(myboston$medv)
mu_hat
## [1] 22.53281
μˆ = 22.53
se_mu = sd(myboston$medv)/sqrt(length(myboston$medv))
se_mu
## [1] 0.4088611
Standard error of μˆ = 0.40886
set.seed(1)
boot_fn <- function(data,index)
return(mean(data[index]))
boot_res<- boot(myboston$medv,boot_fn, R = 1000)
boot_res
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = myboston$medv, statistic = boot_fn, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 22.53281 0.007650791 0.4106622
Standard error from Bootstrap for μˆ is 0.4045557, this is very similar but slightly lower than that from (b),which is 0.40886.
lower_bd <- mu_hat - (2*0.4045557)
upper_db <- mu_hat + (2*0.4045557)
lower_bd
## [1] 21.72369
upper_db
## [1] 23.34192
t.test(myboston$medv)
##
## One Sample t-test
##
## data: myboston$medv
## t = 55.111, df = 505, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 21.72953 23.33608
## sample estimates:
## mean of x
## 22.53281
Confidence intervals calculated using the bootstrap estimate of SE and the one sample t-test are about the same to one another.
median(myboston$medv)
## [1] 21.2
boot.fn <- function(data, index) {
mu <- median(data[index])
return (mu)
}
boot(medv, boot.fn, 1000)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = medv, statistic = boot.fn, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 21.2 -0.0386 0.3770241
We get an estimated median value of 21.2 which is the same as the value obtained in (e), with a standard error of 0.3770 which is relatively small, indicating the med estimate for populating is fairly accurate.
quantile(myboston$medv,0.1)
## 10%
## 12.75
μˆ0.1=12.75
set.seed(1)
boot.fn <- function(data, index) {
mu <- quantile(data[index], c(0.1))
return (mu)
}
boot(medv, boot.fn, 1000)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = medv, statistic = boot.fn, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 12.75 0.0339 0.4767526
Tenth percentile estimated value is 12.75, which is again the same as the value obtained in (g), with a standard error of 0.4768 which is relatively small compared to the percentile value.