Phần này sẽ khám phá dữ liệu bị thiếu missing value trong Stata, tập trung vào dữ liệu bị thiếu dạng số. Mô tả cách chỉ ra dữ liệu bị thiếu trong các file dữ liệu thô của bạn. Bài này gồm các phần chính sau đây:
- Giới thiệu dữ liệu bị thiếu missing value là gì
- Cách Stata xử lý dữ liệu bị thiếu missing values
- Giá trị thiếu missing values trong câu lệnh gán cộng trừ nhân chia
- Giá trị thiếu missing value trong câu lệnh logic: lớn hơn, bé hơn, bằng, khác
Giới thiệu dữ liệu bị thiếu missing value là gì?
Chúng ta sẽ minh họa một số thuộc tính dữ liệu bị thiếu trong Stata bằng cách sử dụng dữ liệu từ một nghiên cứu về thời gian phản ứng với 7 đối tượng được chỉ định bởi biến id và thời gian phản ứng của đối tượng được đo tại ba thời điểm (thử nghiệm1, thử nghiệm2 và thử nghiệm3). File dữ liệu đầu vào được hiển thị bên dưới.
Vậy dữ liệu bị thiếu nằm ở đâu? Đó chính là các ô số liệu chỉ có dấu chấm . như các hình được tô đỏ ở trên. Tại sao bị thiếu,vì đó là giá trị không có, không tồn tại bạn nhé.
Bạn có thể tạo ra bảng ở trên bằng cách nhập vào toàn bộ lệnh sau vào màn hình stata
clear
input id trial1 trial2 trial3
1 1.5 1.4 1.6
2 1.5 . 1.9
3 . 2.0 1.6
4 . . 2.2
5 1.9 2.1 2
6 1.8 2.0 1.9
7 . . .
end
list
Bạn có thể nhận thấy rằng một số thời gian phản ứng được mã hóa bằng dấu chấm . như trường hợp của đối tượng 2 ở lần thử nghiệm số 2.
Người đo thời gian cho thử nghiệm đó đã không đo thời gian phản hồi một cách chính xác; do đó, điểm dữ liệu cho thử nghiệm thứ hai bị thiếu.
Cách Stata xử lý dữ liệu bị thiếu missing values
Theo quy tắc chung, các lệnh Stata thực hiện các phép tính thuộc bất kỳ loại nào sẽ xử lý dữ liệu bị thiếu bằng cách bỏ qua hàng có các giá trị bị thiếu. Tuy nhiên, cách mà các giá trị bị thiếu bị bỏ qua không phải lúc nào cũng nhất quán giữa các lệnh, vì vậy chúng ta hãy xem một số ví dụ.
Ví dụ 1:
Trước tiên, hãy chạy lệnh thống kê mô tả các biến thời gian phản ứng trial và xem cách Stata xử lý các giá trị bị thiếu.
summarize trial1 trial2 trial3
Như bạn thấy trong kết quả bên trên, sử dụng 4 quan sát cho thử nghiệm1 và thử nghiệm2 và 6 quan sát cho thử nghiệm3. Nói tóm lại, lệnh summarize thực hiện các phép tính trên tất cả các dữ liệu có sẵn.
Ví dụ 2:
Ví dụ thứ hai cho thấy lệnh tabulate hoặc lệnh tab1 xử lý dữ liệu bị thiếu. Giống như lệnh summarize, tab1 chỉ sử dụng dữ liệu có sẵn. Lưu ý rằng tỷ lệ phần trăm được tính dựa trên tổng số trường hợp không bị thiếu.
tab1 trial1 trial2 trial3
Có thể bạn muốn tính toán tỷ lệ phần trăm trong tổng số quan sát và tỷ lệ phần trăm bị thiếu cho mỗi biến được hiển thị trong bảng. Điều này có thể đạt được bằng cách thêm tùy chọn missing(có thể rút gọn thành m) sau lệnh lập bảng.
tab1 trial1 trial2 trial3, m
Kết quả cho thấy các giá trị missing value đã được đưa vào để tính phần trăm luôn nhé.
Ví dụ 3:
Hãy xem cách lệnh tương quan xử lý dữ liệu bị thiếu. Chúng ta hy vọng rằng nó sẽ thực hiện các phép tính dựa trên dữ liệu có sẵn và bỏ qua các giá trị bị thiếu. Đây là một lệnh ví dụ.
corr trial1 trial2 trial3
Kết quả được hiển thị bên trên. Lưu ý cách loại trừ các giá trị bị thiếu. Stata sẽ thực hiện xóa theo danh sách listwise và chỉ hiển thị tương quan cho các quan sát có giá trị không bị thiếu trên tất cả các biến được liệt kê, nên cuối cùng số quan sát chỉ là 3.
Ví dụ 4:
Stata cũng cho phép xóa từng cặp. Các mối tương quan được hiển thị cho các quan sát có giá trị không bị thiếu cho mỗi cặp biến. Điều này có thể được thực hiện bằng cách sử dụng lệnh pwcorr lệnh này là viết tắt của pairwise correlation. Pairwise nghĩa là từng cặp. Chúng ta sử dụng tùy chọn obs để hiển thị số lượng quan sát được sử dụng cho mỗi cặp. Như bạn có thể thấy, chúng khác nhau tùy thuộc vào số lượng bị thiếu.
pwcorr trial1 trial2 trial3, obs
Tóm tắt về cách xử lý các giá trị bị thiếu trong thủ tục Stata
summarize : Đối với mỗi biến, số lượng các giá trị không bị thiếu được sử dụng.
tabulation : Theo mặc định, các giá trị bị thiếu sẽ bị loại trừ và tỷ lệ phần trăm dựa trên số lượng các giá trị không bị thiếu. Nếu bạn sử dụng tùy chọn “missing” trên lệnh tab, tỷ lệ phần trăm dựa trên tổng số quan sát (không thiếu và bị thiếu) và tỷ lệ phần trăm giá trị bị thiếu được báo cáo trong bảng.
corr : Theo mặc định, các mối tương quan được tính dựa trên số hàng có dữ liệu không bị thiếu cho các biến được liệt kê sau lệnh corr (xóa dữ liệu bị thiếu theo chiều danh sách). Lệnh pwcorr có thể được sử dụng để yêu cầu tính toán các mối tương quan theo kiểu từng cặp, có nghĩa là tất cả dữ liệu có sẵn cho mỗi cặp biến sẽ được sử dụng để tính toán mối tương quan. Điều này có nghĩa là một số lượng quan sát khác nhau có thể được sử dụng để tính toán các hệ số tương quan cho mỗi cặp biến.
reg: Nếu thiếu bất kỳ biến nào được liệt kê sau lệnh reg, các quan sát thiếu giá trị đó sẽ bị loại trừ khỏi phân tích (tức là xóa dữ liệu bị thiếu theo listwise, xóa nguyên 1 hàng số liệu).
Đối với các hàm khác, xem thêm hướng dẫn sử dụng Stata để biết thông tin về cách xử lý dữ liệu bị thiếu.
Giá trị thiếu missing values trong câu lệnh gán cộng trừ nhân chia
Điều quan trọng là phải hiểu cách xử lý các giá trị bị thiếu trong các câu lệnh gán. Hãy xem xét ví dụ được hiển thị bên dưới.
gen sum1 = trial1 + trial2 + trial3
Lệnh list bên dưới minh họa cách xử lý các giá trị bị thiếu trong các câu lệnh gán. Biến sum1 dựa trên các biến trial1, trial2 và trial3. Nếu giá trị của bất kỳ biến nào trong số đó bị missing, giá trị cho sum1 được đặt thành missing. Do đó sum1 bị thiếu đối với các quan sát 2, 3, 4 và 7.
Tương tự quy tắc đó, bất cứ khi nào bạn cộng, trừ, nhân, chia, v.v., các giá trị liên quan đến giá trị bị thiếu missing, kết quả sẽ bị thiếu missing.
Như vậy không lẽ không có cách nào tính tổng của hàng, mà không quan tâm các giá trị có bị thiếu? Trong thí nghiệm thời gian phản ứng của chúng ta, tổng thời gian phản ứng sum1 bị thiếu đối với bốn trong số bảy trường hợp. Chúng ta có thể tính tổng dữ liệu cho các thử nghiệm không bị thiếu bằng cách sử dụng hàm rowtotal như được hiển thị trong ví dụ bên dưới.
egen sum2 = rowtotal(trial1 trial2 trial3)
list
Các kết quả dưới đây cho thấy rằng sum2 bây giờ chứa tổng các phép thử không bị thiếu. Trong khi sum1 được tính bằng cách lúc nãy thì không làm được việc đó, như minh họa màu xanh và đỏ bên dưới.
Lưu ý rằng hàm rowtotal coi giá trị missing là giá trị 0. Khi tính tổng một số biến, có thể không hợp lý khi coi số thiếu là 0 nếu thiếu một quan sát trên tất cả các biến được tính tổng. Hàm rowtotal với tùy chọn missing sẽ trả về giá trị bị thiếu nếu thiếu tất cả quan sát trên tất cả các biến. Bạn để ý màu xanh, đỏ bên dưới là hiểu ngay nhé.
egen sum3 = rowtotal(trial1 trial2 trial3) , missing
Các câu lệnh khác hoạt động tương tự. Ví dụ, hãy quan sát điều gì đã xảy ra khi chúng ta cố gắng tạo một biến trung bình mà không sử dụng một hàm (như trong ví dụ bên dưới). Nếu thiếu bất kỳ biến nào trong số các biến trial1, trial2 hoặc trial3, giá trị cho avg1 được đặt thành thiếu.
gen avg1 = (trial1 + trial2 + trial3)/3
Ngoài ra, hàm rowmean tính trung bình dữ liệu cho các thử nghiệm không bị thiếu theo cách tương tự như hàm rowtotal.
egen avg2 = rowmean(trial1 trial2 trial3)
Lưu ý: Nếu có một số lượng lớn các phép thử, chẳng hạn như 50 thử nghiệm, thì sẽ rất khó chịu khi phải nhập avg = rowmean (trial1 trial2 trial3 trial4…). Đây là một cách ngắn gọn bạn có thể sử dụng trong tình huống này:
egen avg3 = rowmean(trial1 – trial3)
Cuối cùng, bạn có thể sử dụng các hàm rowmiss và rownomiss để xác định số lượng giá trị bị thiếu và số lượng giá trị không bị thiếu tương ứng trong danh sách các biến. Điều này được minh họa dưới đây.
egen miss = rowmiss(trial1 – trial3)
egen nomiss = rownonmiss(trial1 – trial3)
list trial1 – trial3 miss nomiss
Hai lệnh này thực chất là đếm số giá trị missing và không missing trong 1 dòng đó. Như vậy tổng của miss+nomiss lúc nào cũng bằng 3,vì mình có 3 biến mà.
Giá trị thiếu missing value trong câu lệnh logic: lớn hơn, bé hơn, bằng, khác
Điều quan trọng là phải hiểu cách xử lý các giá trị bị thiếu missing trong các câu lệnh logic. Ví dụ: giả sử bạn muốn tạo một biến 0/1 cho trial2 là 1 nếu nó > 1.5 và 0 nếu nó <=1.5. Chúng ta hiển thị điều này bên dưới.
gen newvar1 =(trial2 >1.5)
list trial2 newvar1
Các giá trị missing vô tình bị gán là 1, nghĩa là lớn hơn 1.5 luôn, điều này hoàn toàn không đúng ở đây, ở đây mong muốn là biến newvar1 phải là missing nếu giá trị trial2 missing. Vậy tại sao lại thế? Điều này là do Stata coi một giá trị bị thiếu missing value là giá trị lớn nhất có thể (là số vô cực dương).
Bây giờ chúng ta đã hiểu cách Stata xử lý các giá trị bị thiếu, chúng ta sẽ loại trừ các giá trị bị thiếu một cách rõ ràng để đảm bảo chúng được xử lý đúng cách, như được hiển thị bên dưới.
gen newvar2 =(trial2 >1.5) if trial2 !=.
list trial2 newvar1 newvar2
Như bạn có thể thấy trong kết quả Stata bên dưới, biến newvar2 có các giá trị bị thiếu cho các quan sát bị thiếu đối với trial2. Như vậy kết quả hợp lý hơn lúc nãy nhé.
Tóm lại,khi tạo hoặc mã hóa các biến liên quan đến các giá trị bị thiếu, hãy luôn chú ý đến việc liệu biến đó có bao gồm các giá trị bị thiếu hay không. Nếu không sẽ phạm sai lầm nghiêm trọng ra kết quả sai mà không biết tại sao.
Bạn cứ trao đổi thêm với nhóm ở đây, hoặc comment bên dưới nhé.
Liên hệ nhóm thạc sĩ Hỗ trợ Stata.
– SMS, Zalo, Viber:
– Facebook facebook.com/hotroStata
– Email hotrostata@gmail.com