Mô hình hóa thời gian như một biến dự báo liên tục trong Stata
Modeling Time as a Continuous Predictor in Stata
Giới thiệu chuỗi bài học về phân tích dữ liệu dọ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 trong những chủ đề hấp dẫn nhất của kinh tế lượng: phân tích dữ liệu dọc. Trong nghiên cứu kinh tế và xã hội, chúng ta thường xuyên muốn tìm hiểu sự thay đổi của một hiện tượng nào đó theo thời gian. Ví dụ, làm thế nào thu nhập của một người thay đổi sau khi tốt nghiệp? Hiệu quả của một chính sách mới kéo dài bao lâu? Hay sự phục hồi của một doanh nghiệp sau khủng hoảng diễn ra như thế nào? Để trả lời những câu hỏi này, chúng ta cần thu thập dữ liệu của cùng một đối tượng tại nhiều thời điểm khác nhau, hay còn gọi là dữ liệu dọc (longitudinal data).
Thời gian, trong bối cảnh này, không chỉ là một cột mốc mà còn là một biến dự báo mạnh mẽ, giúp chúng ta khám phá “quỹ đạo” thay đổi của các biến số quan tâm. Tuy nhiên, việc mô hình hóa thời gian không hề đơn giản. Chúng ta nên xem tác động của thời gian là một đường thẳng tuyến tính, hay nó thay đổi theo từng giai đoạn? Liệu quỹ đạo thay đổi này có giống nhau cho tất cả mọi người, hay mỗi cá nhân lại có một con đường phát triển riêng? Chuỗi bài học này được thiết kế để trang bị cho các bạn những công cụ và tư duy cần thiết để trả lời những câu hỏi đó một cách khoa học bằng phần mềm Stata.
Chúng ta sẽ bắt đầu từ những mô hình cơ bản nhất, xem xét thời gian như một đường thẳng, sau đó dần dần xây dựng các mô hình phức tạp hơn, cho phép sự thay đổi này khác biệt giữa các nhóm và thậm chí thay đổi đột ngột tại những điểm thời gian cụ thể (ví dụ như trước và sau một can thiệp chính sách). Với cách tiếp cận từng bước, kết hợp giữa lý thuyết cô đọng và thực hành chi tiết, các bạn sẽ không chỉ học được câu lệnh Stata, mà quan trọng hơn là cách tư duy về dữ liệu theo thời gian, cách diễn giải kết quả một cách sâu sắc và trực quan hóa chúng một cách thuyết phục. Hãy cùng nhau bắt đầu hành trình khám phá những câu chuyện ẩn sau sự thay đổi của dữ liệu theo thời gian!
Cấu trúc chuỗi bài học
- Mô hình hóa hiệu ứng tuyến tính của thời gianHọc cách sử dụng mô hình chặn ngẫu nhiên và độ dốc ngẫu nhiên để nắm bắt quỹ đạo thay đổi trung bình và sự khác biệt cá nhân.
- Phân tích tương tác giữa thời gian và biến phân loạiKhám phá xem liệu quỹ đạo thay đổi theo thời gian có khác nhau giữa các nhóm đối tượng khác nhau hay không (ví dụ: nhóm được can thiệp và nhóm đối chứng).
- Hồi quy từng đoạn để mô hình hóa sự thay đổi cấu trúcNắm vững kỹ thuật mô hình hóa sự thay đổi đột ngột trong tác động của thời gian, chẳng hạn như trước và sau một sự kiện quan trọng.
- Mô hình tương tác hiệu ứng từng đoạn phức hợpKết hợp các kỹ thuật đã học để phân tích các kịch bản phức tạp, nơi cả độ dốc và bước nhảy thay đổi khác nhau giữa các nhóm.
- Bài tập thực hành tổng hợpÁp dụng tất cả các mô hình đã học vào các bộ dữ liệu và bối cảnh mới để củng cố kỹ năng phân tích và diễn giải.
- Tổng hợp và định hướng nghiên cứu nâng caoTổng kết kiến thức, so sánh ưu nhược điểm của từng phương pháp và khám phá các hướng đi tiếp theo trong phân tích dữ liệu dọc.
Kiến thức tiên quyết
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:
- Xây dựng và ước tính các mô hình dữ liệu dọc sử dụng thời gian như một biến liên tục trong Stata.
- Phân biệt và áp dụng đúng đắn các mô hình chặn ngẫu nhiên (random intercept) và độ dốc ngẫu nhiên (random slope).
- Ước tính và diễn giải chính xác các hiệu ứng tương tác giữa thời gian và các biến phân loại.
- Sử dụng thành thạo hồi quy từng đoạn (piecewise regression) để phân tích sự thay đổi cấu trúc theo thời gian.
- Sử dụng các lệnh hậu ước lượng như
marginsvàmarginsplotđể trực quan hóa và diễn giải các kết quả phức tạp một cách trực quan và dễ hiểu. - Tự tin lựa chọn mô hình phù hợp để phân tích quỹ đạo thay đổi trong các bộ dữ liệu dọc của riêng mình.
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 dựa trên kiến thức và ví dụ trong các tài liệu kinh điển. Để tìm hiểu sâu hơn, các bạn nên tham khảo:
- Singer, J. D., & Willett, J. B. (2003). Applied Longitudinal Data Analysis: Modeling Change and Event Occurrence. Oxford University Press. Đây là cuốn sách nền tảng và được trích dẫn nhiều nhất về phân tích dữ liệu dọc, giải thích các khái niệm một cách rất trực quan và sư phạm.
- Mitchell, M. N. (2021). Interpreting and visualizing regression models using Stata (Second edition). Stata Press. Cuốn sách này là nguồn cảm hứng chính cho chuỗi bài viết, cung cấp các kỹ thuật thực hành và trực quan hóa kết quả hồi quy trong Stata một cách xuất sắc.
Phụ lục: Mã Stata tạo dữ liệu mô phỏng
Để các bạn có thể thực hành theo từng bước trong chuỗi bài học, chúng tôi cung cấp mã Stata dưới đây để tạo ra các bộ dữ liệu mô phỏng. Các bộ dữ liệu này có cấu trúc và đặc điểm tương tự như những bộ được sử dụng trong tài liệu gốc. Các bạn chỉ cần chạy toàn bộ đoạn mã này một lần để tạo ra các tệp .dta cần thiết.
* ==================================================
* MỤC ĐÍCH: Tạo dữ liệu mô phỏng cho chuỗi bài học
* "Mô hình hóa thời gian như một biến dự báo liên tục"
* NGÀY TẠO: 23-09-2025
* ==================================================
clear all
set seed 12345
* ----- Dữ liệu 1: Hiệu ứng tuyến tính của thời gian (sleep_conlin.dta) -----
* Bối cảnh: 75 người trải qua sự kiện căng thẳng, theo dõi giấc ngủ (phút)
* trong khoảng 7 tuần (8 lần đo).
* --------------------------------------------------------------------------
set obs 75
gen id = _n
gen u_i = rnormal(0, 45) // Hiệu ứng ngẫu nhiên của cá nhân (random intercept)
gen v_i = rnormal(0, 0.8) // Hiệu ứng ngẫu nhiên của độ dốc (random slope)
expand 8 // 8 lần quan sát cho mỗi người
bysort id: gen occasion = _n
gen obsday = round(runiform(1, 7) + (occasion-1)*7)
replace obsday = 1 if occasion == 1
gen sleep = 350 + 0.5*obsday + u_i + v_i*obsday + rnormal(0, 20)
label var id "Mã định danh cá nhân"
label var obsday "Ngày quan sát"
label var sleep "Thời gian ngủ (phút)"
compress
save sleep_conlin.dta, replace
clear
* ----- Dữ liệu 2: Tương tác với biến phân loại (sleep_cat3conlin.dta) -----
* Bối cảnh: 75 người mất ngủ được chia ngẫu nhiên vào 3 nhóm:
* 1=Đối chứng, 2=Dùng thuốc, 3=Giáo dục.
* --------------------------------------------------------------------------
set obs 75
gen id = _n
gen group = mod(_n-1, 3) + 1
label define grplbl 1 "Control" 2 "Medication" 3 "Education"
label values group grplbl
gen u_i = rnormal(0, 30)
gen v_i = rnormal(0, 0.7)
expand 8
bysort id: gen occasion = _n
gen obsday = round(runiform(1, 6) + (occasion-1)*6)
replace obsday = 1 if occasion == 1
gen sleep = 340 + u_i + v_i*obsday + rnormal(0, 30)
* Thêm hiệu ứng của nhóm và tương tác
replace sleep = sleep + 35 + 0.2*obsday if group == 2 // Nhóm thuốc
replace sleep = sleep + 5 + 0.8*obsday if group == 3 // Nhóm giáo dục
label var group "Nhóm can thiệp"
compress
save sleep_cat3conlin.dta, replace
clear
* ----- Dữ liệu 3: Mô hình từng đoạn (sleep_conpw.dta) -----
* Bối cảnh: 75 người mất ngủ được theo dõi. Sau ngày 30, họ bắt đầu
* được cho dùng thuốc.
* --------------------------------------------------------------------------
set obs 75
gen id = _n
gen u_i = rnormal(0, 90)
gen v1_i = rnormal(0, 0.8) // random slope giai đoạn 1
gen v2_i = rnormal(0, 1.5) // random slope giai đoạn 2
gen j_i = rnormal(0, 5) // random jump
expand 8
bysort id: gen occasion = _n
gen obsday = round(runiform(1, 7) + (occasion-1)*7)
replace obsday = 1 if occasion == 1
gen trtphase = (obsday >= 31)
gen sleep = 350 - 0.01*obsday + u_i + v1_i*obsday + rnormal(0, 10)
replace sleep = sleep + 11 + 0.54*obsday + j_i + v2_i*(obsday-30) if trtphase == 1
compress
save sleep_conpw.dta, replace
clear
* ----- Dữ liệu 4: Tương tác từng đoạn (sleep_cat3pw.dta) -----
* Bối cảnh: Giống dữ liệu 2, nhưng can thiệp chỉ bắt đầu từ ngày 31.
* Giai đoạn 1 (1-30): baseline. Giai đoạn 2 (>30): can thiệp.
* --------------------------------------------------------------------------
set obs 75
gen id = _n
gen group = mod(_n-1, 3) + 1
label define grplbl 1 "Control" 2 "Medication" 3 "Education"
label values group grplbl
gen u_i = rnormal(0, 20)
expand 8
bysort id: gen occasion = _n
gen obsday = round(runiform(1, 7) + (occasion-1)*7)
replace obsday = 1 if occasion == 1
* Giai đoạn baseline
gen sleep = 351 - 0.04*obsday + rnormal(0, 20) + u_i
replace sleep = sleep - 2 if group == 2
replace sleep = sleep + 16 if group == 3
* Giai đoạn can thiệp (sau ngày 30)
gen trtphase = (obsday >= 31)
* Nhóm Control: gần như không đổi
replace sleep = sleep - 4.2 if trtphase == 1 & group == 1
* Nhóm Medication: có bước nhảy lớn, độ dốc không đổi
replace sleep = sleep + 30 if trtphase == 1 & group == 2
* Nhóm Education: bước nhảy nhỏ, độ dốc tăng mạnh
replace sleep = sleep - 2.5 + 2.4*obsday if trtphase == 1 & group == 3
compress
save sleep_cat3pw.dta, replace
clear
* Hoàn thành tạo dữ liệu
di "Đã tạo thành công 4 bộ dữ liệu: sleep_conlin.dta, sleep_cat3conlin.dta, sleep_conpw.dta, sleep_cat3pw.dta"
📚 Bài tiếp theo: Tiếp tục bài 1 về Mô hình hóa hiệu ứng tuyến tính của thời gian
💡 Lưu ý: Hãy đảm bảo bạn đã chạy đoạn mã Stata trên để tạo dữ liệu trước khi bắt đầu bài học đầu tiên. Việc này sẽ giúp bạn thực hành song song với nội dung bài giảng.