Mô hình hóa thời gian như một biến phân loại trong Stata

Modeling Time as a Categorical Predictor in Stata

Giới thiệu chuỗi bài học

Chào mừng các bạn sinh viên đến với chuỗi bài học chuyên sâu về một kỹ thuật quan trọng trong phân tích dữ liệu dọc: xem xét thời gian như một biến dự báo phân loại. Trong các phân tích kinh tế lượng, chúng ta thường đối mặt với dữ liệu được thu thập qua nhiều thời điểm khác nhau, ví dụ như theo dõi hiệu quả của một chính sách qua các quý, hoặc sự thay đổi trong hành vi của người tiêu dùng qua các tháng. Thay vì coi thời gian là một đường thẳng liên tục, việc xem mỗi thời điểm (tháng 1, tháng 2, tháng 3) như một danh mục riêng biệt mở ra những khả năng phân tích vô cùng mạnh mẽ. Cách tiếp cận này cho phép chúng ta so sánh trực tiếp và chính xác sự khác biệt giữa các thời điểm cụ thể, chẳng hạn như “Liệu doanh số bán hàng ở tháng 2 có thực sự cao hơn tháng 1 sau khi tung ra chiến dịch quảng cáo không?”.

Trong chuỗi bài học này, chúng ta sẽ không chỉ dừng lại ở lý thuyết. Trọng tâm chính là hướng dẫn các bạn từng bước thực hành trên phần mềm Stata, sử dụng lệnh mixed – một công cụ cực kỳ linh hoạt và mạnh mẽ, vượt trội hơn so hang với các phương pháp truyền thống như ANOVA đo lường lặp. Chúng ta sẽ bắt đầu từ ví dụ đơn giản nhất, nơi thời gian là yếu tố dự báo duy nhất, sau đó dần dần xây dựng các mô hình phức tạp hơn bằng cách thêm vào các yếu tố tương tác, chẳng hạn như so sánh hiệu quả của một loại thuốc giữa nhóm điều trị và nhóm đối chứng qua thời gian. Hơn nữa, chúng ta sẽ khám phá các chủ đề nâng cao nhưng cực kỳ cần thiết cho nghiên cứu thực tế, bao gồm cách lựa chọn cấu trúc hiệp phương sai phù hợp cho phần dư và cách xử lý khi kích thước mẫu của bạn nhỏ. Với các ví dụ trực quan và hướng dẫn chi tiết, chuỗi bài học này sẽ trang bị cho bạn kỹ năng để tự tin phân tích dữ liệu theo thời gian một cách khoa học và đáng tin cậy.

Cấu trúc chuỗi bài học

  1. Phân tích thời gian như một biến dự báo phân loại duy nhất
    Học cách sử dụng lệnh mixed để mô hình hóa sự thay đổi theo thời gian và diễn giải kết quả bằng các lệnh hậu ước lượng như marginscontrast.
  2. Phân tích tương tác giữa thời gian và biến phân loại hai nhóm
    Mở rộng mô hình bằng cách kiểm định xem tác động của thời gian có khác biệt giữa nhóm điều trị và nhóm đối chứng hay không, một kỹ thuật cốt lõi trong đánh giá tác động.
  3. Mở rộng phân tích tương tác với biến phân loại ba nhóm
    Nắm vững cách phân tích các tương tác phức tạp hơn, so sánh sự thay đổi theo thời gian giữa nhiều nhóm khác nhau để đưa ra kết luận sâu sắc hơn.
  4. So sánh các cấu trúc hiệp phương sai phần dư
    Hiểu tầm quan trọng của việc mô hình hóa cấu trúc hiệp phương sai và học cách sử dụng các tiêu chí AIC, BIC để chọn mô hình phù hợp nhất cho dữ liệu của bạn.
  5. Phân tích dữ liệu với mẫu nhỏ và các hiệu chỉnh
    Trang bị các kỹ thuật phân tích mạnh mẽ và đáng tin cậy cho các nghiên cứu có kích thước mẫu nhỏ, sử dụng các phương pháp hiệu chỉnh Kenward-Roger và Satterthwaite.
  6. Bài tổng hợp: Tổng hợp và mở rộng các mô hình thời gian dạng phân loại
    Hệ thống hóa toàn bộ kiến thức, so sánh các phương pháp và khám phá các hướng nghiên cứu nâng cao, giúp bạn có cái nhìn toàn cảnh và sâu sắc về chủ đề.

Kiến thức tiên quyết

Để theo dõi tốt nhất chuỗi bài học này, các bạn cần có kiến thức nền tảng về:

  • Kinh tế lượng cơ bản: Hiểu biết về mô hình hồi quy tuyến tính (OLS), ý nghĩa của hệ số, sai số chuẩn và kiểm định giả thuyết.
  • Sử dụng Stata cơ bản: Quen thuộc với giao diện Stata, cách nhập liệu, chạy các lệnh cơ bản (use, summarize, regress) và đọc kết quả.
  • Khái niệm về dữ liệu bảng (Panel Data): Biết sự khác biệt giữa dữ liệu chéo, chuỗi thời gian và dữ liệu bảng.

Mục tiêu học tập

Sau khi hoàn thành chuỗi bài học này, các bạn sẽ có khả năng:

  • Tự tin áp dụng lệnh mixed trong Stata để phân tích dữ liệu dọc khi coi thời gian là biến phân loại.
  • Sử dụng các lệnh hậu ước lượng margins, marginsplot, và contrast để diễn giải và trực quan hóa các kết quả phức tạp một cách hiệu quả.
  • Xây dựng và kiểm định các hiệu ứng tương tác giữa thời gian và các biến nhóm khác.
  • Hiểu và lựa chọn được cấu trúc hiệp phương sai phần dư phù hợp cho mô hình của mình.
  • Thực hiện các phân tích đáng tin cậy cho dữ liệu có kích thước mẫu nhỏ bằng các phương pháp hiệu chỉnh phù hợp.
  • Phân biệt được ưu và nhược điểm của việc mô hình hóa thời gian dưới dạng biến phân loại so với biến liên tục.

Tài liệu tham khảo

Nội dung của chuỗi bài học này được phát triển và diễn giải chủ yếu từ:

  • Mitchell, M. N. (2021). Interpreting and visualizing regression models using Stata (Second edition). Stata Press. (Cụ thể là Chương 17).
  • Singer, J. D., & Willett, J. B. (2003). Applied longitudinal data analysis: Modeling change and event occurrence. Oxford university press. (Tài liệu tham khảo bổ sung về phân tích dữ liệu dọc).

Phụ lục: Mã Stata tạo dữ liệu mô phỏng

Để đảm bảo tất cả các bạn có thể thực hành và tái tạo lại các kết quả trong chuozic bài học, dưới đây là mã Stata để tạo ra các bộ dữ liệu mô phỏng sẽ được sử dụng. Các bạn chỉ cần sao chép, dán vào cửa sổ Do-file của Stata và chạy để tạo các file .dta tương ứng.

Stata
* ==================================================
* MỤC ĐÍCH: TẠO DỮ LIỆU MÔ PHỎNG CHO CHUỖI BÀI HỌC
* Tác giả: Dựa trên mô tả của Mitchell (2021)
* ==================================================

* --- Dữ liệu 1: sleep_cat3.dta (Ví dụ 1) ---
clear
set obs 100
gen id = _n
expand 3
bysort id: gen month = _n
gen sleep = .

* Thiết lập các giá trị trung bình và độ lệch chuẩn
local mean1 348
local mean2 369
local mean3 367
local sd 31

* Tạo dữ liệu với một chút tương quan nội cá nhân
bysort id: replace sleep = rnormal(`mean1', `sd') if month == 1
bysort id: replace sleep = sleep[_n-1] + rnormal(`mean2'-`mean1', `sd'/2) if month == 2
bysort id: replace sleep = sleep[_n-1] + rnormal(`mean3'-`mean2', `sd'/2) if month == 3
label var sleep "Số phút ngủ mỗi đêm"
label var month "Tháng quan sát"
label var id "ID người tham gia"
compress
save sleep_cat3, replace
* --------------------------------------------------


* --- Dữ liệu 2: sleep_catcat23.dta (Ví dụ 2) ---
clear
set obs 200
gen id = _n
* 100 người nhóm Control (group=1), 100 người nhóm Medication (group=2)
gen group = 1 + (_n > 100)
label define group_lbl 1 "Control" 2 "Medication"
label values group group_lbl
expand 3
bysort id: gen month = _n
gen sleep = .

* Thiết lập các giá trị trung bình cho từng nhóm và tháng
* Nhóm Control
local c_mean1 351
local c_mean2 347
local c_mean3 350
* Nhóm Medication
local m_mean1 344
local m_mean2 368
local m_mean3 368
local sd 31

* Tạo dữ liệu
* Tháng 1
replace sleep = rnormal(`c_mean1', `sd') if month == 1 & group == 1
replace sleep = rnormal(`m_mean1', `sd') if month == 1 & group == 2
* Tháng 2 & 3
bysort id: replace sleep = sleep[_n-1] + rnormal(`c_mean2'-`c_mean1', `sd'/2) if month == 2 & group == 1
bysort id: replace sleep = sleep[_n-1] + rnormal(`c_mean3'-`c_mean2', `sd'/2) if month == 3 & group == 1
bysort id: replace sleep = sleep[_n-1] + rnormal(`m_mean2'-`m_mean1', `sd'/2) if month == 2 & group == 2
bysort id: replace sleep = sleep[_n-1] + rnormal(`m_mean3'-`m_mean2', `sd'/2) if month == 3 & group == 2

label var sleep "Số phút ngủ mỗi đêm"
label var month "Tháng quan sát"
label var group "Nhóm điều trị"
label var id "ID người tham gia"
compress
save sleep_catcat23, replace
* --------------------------------------------------


* --- Dữ liệu 3: sleep_catcat33.dta (Ví dụ 3) ---
clear
set obs 300
gen id = _n
* 100 Control, 100 Medication, 100 Education
gen group = 1
replace group = 2 if _n > 100 & _n <= 200
replace group = 3 if _n > 200
label define group_lbl3 1 "Control" 2 "Medication" 3 "Education"
label values group group_lbl3
expand 3
bysort id: gen month = _n
gen sleep = .
local sd 34

* Tạo dữ liệu dựa trên means từ margins output
bysort id: replace sleep = rnormal(344.7, `sd') if month==1 & group==1
bysort id: replace sleep = rnormal(347.3, `sd') if month==1 & group==2
bysort id: replace sleep = rnormal(347.9, `sd') if month==1 & group==3
bysort id: replace sleep = rnormal(352.8, `sd') if month==2 & group==1
bysort id: replace sleep = rnormal(377.2, `sd') if month==2 & group==2
bysort id: replace sleep = rnormal(363.0, `sd') if month==2 & group==3
bysort id: replace sleep = rnormal(358.1, `sd') if month==3 & group==1
bysort id: replace sleep = rnormal(378.9, `sd') if month==3 & group==2
bysort id: replace sleep = rnormal(395.7, `sd') if month==3 & group==3

label var sleep "Số phút ngủ mỗi đêm"
label var month "Tháng quan sát"
label var group "Nhóm điều trị"
label var id "ID người tham gia"
compress
save sleep_catcat33, replace
* --------------------------------------------------


* --- Dữ liệu 4: sleep_catcat23small.dta (Ví dụ mẫu nhỏ) ---
clear
* Sử dụng lại dữ liệu sleep_catcat23 và tạo mẫu nhỏ hơn, không cân bằng
use sleep_catcat23, clear
set seed 12345
* Giữ lại khoảng 30 người tham gia
keep if runiform() < 0.15
* Tạo dữ liệu thiếu một cách ngẫu nhiên
replace sleep = . if runiform() < 0.2
drop if sleep==. & month==1 // đảm bảo có baseline
compress
save sleep_catcat23small, replace
* --------------------------------------------------

di "Đã tạo thành công các file dữ liệu: sleep_cat3.dta, sleep_catcat23.dta, sleep_catcat33.dta, và sleep_catcat23small.dta"

📚 Bài tiếp theo: Tiếp tục bài 1 về Phân tích Thời gian như một Biến dự báo Phân loại Duy nhất

💡 Lưu ý: Hãy đảm bảo bạn đã chạy Do-file ở trên để tạo các bộ dữ liệu cần thiết trước khi bắt đầu bài học đầu tiên.

Back to top button