pred_vars <- c("Age","CTW","JobDemands","JobControl","JobSupport","MentalWB")
mu <- colMeans(train[, pred_vars])
sds <- apply(train[, pred_vars], 2, sd)
X_tr <- scale(train[, pred_vars], center = mu, scale = sds)
X_te <- scale(test[, pred_vars], center = mu, scale = sds)
# Use a subset for speed during rendering (n=7000 kNN is slow)
set.seed(7)
sub <- sample(nrow(X_tr), 1500)
X_tr_s <- X_tr[sub, ]; y_tr_s <- train$SWP[sub]
ks <- c(1, 5, 10, 25, 50, 100, 200)
test_err <- sapply(ks, function(k) mean(knn(X_tr_s, X_te, cl = y_tr_s, k=k) != test$SWP))
ggplot(data.frame(k = ks, error = test_err), aes(k, error)) +
geom_line(colour="#e74c3c", linewidth=1.2) +
geom_point(size=3, colour="#e74c3c") +
geom_vline(xintercept=ks[which.min(test_err)], linetype="dashed", colour="#888") +
scale_x_log10(breaks=ks) +
labs(title="kNN test error vs k (SWP dataset)",
subtitle=paste0("Optimal k = ", ks[which.min(test_err)]),
x="k (log scale)", y="Test error rate") +
theme_minimal()