messenger_logo
Liên hệ qua Messenger
SciEco

Hiểu sâu về độ lệch phương sai và khả năng ước lượng song trùng bền vững của tmle qua giả lập dữ liệu bằng r

I
IEFPA
Ngày viết: 01/06/2026

Phương pháp ước lượng tối đa khả dĩ mục tiêu thường được gọi là TMLE là một công cụ mạnh mẽ trong phân tích nhân quả. Nhiều nhà nghiên cứu từng nghe về đặc tính song trùng bền vững của phương pháp này nhưng chỉ thực sự thấu hiểu nó khi tiến hành giả lập dữ liệu thực tế. Phương pháp này hoạt động cực kỳ hiệu quả khi một trong hai mô hình kết quả hoặc mô hình điều trị được thiết lập chính xác. Việc kết hợp thuật toán XGBoost cùng TMLE giúp tự động bắt trọn các mối quan hệ phức tạp trong dữ liệu mà không cần phải khai báo các tương tác thủ công. Bài viết này sẽ đi sâu vào cơ chế vận hành của phương pháp thông qua việc giả lập dữ liệu cụ thể trong môi trường R.

Khái Niệm Về Tmle

TMLE là một phương pháp thống kê tiên tiến được sử dụng để ước lượng các tác động nhân quả trong các nghiên cứu quan sát và thử nghiệm lâm sàng. Phương pháp này kết hợp linh hoạt giữa các thuật toán học máy và kỹ thuật thống kê truyền thống nhằm mang lại các ước lượng vững cho hiệu quả tác động của can thiệp, đồng thời kiểm soát tốt các yếu tố nhiễu.

Quy trình vận hành của TMLE gồm hai giai đoạn chính. Đầu tiên, hệ thống sẽ ước lượng mô hình kết quả và mô hình điều trị. Sau đó, các ước lượng này được sử dụng để hiệu chỉnh nhằm hướng trực tiếp đến tham số mục tiêu cần nghiên cứu. Cách tiếp cận này đặc biệt hữu ích trong các bối cảnh mà phương pháp truyền thống dễ bị lệch hoặc hoạt động kém hiệu quả do sự xuất hiện của các mối quan hệ phi tuyến phức tạp.

Ý Nghĩa Của Đặc Tính Song Trùng Bền Vững

Một ước lượng được coi là song trùng bền vững khi nó duy trì tính nhất quán nếu mô hình gán điều trị hay còn gọi là điểm xu hướng hoặc mô hình kết quả được xác định chính xác. Nói cách khác, bạn có hai cơ hội để đạt được một ước lượng nhân quả hợp lệ. Ngay cả khi một trong hai mô hình bị thiết lập sai, chỉ cần mô hình còn lại đúng, kết quả ước lượng cuối cùng vẫn đảm bảo độ tin cậy. Đặc tính này mang lại lợi thế vượt trội trong các nghiên cứu quan sát thực tế, nơi ranh giới của việc thiết lập đúng mô hình thường rất mơ hồ. Để đánh giá thuộc tính này, hai chỉ số quan trọng cần được xem xét là độ lệch bias và phương sai variance.

Phân Biệt Độ Lệch Bias Và Phương Sai Variance

Độ lệch bias và phương sai variance là hai nguồn sai số cơ bản trong mọi mô hình dự báo và thống kê. Độ lệch đại diện cho sai số hệ thống xảy ra khi mô hình liên tục đánh giá cao hơn hoặc thấp hơn giá trị thực tế của tham số. Độ lệch cao dễ dẫn đến hiện tượng học chưa đủ, khiến mô hình bỏ lỡ các quy luật ẩn sâu trong dữ liệu.

Ngược lại, phương sai thể hiện sự dao động của các dự báo trên các tập dữ liệu huấn luyện khác nhau. Phương sai cao dẫn đến hiện tượng quá khớp, nơi mô hình học cả những nhiễu ngẫu nhiên thay vì tín hiệu thực tế.

Công thức tính độ lệch bias được biểu diễn như sau:

Bias của theta_hat = E[theta_hat] - theta

Trong đó theta_hat là ước lượng của tham số theta và E[theta_hat] là giá trị kỳ vọng của ước lượng.

Đoạn mã giả lập bằng R dưới đây minh họa cách tính toán độ lệch:

1predicted_theta <- vector(mode = "numeric", length=1000)
2for (i in 1:1000) {
3  training_data <- dplyr::slice_sample(original_training_data, n = nrow(original_training_data), replace = T)
4  model <- glm(outcome~treatment+confounder,data=training_data)
5  outcome_hat_1 <- predict(model,newdata = training_data |> mutate(treatment = 1))
6  outcome_hat_0 <- predict(model,newdata = training_data |> mutate(treatment = 0))
7  predicted_theta[i] <- mean(outcome_hat_1) - mean(outcome_hat_0)
8}
9bias <- mean(predicted_theta) - theta

Công thức tính phương sai variance được biểu diễn như sau:

Var của theta_hat = E[(theta_hat - E[theta_hat])^2]

Đoạn mã giả lập bằng R tương ứng để tính toán phương sai:

1predicted_theta <- vector(mode = "numeric", length=1000)
2for (i in 1:1000) {
3  training_data <- dplyr::slice_sample(original_training_data, n = nrow(original_training_data), replace = T)
4  model <- glm(outcome~treatment+confounder,data=training_data)
5  outcome_hat_1 <- predict(model,newdata = training_data |> mutate(treatment = 1))
6  outcome_hat_0 <- predict(model,newdata = training_data |> mutate(treatment = 0))
7  predicted_theta[i] <- mean(outcome_hat_1) - mean(outcome_hat_0)
8}
9variance <- mean((predicted_theta-mean(predicted_theta))^2)
10# Hoặc sử dụng hàm có sẵn
11variance <- var(predicted_theta)

Giả Lập Dữ Liệu Thực Tế

Hãy tiến hành xây dựng một tập dữ liệu giả lập có chủ đích với các mối quan hệ phi tuyến và tương tác phức tạp để kiểm tra tính năng của các phương pháp.

1library(tidyverse)
2set.seed(1)
3n <- 10000
4W1 <- rnorm(n)
5W2 <- rnorm(n)
6W3 <- rbinom(n, 1, 0.5)
7W4 <- rnorm(n)
8# Mô hình điểm xu hướng thực tế
9A <- rbinom(n, 1, plogis(-0.5 + 0.8*W1 + 0.5*W2^2 + 0.3*W3 - 0.4*W1*W2 + 0.2*W4))
10# Mô hình kết quả thực tế
11Y <- rbinom(n, 1, plogis(-1 + 0.2*A + 0.6*W1 - 0.4*W2^2 + 0.5*W3 + 0.3*W1*W3 + 0.2*W4^2))
12# Tính toán giá trị ATE thực tế
13logit_Y1 <- -1 + 0.2 + 0.6*W1 - 0.4*W2^2 + 0.5*W3 + 0.3*W1*W3 + 0.2*W4^2
14logit_Y0 <- -1 + 0 + 0.6*W1 - 0.4*W2^2 + 0.5*W3 + 0.3*W1*W3 + 0.2*W4^2
15Y1_true <- plogis(logit_Y1)
16Y0_true <- plogis(logit_Y0)
17true_ATE <- mean(Y1_true - Y0_true)
18df <- tibble(W1 = W1, W2 = W2, W3 = W3, W4 = W4, A = A, Y = Y,
19           true_ATE = true_ATE, Y1_true = Y1_true, Y0_true = Y0_true)

Giá trị hiệu quả tác động trung bình thực tế thu được từ dữ liệu này là 0.0373518. Chúng ta sẽ dùng giá trị mốc này để đối chiếu hiệu năng của các mô hình kế tiếp.

Xây Dựng Các Mô Hình Ước Lượng Từ Sai Đến Đúng

Mô hình kết quả sai lệch

Nếu chỉ sử dụng một mô hình hồi quy tuyến tính thông thường không khai báo các tương tác bậc hai:

1model <- glm(Y ~ A + W1 + W2 + W3 + W4, family = "binomial")
2summary(model)

Hệ số của biến điều trị A ước lượng được là âm 0.0501418, hoàn toàn ngược lại với tác động thực tế của dữ liệu.

Hàm g-computation ứng dụng

Xây dựng hàm tính toán hiệu quả tác động trung bình dựa trên mô hình đã khớp:

1g_comp <- function(model,data,ml=F) {
2  if (ml==T) {
3   y1 <- predict(model, new_data=data |> mutate(A=as.factor(1)), type = "prob")[,2] |> pull()
4   y0 <- predict(model, new_data=data |> mutate(A=as.factor(0)), type = "prob")[,2] |> pull()
5  } else {
6  y1 <- predict(model, newdata=data |> mutate(A=1), type = "response")
7  y0 <- predict(model, newdata=data |> mutate(A=0), type = "response")
8  }
9  return(mean(y1-y0))
10}
11g_comp(model,df)

Kết quả trả về là âm 0.009823307, xác nhận sự sai lệch nghiêm trọng khi bỏ qua các tương tác phi tuyến.

Mô hình kết quả chính xác

Khi khai báo đầy đủ các tương tác và biến số bậc hai thực tế vào mô hình:

1model <- glm(Y ~ A + W1 + I(W2^2) + W3 + W1:W2 + W4, family = "binomial")
2g_comp(model,df)

Kết quả trả về đạt mức 0.03576854, rất sát với giá trị thực tế của ATE.

Mô hình điều trị sai lệch dùng phương pháp nghịch đảo xác suất gán điều trị

Sử dụng phương pháp nghịch đảo xác suất gán điều trị với mô hình gán điều trị bị thiết lập sai:

1ps_model <- glm(A ~ W1 + W2 + W3 + W4, family = "binomial")  
2ps <- ps_model$fitted.values
3ps_final <- pmax(pmin(ps, 0.95), 0.05)
4weights <- ifelse(A == 1, 1/ps_final, 1/(1-ps_final))
5model <- glm(Y ~ A, family = "binomial", weights = weights)
6g_comp(model,df)

Kết quả thu được tiếp tục sai lệch nặng nề với giá trị âm 0.0095777.

Mô hình điều trị chính xác

Khi mô hình gán điều trị được khai báo đúng các thành phần phi tuyến:

1ps_model <- glm(A ~ W1 + I(W2^2) + W3 + W1:W2 + W4, family = "binomial")
2ps <- ps_model$fitted.values
3ps_final <- pmax(pmin(ps, 0.95), 0.05)
4weights <- ifelse(A == 1, 1/ps_final, 1/(1-ps_final))
5model <- glm(Y ~ A, family = "binomial", weights = weights)
6g_comp(model,df)

Kết quả cải thiện rõ rệt đạt mức 0.03874379, tiệm cận rất gần với giá trị mục tiêu.

Giải pháp học máy với XGBoost

Trong thực tế, chúng ta hầu như không thể biết trước cấu trúc phi tuyến phức tạp của dữ liệu để khai báo thủ công. Sử dụng thuật toán XGBoost để tự động dò tìm cấu trúc này:

1library(tidymodels)
2library(doParallel)  
3library(future)
4workers <- parallel::detectCores(logical = FALSE) - 1
5plan(multisession, workers = workers)
6all_cores <- parallel::detectCores(logical = FALSE)
7cl <- makePSOCKcluster(all_cores - 1)
8registerDoParallel(cl)
9df_ml <- df |> 
10  select(Y,A,W1,W2,W3,W4) |>
11  mutate(Y = as.factor(Y),
12         A = as.factor(A))
13xgb_spec <- boost_tree(
14  trees = 1000,
15  tree_depth = tune(),
16  min_n = tune(),
17  loss_reduction = tune(),
18  mtry = tune(),
19  learn_rate = tune()
20) %>%
21  set_engine("xgboost") %>%
22  set_mode("classification")  
23xgb_wf <- workflow() %>%
24  add_model(xgb_spec) %>%
25  add_formula(Y ~ .)
26xgb_grid <- grid_space_filling(
27  tree_depth(),
28  min_n(),
29  loss_reduction(),
30  finalize(mtry(),df_ml),
31  learn_rate(),
32  size = 20
33)
34set.seed(1)
35folds <- vfold_cv(df_ml, v = 5)
36xgb_res <- tune_grid(
37  xgb_wf,
38  resamples = folds,
39  grid = xgb_grid,
40  control = control_grid(save_pred = TRUE,
41                         parallel_over = "everything")
42)
43best_xgb <- select_best(xgb_res, metric = "roc_auc")
44final_xgb <- finalize_workflow(xgb_wf, best_xgb)
45final_fit <- fit(final_xgb, data = df_ml)
46g_comp(final_fit, df_ml, T)

Kết quả trả về là 0.03447109. XGBoost đã tự động xử lý các mối quan hệ phức tạp và cho ra ước lượng rất chính xác mà không cần bất kỳ sự can thiệp thủ công nào vào công thức thiết lập.

Quy Trình Thực Hiện TMLE Chi Tiết

Hãy cùng xem xét quy trình TMLE từng bước một trong trường hợp mô hình kết quả bị thiết lập sai nhưng mô hình điều trị được thiết lập đúng.

Bước 1: Khởi tạo mô hình kết quả

1model_outcome <- glm(Y ~ A + W1 + W2 + W3 + W4, family = "binomial") # Thiết lập sai
2model_outcome_all <- predict(model_outcome, newdata = df, type = "response")
3model_outcome_1 <- predict(model_outcome, newdata = df |> mutate(A = 1), type = "response")
4model_outcome_0 <- predict(model_outcome, newdata = df |> mutate(A = 0), type = "response")

Bước 2: Thiết lập mô hình điều trị và tính biến đồng biến thông minh

1model_treatment <- glm(A ~ W1 + I(W2^2) + W3 + W1:W2 + W4, family = "binomial") # Thiết lập đúng
2ps <- model_treatment$fitted.values
3ps_final <- ps
4a_1 <- 1/(predict(model_treatment, df, type = "response"))
5a_0 <- -1/(1 - predict(model_treatment, df, type = "response"))
6clever_covariate <- ifelse(A == 1, 1/ps_final, -1/(1-ps_final))

Bước 3: Ước lượng tham số biến động epsilon

1epsilon_model <- glm(Y ~ -1 + offset(qlogis(model_outcome$fitted.values)) + clever_covariate, family = "binomial")
2epsilon <- epsilon_model$coefficients

Bước 4: Cập nhật kết quả ban đầu dựa trên thông tin hiệu chỉnh

1updated_outcome_1 <- plogis(qlogis(model_outcome_1)+epsilon*a_1)
2updated_outcome_0 <- plogis(qlogis(outcome_0 <- plogis(qlogis(model_outcome_0)+epsilon*a_0))

Bước 5: Tính toán hiệu quả tác động trung bình ATE mới

1ate <- mean(updated_outcome_1-updated_outcome_0)
2print(ate)

Kết quả đạt mức 0.04068321, kéo giá trị ước lượng từ mức sai lệch nghiêm trọng ban đầu của mô hình kết quả về sát với thực tế nhờ vào mô hình điều trị chính xác.

Bước 6: Ước lượng sai số chuẩn và khoảng tin cậy

1se <- sqrt(var((Y-model_outcome_all)*clever_covariate+updated_outcome_1-updated_outcome_0-ate)/n)
2pval <- 2*(1-pnorm(abs(ate/se)))
3print(paste0("ATE: ",round(ate,3), " [95%CI ", round(ate-1.96*se,3),"-",round(ate+1.96*se,3),", p=",round(pval,3),"]"))

Đánh Giá Và So Sánh Toàn Diện Các Mô Hình

Để kiểm chứng tính ổn định, chúng ta tiến hành lấy mẫu lại 1000 lần với quy mô mẫu là 6000 quan sát để so sánh bốn hướng tiếp cận khác nhau.

Bảng so sánh hiệu năng chi tiết dựa trên 1000 lần chạy giả lập:

| Tên Mô Hình | Độ Lệch Bias | Phương Sai Variance |

| --- | --- | --- |

| Mô hình hồi quy kết quả đúng | -0.0009778 | 0.0001410 |

| Mô hình điều trị đúng với trọng số IPW | 0.0019444 | 0.0001581 |

| Mô hình hồi quy kết quả sai lệch | -0.0464683 | 0.0001354 |

| Mô hình thuần XGBoost cho kết quả | -0.0164066 | 0.0000459 |

| Mô hình TMLE kết hợp XGBoost cỡ mẫu tìm kiếm 5 | 0.0066270 | 0.0001399 |

| Mô hình TMLE kết hợp XGBoost cỡ mẫu tìm kiếm 20 | 0.0041615 | 0.0001645 |

Kết quả so sánh cho thấy khi các mô hình hồi quy truyền thống được xác định chính xác, chúng cho độ lệch thấp nhất. Tuy nhiên, trong điều kiện thực tế khó xác định đúng dạng hàm, mô hình TMLE kết hợp với việc tối ưu hóa siêu tham số của XGBoost mang lại sự cân bằng tối ưu khi giảm thiểu độ lệch xuống mức rất thấp, đồng thời kiểm soát phương sai ở mức chấp nhận được tương đương với hồi quy chuẩn.

Giải Pháp Thay Thế Trong Thống Kê Truyền Thống

Bên cạnh TMLE, mô hình ước lượng nghịch đảo xác suất gán điều trị tăng cường hay còn gọi là AIPW cũng là một đại diện tiêu biểu cho trường phái song trùng bền vững. AIPW kết hợp mô hình điểm xu hướng và mô hình kết quả để đưa ra ước lượng tối ưu và nhất quán chỉ cần một trong hai mô hình đúng. Trong thực tế, các nhà nghiên cứu có thể sử dụng các gói thư viện chuyên dụng của AIPW trong R để thay thế hoặc đối chiếu trực tiếp với kết quả của TMLE.

✨ Phương pháp TMLE chứng minh giá trị vượt trội khi kết hợp sức mạnh khai phá dữ liệu tự động của các thuật toán học máy hiện đại với nền tảng lý thuyết vững chắc của thống kê nhân quả, giúp các nhà khoa học dữ liệu tự tin đưa ra các kết luận chính xác hơn mà không lo ngại về sai lệch do thiết lập sai dạng hàm của mô hình.

Câu hỏi tư duy: Trong các nghiên cứu quan sát có số lượng biến nhiễu cực kỳ lớn và xuất hiện hiện tượng đa cộng tuyến mạnh, liệu việc sử dụng thuật toán học máy phức tạp cho cả mô hình điều trị lẫn mô hình kết quả trong TMLE có làm tăng nguy cơ quá khớp và ảnh hưởng thế nào đến phương sai của ước lượng ATE cuối cùng?


Bài viết khác
Trong phân tích khoa học dữ liệu, việc ước lượng tham số mô hình là một bước quan trọng, nhưng việc đảm bảo mô hình được chỉ định chính xác còn thiết yếu hơn. Bài viết này sẽ đi sâu vào cách kiểm định thông số kỹ thuật mô hình bằng phương pháp momen tổng quát (GMM) trong Stata, đặc biệt khi làm việc với các mô hình nhận dạng thừa. Chúng ta sẽ khám phá cách sử dụng phiên bản chương trình của lệnh GMM, vốn rất hữu ích cho các mô hình phức tạp, và cách kiểm định các ràng buộc nhận dạng thừa bằng thống kê J của Hansen. Mô Hình Poisson Với Biến Giải Thích Nội Sinh Chúng ta sẽ sử dụng GMM để ước lượng các tham số của một mô hình Poisson có biến giải thích nội sinh. Biến giải thích nội sinh là những biến có thể tương quan với thành phần sai số của mô hình, dẫn đến ước lượng không nhất quán nếu không được xử lý đúng cách. Mô hình hồi quy Poisson của biến phụ thuộc y_i trên các biến ngoại sinh x_i và biến nội sinh y_{2,i} có dạng kỳ vọng của y_i với điều kiện các biến x_i, y_{2,i} và biến nhiễu epsilon_i được biểu thị qua hàm mũ của tổng beta_1 nhân x_i cộng beta_2 nhân y_{2,i}, rồi cộng thêm biến nhiễu epsilon_i. Biến nhiễu epsilon_i có giá trị trung bình bằng 0. Các biến giải thích y_{2,i} có thể tương quan với epsilon_i. Công thức này tương tự như công thức của lệnh ivpoisson với các sai số cộng gộp.
Bài viết này khám phá cách cập nhật và tạo các lệnh Stata để tích hợp với những mô hình AI phổ biến như ChatGPT, Claude, Gemini và Grok. Sau khi bài đăng trước về lệnh Stata để chạy ChatGPT trở nên phổ biến, những thay đổi trong mã API của OpenAI đã khiến lệnh đó không còn hoạt động. Mục tiêu của chúng tôi là hướng dẫn bạn cách điều chỉnh mã API và viết các lệnh Stata tương tự để tận dụng sức mạnh của các công cụ AI khác nhau trực tiếp từ môi trường Stata. Trọng tâm của bài viết này, cũng như bài trước, là minh họa mức độ dễ dàng để tận dụng các tính năng của PyStata nhằm kết nối với ChatGPT và các công cụ AI khác, thay vì đưa ra lời khuyên về cách sử dụng các công cụ AI để trả lời các câu hỏi cụ thể của Stata. Do đó, các ví dụ chỉ đơn giản là yêu cầu một bài haiku về Stata. Tuy nhiên, bạn có thể truyền bất kỳ yêu cầu nào mà bạn thấy hữu ích trong quy trình làm việc của mình với Stata. Tổng Quan Về Tích Hợp Stata/Python Chúng tôi giả định rằng bạn đã quen thuộc với tích hợp Stata/Python và cách viết lệnh chatgpt ban đầu. Nếu các chủ đề này còn lạ lẫm, bạn nên đọc các bài đăng trên blog dưới đây:
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: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội