Mô hình hóa tương tác (2)
Trong bài này, bạn sẽ so sánh hiệu năng của mô hình có tương tác mà bạn đã fit ở bài trước với mô hình chỉ gồm hiệu ứng chính (main effects). Vì bộ dữ liệu này nhỏ, chúng ta sẽ dùng cross-validation để mô phỏng việc dự đoán trên dữ liệu ngoài mẫu.
Bạn sẽ bắt đầu dùng gói dplyr để tính toán.
mutate()(docs) thêm cột mới vào một tbl (một loại data frame)group_by()(docs) chỉ định cách nhóm các hàng trong một tblsummarize()(docs) tính các thống kê tóm tắt của một cột
Bạn cũng sẽ dùng pivot_longer() của tidyr (docs) để gộp nhiều cột thành các cặp khóa-giá trị. Data frame alcohol và các công thức fmla_add và fmla_interaction đã được nạp sẵn.
Bài tập này là một phần của khóa học
Học có giám sát với R: Hồi quy
Hướng dẫn bài tập
- Dùng
kWayCrossValidation()(docs) để tạo kế hoạch chia cho cross-validation 3 fold.- Đối số đầu tiên là số hàng cần chia.
- Đối số thứ hai là số lượng fold cho cross-validation.
- Bạn có thể đặt đối số thứ 3 và thứ 4 của hàm là
NULL.
- Xem và chạy mã mẫu để lấy dự đoán cross-validation 3 fold của mô hình không có tương tác và gán vào cột
pred_add. - Lấy dự đoán cross-validation của mô hình có tương tác. Gán dự đoán vào cột
pred_interaction.- Mã mẫu cho bạn thấy quy trình.
- Dùng cùng
splitPlanmà bạn đã tạo.
- Điền vào chỗ trống để
pivot_longercác cột dự đoán thành một cột duy nhấtpred.- thêm một cột phần dư (kết quả thực tế - giá trị dự đoán).
- tính RMSE của các dự đoán cross-validation cho từng loại mô hình.
- So sánh các giá trị RMSE. Dựa trên các kết quả này, bạn nên dùng mô hình nào?
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# alcohol is available
summary(alcohol)
# Both the formulae are available
fmla_add
fmla_interaction
# Create the splitting plan for 3-fold cross validation
set.seed(34245) # set the seed for reproducibility
splitPlan <- ___(___(___), ___, ___, ___)
# Sample code: Get cross-val predictions for main-effects only model
alcohol$pred_add <- 0 # initialize the prediction vector
for(i in 1:3) {
split <- splitPlan[[i]]
model_add <- lm(fmla_add, data = alcohol[split$train, ])
alcohol$pred_add[split$app] <- predict(model_add, newdata = alcohol[split$app, ])
}
# Get the cross-val predictions for the model with interactions
alcohol$pred_interaction <- 0 # initialize the prediction vector
for(i ___ ___) {
split <- ___
model_interaction <- lm(___, data = alcohol[split$train, ])
alcohol$___[split$app] <- predict(___, newdata = alcohol[split$app, ])
}
# Get RMSE
alcohol %>%
pivot_longer(cols=c('pred_add', 'pred_interaction'), names_to='modeltype', values_to='pred') %>%
mutate(residuals = ____) %>%
group_by(modeltype) %>%
summarize(rmse = ___(___(___)))