messenger_logo
Liên hệ qua Messenger
SciEco

Giải thích dự báo chuỗi thời gian với giá trị shapley chính xác trong r

I
IEFPA
Ngày viết: 17/08/2026

Trong học máy có giám sát, giá trị Shapley là phương pháp tiêu chuẩn để đo lường mức độ đóng góp của từng biến giải thích vào kết quả dự đoán của mô hình. Tuy nhiên, việc áp dụng giá trị Shapley vào bài toán chuỗi thời gian có biến ngoại sinh lại ít phổ biến hơn dù mang lại giá trị thực tiễn rất cao. Bài viết này sẽ hướng dẫn bạn cách tính toán và trực quan hóa giá trị Shapley chính xác nhằm bóc tách các kịch bản dự báo chuỗi thời gian thông qua mô hình dynrmf trong gói ahead của R.

Bản chất của giá trị Shapley trong bài toán chuỗi thời gian

Giá trị Shapley bắt nguồn từ lý thuyết trò chơi hợp tác, phân chia phần thưởng công bằng cho các bên tham gia dựa trên đóng góp cận biên của họ. Khi chuyển giao sang dự báo chuỗi thời gian, mỗi biến hồi quy đóng vai trò như một người chơi cùng tác động lên giá trị dự báo tương lai.

Thông thường, việc tính toán giá trị Shapley đòi hỏi xấp xỉ vì độ phức tạp hàm mũ khi số lượng biến tăng lên. Tuy nhiên, trong phân tích kinh tế lượng và chuỗi thời gian vĩ mô, số lượng biến hồi quy bên ngoài thường khá nhỏ, thường dưới 15 biến. Điều này cho phép chúng ta tính toán trực tiếp giá trị Shapley chính xác mà không cần xấp xỉ, đảm bảo tính toàn vẹn và độ tin cậy tuyệt đối cho phân tích kịch bản.

Xây dựng mô hình và phân tích kịch bản với R

Để minh họa, chúng ta sử dụng bộ dữ liệu uschange từ gói fpp2, ghi nhận các chỉ số kinh tế vĩ mô hàng quý của Mỹ. Mục tiêu là dự báo mức tăng trưởng tiêu dùng dựa trên ba biến giải thích: thu nhập, tiết kiệm và tỷ lệ thất nghiệp.

Quy trình triển khai bao gồm việc chuẩn hóa dữ liệu, chia tập huấn luyện và kiểm thử, sau đó huấn luyện mô hình Support Vector Machine kết hợp dynrmf để mô phỏng bốn kịch bản: cơ sở, bi quan, lạc quan và cực kỳ lạc quan.

1devtools::install_github("Techtonique/ahead")
2library(fpp2)
3library(ahead)
4library(e1071)
5library(misc)
6library(ggplot2)
7library(patchwork)
8y <- fpp2::uschange[, "Consumption"]
9xreg <- scale(fpp2::uschange[, c("Income", "Savings", "Unemployment")])
10split <- misc::splitts(y, split_prob = 0.9)
11xreg_train <- window(xreg, start = start(split$training), end = end(split$training))
12xreg_test <- window(xreg, start = start(split$testing), end = end(split$testing))
13shap <- ahead::dynrmf_shap(
14  y = split$training,
15  xreg_fit = xreg_train,
16  xreg_predict = xreg_test,
17  fit_func = e1071::svm
18)
19p1 <- ahead::plot_dynrmf_shap_waterfall(shap, title = "Baseline scenario")
20xreg_pess <- xreg_test
21xreg_pess[, "Income"] <- -1
22xreg_pess[, "Savings"] <- -0.5
23shap_pess <- dynrmf_shap(
24  y = split$training,
25  xreg_fit = xreg_train,
26  xreg_predict = xreg_pess,
27  fit_func = e1071::svm
28)
29p2 <- ahead::plot_dynrmf_shap_waterfall(shap_pess, title = "Pessimistic scenario")
30xreg_opt <- xreg_test
31xreg_opt[, "Income"] <- 2
32xreg_opt[, "Savings"] <- 0.5
33shap_opt <- dynrmf_shap(
34  y = split$training,
35  xreg_fit = xreg_train,
36  xreg_predict = xreg_opt,
37  fit_func = e1071::svm
38)
39p3 <- ahead::plot_dynrmf_shap_waterfall(shap_opt, title = "Optimistic scenario")
40xreg_ovr <- xreg_test
41xreg_ovr[, "Income"] <- 2.5
42xreg_ovr[, "Savings"] <- 0.75
43shap_ovr <- ahead::dynrmf_shap(
44  y = split$training,
45  xreg_fit = xreg_train,
46  xreg_predict = xreg_ovr,
47  fit_func = e1071::svm
48)
49p4 <- plot_dynrmf_shap_waterfall(shap_ovr, title = "Overly optimistic scenario")
50(p1 + p2) / (p3 + p4)

Đánh giá kết quả qua biểu đồ thác nước

Hàm plot_dynrmf_shap_waterfall trực quan hóa tác động cộng dồn của từng biến kinh tế vào dự báo theo định dạng biểu đồ thác nước.

Một nguyên tắc kiểm tra quan trọng khi làm việc với giá trị Shapley là tính chất cộng: tổng giá trị Shapley của tất cả các biến phải bằng đúng độ lệch giữa giá trị dự báo và mức dự báo nền tảng. Mức dự báo nền tảng ở đây chính là kết quả mô hình khi mọi biến giải thích được thay thế bằng giá trị trung bình cột trên tập huấn luyện. Sự khớp nối hoàn hảo này giúp người ra quyết định hiểu rõ chính xác biến số nào đang thúc đẩy hoặc kéo giảm đà tăng trưởng trong từng tình huống giả định.

✨ Giá trị đắt giá: Việc tính toán giá trị Shapley chính xác trong bài toán chuỗi thời gian giúp chuyển hóa mô hình hộp đen thành một công cụ phân tích kịch bản trực quan, cho phép nhà phân tích định lượng tường tận mức độ đóng góp của từng biến vĩ mô vào dự báo tương lai mà không làm mất đi độ chính xác toán học.

Câu hỏi tư duy và bài tập ứng dụng

Khi phân tích kịch bản với số lượng biến giải thích vượt quá 15 biến, thời gian tính toán giá trị Shapley chính xác sẽ tăng theo cấp số nhân. Bạn sẽ áp dụng chiến lược tiền xử lý hoặc thuật toán xấp xỉ nào để cân bằng giữa chi phí tính toán và độ tin cậy của lời giải thích? Hãy thử thay thế thuật toán SVM trong đoạn mã trên bằng Random Forest hoặc mô hình tuyến tính để so sánh sự khác biệt trong phân bổ giá trị Shapley.


Bài viết khác
Trong hành trình phát triển các lệnh ước lượng chuyên sâu trong Stata, việc tích hợp mã nguồn từ ngôn ngữ khác như C, C++ hay Java mở ra một thế giới mới về hiệu suất và khả năng tùy biến. Một trong những kỹ thuật mạnh mẽ nhất là viết plugin — hay còn gọi là thư viện liên kết động (DLL) — để tận dụng sức mạnh của C trong môi trường Stata. Bài viết này là phần thứ hai trong chuỗi chuyên đề “Viết một lệnh ước lượng trong Stata”, tiếp nối bài trước về việc chuẩn bị viết plugin. Ở đây, chúng ta sẽ xây dựng một plugin C thực hiện chính xác các phép tính mà hàm mymean_work() trong tệp mymean11.ado đã làm. Mục tiêu không chỉ là minh họa cách giao tiếp giữa C và Stata, mà còn cung cấp một nền tảng vững chắc cho các tính toán hiệu suất cao trong các mô hình kinh tế lượng phức tạp. Viết một plugin C đơn giản: “Hello, C!” Trước khi tiến vào tính toán thực tế, hãy bắt đầu bằng một ví dụ đơn giản: một plugin C hiển thị thông điệp “Hello from C” trong cửa sổ Stata. Mã nguồn cho myhello.ado được trình bày như sau:
Trong bài viết trước, chúng ta đã xây dựng một đường ống phân tích văn bản sử dụng quanteda. Quy trình đó tạo ra ma trận đặc trưng văn bản (DFM), áp dụng trọng số TF-IDF và đo lường sự tương đồng qua cosine similarity. Tuy nhiên, phương pháp này bộc lộ một hạn chế căn bản: cosine similarity tính trên các vector TF-IDF thưa chỉ phản ánh sự trùng lặp từ vựng, chứ không nắm bắt được ý nghĩa ngữ nghĩa. Xét ví dụ hai câu: "Người vay nợ không thực hiện nghĩa vụ trả nợ" và "Khách hàng không đáp ứng được cam kết trả nợ". Sau khi loại từ dừng, chúng không chia sẻ từ vựng nào, dẫn đến độ tương đồng TF-IDF gần như bằng 0. Dù vậy, bất kỳ аналитик nào cũng nhận ra chúng mang ý nghĩa như nhau. Giải pháp nằm ở vector nhúng dày đặc (dense embeddings) — biểu diễn thần kinh nơi các văn bản mang ý nghĩa gần nhau được ánh xạ đến các vị trí lân cận trong không gian vectơ. Nhờ đó, chúng ta có thể đo lường sự tương đồng ngữ nghĩa ngay cả khi không có từ chung. Bài viết này sẽ hướng dẫn xây dựng một đường ống Tạo sinh tăng cường truy xuất (RAG) trong R, sử dụng ragnar cho kho truy xuất và ellmer cho tương tác mô hình ngôn ngữ lớn (LLM), minh họa sức mạnh của nhúng dày đặc trong truy xuất và sinh câu trả lời. Toàn bộ quy trình chạy cục bộ nhờ Ollama.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: [email protected]
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội