Category Archives: Stata

Xử lý lỗi chi2 nhỏ hơn 0 khi kiểm định hausman

Kiểm định Hausman là gì?

Kiểm định Hausman được sử dụng để so sánh hai phương pháp ước lượng : mô hình tác động ngẫu nhiên (RE) và mô hình tác động cố định (FE). Kiểm định này kiểm tra xem liệu các ước lượng của RE có phù hợp hơn so với FE hay không. Nếu giá trị p của kiểm định Hausman nhỏ hơn mức ý nghĩa thống kê được chọn (thường là 0,05 hoặc 0,01), thì chúng ta sẽ từ chối giả thuyết không rằng RE là phù hợp và chấp nhận giả thuyết thay thế rằng FE là phù hợp hơn.

Lỗi chi2<0  , chi bình phương bé hơn 0 xuất hiện khi nào.

Sau khi chạy kiểm định hausman, nếu giá trị p<5% thì dĩ nhiên ta chọn mô hình FEM mà không chọn REM. Tuy nhiên có trường hợp xuất hiện lỗi sau:

chi2<0 ==> model fitted on these data fails to meet the asymptotic assumptions of the Hausman test; see suest for a generalized test

Như ảnh dưới:

Để xử lý lỗi này, bạn cần hiểu rõ rằng kiểm định Hausman chỉ có thể được sử dụng khi các giả thuyết phân phối của ước lượng RE và FE đều thoả mãn, và khi đó giá trị thống kê của kiểm định là một giá trị không âm của phân phối chi bình phương (chi-square distribution).

Nếu giá trị chi bình phương (chi-square) trong kiểm định Hausman nhỏ hơn 0, điều này có nghĩa là mô hình không đáp ứng được các giả thuyết phân phối và không đáp ứng được tiêu chuẩn của kiểm định. Trong trường hợp này, bạn không thể sử dụng kiểm định Hausman để so sánh giữa ước lượng RE và FE.

Thay vào đó, bạn có thể sử dụng phương pháp suest (Seemingly Unrelated Estimation) để so sánh ước lượng giữa các mô hình RE và FE. Phương pháp này được sử dụng để kết hợp các mô hình ước lượng phức tạp hơn, giúp tăng độ chính xác của các ước lượng và đưa ra các giả định phù hợp hơn. Suest cung cấp một kiểm định tổng quát hơn để so sánh giữa các mô hình, bao gồm cả RE và FE, mà không yêu cầu giả định phân phối như kiểm định Hausman.

Vì vậy, nếu giá trị chi bình phương của kiểm định Hausman nhỏ hơn 0, bạn có thể sử dụng phương pháp suest để so sánh giữa các mô hình ước lượng RE và FE.

Cách xử lý lỗi chi2 <0 , giá trị p không xuất hiện

Có một số cách khắc phục lỗi này:

1. Thay đổi tăng hoặc giảm số lượng quan sát rồi chạy lại cho đến khi ok.

2. Thay đổi thứ tự tham số trong hausman, ví dụ : hausman fixed random thì đổi thành hausman random fixed. Tuy nhiên cách này sẽ ra được giá trị p, và chỉ để tham khảo chứ không kết luận được dựa vào cách này.

Cách gán dữ liệu thời gian dạng hàng quý, hàng tháng cho bộ số liệu theo thời gian với lệnh xtset và tsset

Nhóm thạc sĩ Bách Khoa giới thiệu đến các bạn câu lệnh gán số liệu thời gian trong các trường hợp chu kì thời gian là tháng, quý, năm nhé.

Cả lệnh xtset và tsset trong Stata đều được sử dụng để thiết lập biến thời gian cho dữ liệu dạng chuỗi thời gian (time series data). Tuy nhiên, chúng được sử dụng cho các loại dữ liệu khác nhau và có một số khác biệt về cách sử dụng.
tsset được sử dụng cho các dữ liệu chuỗi thời gian đơn giản, trong đó thời gian được biểu thị bằng một biến duy nhất, ví dụ như dữ liệu thời gian hàng ngày, hàng tuần, hàng tháng hoặc hàng quý. Để sử dụng tsset, bạn cần chỉ định biến thời gian và định dạng thời gian của biến đó.
xtset được sử dụng cho các dữ liệu panel – dữ liệu bảng – có hai hoặc nhiều biến thời gian, ví dụ như dữ liệu trên thị trường chứng khoán, gồm nhiều công ty, và một công ty có nhiều năm. Trong xtset, cần chỉ định tên biến đại diện cho không gian( ví dụ mã công ty) và biến thời gian.

Gán dữ liệu thời gian dạng hàng quý

Ví dụ: giả sử bạn có tập tin dữ liệu về doanh số bán hàng của một công ty trong 4 quý đầu năm. Các biến trong tập tin dữ liệu bao gồm: quý (QUY) ở dạng 2007q1 2007q2 2007q3 2007q4 2008q1 2008q2 2008q3 2008q4 , và doanh số bán hàng (sales). Để sử dụng lệnh tsset cho dữ liệu này, bạn có thể làm như sau:

gen qdate = quarterly(QUY, "YQ")
format qdate %tq
tsset qdate, quarterly

Gán dữ liệu thời gian dạng hàng tháng

Tháng đang là: Thang: 2009m1,2009m2,…2009m12…

Thì làm như sau:
gen qdate = monthly(Thang, "YM")
format qdate %tm
tsset qdate

Bạn có thể áp dụng các câu lệnh tương tự cho xtset nhé.

Gán dữ liệu thời gian dạng hàng năm

Còn nếu số liệu dạng hàng năm thì quá dễ rồi, câu lệnh như sau:

tsset  YEAR

không cần format, hoặc gen để tạo biến gì cả nhé

Cả xtset và tsset đều có thể được sử dụng để giúp Stata hiểu được cấu trúc dữ liệu của và thực hiện các phân tích liên quan đến chuỗi thời gian hoặc panel data. Chúng là những lệnh quan trọng và hữu ích cho các nhà nghiên cứu và phân tích dữ liệu sử dụng Stata.

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:

phone number

– Facebook  facebook.com/hotroStata

Email  hotrostata@gmail.com

Tải phần mềm Stata 17 miễn phí, cài đặt dễ dàng

Nhóm Thạc Sĩ hướng dẫn  các bạn tải phần mềm Stata 17 phiên bản 64 bít, cài đặt dễ dàng

Các bạn tải phần mềm Stata miễn phí bảng 17 x64  ở  đây

https://mega.nz/file/BiRxkK7K#ZFQF73TstTSfQyD7uj1CqFdByXDq3Krh-LMHBnv53eQ


Sau đó giải nén ra, bấm vào file Setup.exe để chạy chương trình. Cứ thế nhấn next, ok…

Sau khi cài xong thì chép file StataMP-64.exe trong thư mục Cracked exe đè vào file chương trình đã được cài đặt trong ổ C như sau

Sau đó cứ bật chương trình Stata17 lên và sử dụng enjoy it.

Như vậy việc tải và cài đặt Stata 17 miễn phí đã hoàn tất, các bạn có thể sử dụng nhé. Trong quá trình sử dụng các bạn có cần hỗ trợ cứ liên hệ nhóm theo số phone sau nhé

 

Stata các loại biến, các loại mô hình trong dữ liệu bảng data panel

Bốn loại biến cơ bản trong dữ liệu bảng panel data

Có bốn loại biến cơ bản có thể được sử dụng trong mô hình dữ liệu bảng panel data:

  1. Đầu tiên là các biến khác nhau giữa các đơn vị phân tích, nhưng không thay đổi theo thời gian (ví dụ: chủng tộc và giới tính, loại hình công ty hoặc cấp học).
  2. Loại biến thứ hai có thể thay đổi theo thời gian, nhưng giống nhau đối với tất cả các đơn vị phân tích tại bất kỳ khoảng thời gian nhất định nào (ví dụ: các chỉ tiêu kinh tế quốc gia: GDP, lạm phát).
  3. Loại thứ ba là một biến số có thể thay đổi theo cả thời gian và đơn vị phân tích(ví dụ: thu nhập, chi tiêu công ty, thành phần học sinh đi học).
  4. Biến cuối cùng là biến thay đổi theo thời gian theo mô hình có thể dự đoán được (ví dụ: thước đo tuổi hoặc thâm niên,ví dụ năm nay thâm niên 10 năm thì sang năm sau chắc chắn sẽ là 11 năm). Việc bao gồm một số biến, chẳng hạn như những biến thay đổi theo đơn vị nhưng không thay đổi theo thời gian, phụ thuộc vào việc sử dụng các hiệu ứng cố định hay ngẫu nhiên. Những cái khác, chẳng hạn như những cái có yếu tố thời gian sẽ phụ thuộc vào khía cạnh thời gian được diễn giải trong mô hình. Nhưng phân tích dữ liệu bảng có các tùy chọn mà theo đó tất cả các loại biến này có thể được đưa vào một số kiểu như là cố định, ngẫu nhiên….

Các loại mô hình cơ bản trong panel data

Các mô hình dữ liệu bảng panel data có thể được sử dụng cho nhiều loại mô hình, từ đơn giản đến những mô hình có mối quan hệ khá phức tạp. Loại mô hình cơ bản nhất là hồi quy pooled OLS, loại bỏ sự phụ thuộc lẫn nhau giữa các quan sát trong một đơn vị phân tích và ước tính một hệ số chặn và hệ số góc không đổi theo thời gian và đơn vị. Điều này tương đương với việc chạy một mô hình hồi quy cơ bản trong đó biến thời gian bị bỏ qua và tất cả các quan sát được phân tích cùng nhau. Mặc dù mô hình này có vấn đề với việc bỏ qua các phụ thuộc trong cùng 1 đơn vị phân tích( ví dụ 1 công ty), nhưng nó có thể tạo thành một mô hình cơ sở cho các mục đích so sánh. Nhưng ta phải được thận trọng vì các hệ số ước tính có thể cung cấp kết quả sai lệch. Tập hợp các mô hình tiếp theo tập trung vào các mức độ khác nhau của kết quả theo đơn vị phân tích cụ thể, trong đó các hệ số chặn, hệ số hồi quy hoặc cả hai thay đổi theo đơn vị.

Lựa chọn giữa fixed effects và random effects

Sự lựa chọn giữa các hiệu ứng cố định và ngẫu nhiên trong các mô hình bảng chủ yếu tập trung vào sự đánh đổi giữa việc kiểm soát tính nội sinh trong các hiệu ứng cố định với hiệu quả thống kê, nhưng kết quả sai lệch do các tác động ngẫu nhiên. Các tác động cố định cung cấp một cách đơn giản để kiểm soát các biến chưa hoặc không thể đo lường được. Điều này được thực hiện bằng cách phân tích từng đơn vị riêng biệt với các hiệu ứng cố định. Bằng cách này, các biến không quan sát được mà không thay đổi theo thời gian là không đổi trong các khoảng thời gian và do đó không thể có bất kỳ ảnh hưởng nào đến kết quả. Bằng cách sử dụng mỗi đơn vị phân tích cho nó tự kiểm soát riêng và các quan sát có quan hệ các quan sát khác trong nhóm, hầu hết các dạng nội sinh đều bị loại bỏ. Nó không thể giải thích cho các biến không được đo lường thay đổi theo thời gian, nhưng tất cả các dạng khác đều được giải quyết. Hơn nữa, các biến không thay đổi theo đơn vị, chẳng hạn như giới tính, v.v., không thể được phân tích vì chúng không đổi trong khoảng thời gian. Do đó, các hiệu ứng cố định sử dụng sự thay đổi trong nội bộ đơn vị để ước tính tất cả các ảnh hưởng và tăng tính nhất quán với chi phí hiệu quả.

Tuy nhiên, các tác động ngẫu nhiên mang lại một loạt các lợi ích và hạn chế khác nhau. Chúng yêu cầu ít tham số ước tính hơn (chủ yếu bằng cách không ước tính điểm chặn cho mỗi đơn vị) và do đó tăng bậc tự do có sẵn. Ngoài ra, các biến bất biến theo thời gian như giới tính hoặc chủng tộc hiện có thể được đưa vào phân tích. Nhưng tất cả những lợi ích này phải được cân nhắc dựa trên sự sai lệch tiềm năng từ các hiệu ứng nội sinh có thể ảnh hưởng đến các ước tính tác động ngẫu nhiên. Do đó, sự lựa chọn giữa các tác động cố định và ngẫu nhiên là sự đánh đổi giữa việc kiểm soát tính nội sinh so với việc tăng hiệu quả và mở rộng các loại biến.

Tóm lại

Mô hình dữ liệu bảng là một khung phân tích được thiết kế cho một cấu trúc dữ liệu cụ thể ,cross-sectional kết hợp với dữ liệu dọc longitudinal, nói đơn giản là ví dụ có nhiều công ty, mỗi một công ty có nhiều năm , mỗi năm đều có các số liệu của công ty đó thì đó là dữ liệu bảng.

Tác động cố định, ngẫu nhiên, kích cỡ mẫu tối thiểu với data panel

Bài này sẽ ví dụ về biến cố định và biến ngẫu nhiên trong dữ liệu bảng,đồng thời giới thiệu về cỡ mẫu phù hợp khi chạy dữ liệu bảng Stata

Tác động cố định và tác động ngẫu nhiên

Có lẽ khái niệm xa lạ nhất đối với hầu hết các nhà nghiên cứu sử dụng hồi quy là tác động cố định so với ngẫu nhiên. Một điểm khác biệt chung giữa tác động cố định và tác động ngẫu nhiên là tác động cố định được sử dụng cho các tham số tổng thể (tức là một giá trị cố định duy nhất trên toàn bộ tổng thể) và tác động ngẫu nhiên được sử dụng khi biến chỉ đại diện cho một mẫu các tác động có thể xảy ra. Ví dụ, giới tính của học sinh sẽ được giả định là một ảnh hưởng cố định vì không bao giờ thay đổi. Nhưng thông tin  về các lớp học của học sinh được chọn ngẫu nhiên trong một trường học thì sao? Trong tình huống này, một hiệu ứng ngẫu nhiên đối với lớp sẽ xảy ra, ví dụ 2 học sinh học lớp 5A có giới tính là nam, thì sang lớp 6 cũng có giới tính là nam, tuy nhiên 2 học sinh này khi vào lớp 6 thì có thể 2 em vào lớp 6A và 6B, nghĩa là thông tin về lớp học là ngẫu nhiên không cố định.

Cuối cùng, sự lựa chọn giữa các hiệu ứng cố định và ngẫu nhiên như thế nào? Trong khi nhà nghiên cứu nên xem xét tác động của các tác động cố định so với ngẫu nhiên dựa trên các vấn đề đã thảo luận ở trên, thì cũng có một thử nghiệm thực nghiệm để cung cấp hướng dẫn. Kiểm định Hausman so sánh kết quả của mô hình hiệu ứng cố định với kết quả của mô hình hiệu ứng ngẫu nhiên. Mức ý nghĩa p= 0,05 ủng hộ giả thuyết rằng có sự khác biệt giữa hai mô hình và do đó mô hình tác động cố định nên được sử dụng. Nếu không có sự khác biệt đáng kể thì có thể sử dụng mô hình hiệu ứng ngẫu nhiên vì nó được ưu tiên hơn so với mô hình hiệu ứng cố định.

Cỡ mẫu khi chạy dữ liệu bảng

Cỡ mẫu phụ thuộc vào mức độ và dựa trên số lượng đơn vị phân tích. Như hồi quy OLS đơn giản, tất cả mẫu đều được sử dụng. Nhưng khi chúng ta chuyển sang các cấp phân tích cao hơn, đơn vị phân tích sẽ thay đổi thành số nhóm trên mỗi cấp (ví dụ: số lớp học, không phải số học sinh). Hơn nữa, số lượng quan sát mỗi nhóm ít quan trọng hơn số lượng nhóm. Quy mô nhóm từ năm quan sát trở lên có thể chấp nhận được miễn là  số lượng nhóm đủ lớn. Vậy có bao nhiêu nhóm và bao nhiêu quan sát mỗi nhóm là chấp nhận được? Heck và Thomas đề xuất quy tắc 20/30 — ít nhất 20 nhóm và 30 quan sát mỗi nhóm. Hox thay đổi điều này một chút với quy tắc 30/30 — ít nhất 30 nhóm và 30 quan sát cho mỗi nhóm. Tuy nhiên, nhiều tình huống nghiên cứu sẽ khác nhau, vì vậy điều nào là quan trọng nhất cần xem xét? Theo nghĩa thực tế, đó là số lượng các nhóm ở bất kỳ cấp độ nào, vì các nhóm bây giờ là đơn vị quan sát để phân tích. Tốt hơn là nên có 30 nhóm với 10 quan sát mỗi nhóm  hơn 10 nhóm với 60 quan sát mỗi nhóm vì có nhiều nhóm hơn để ước tính các tham số. Vì vậy, việc tăng số lượng nhóm ở bất kỳ cấp độ nào luôn hữu ích cho việc ước tính các ảnh hưởng ở cấp độ đó và tăng sức mạnh thống kê.

Vậy quy mô một nhóm có thể nhỏ đến mức nào?

Quy mô nhóm năm thành viên gặp phải trong nhiều tình huống nghiên cứu và cung cấp các ước tính hợp lý. Hơn nữa, chúng không ảnh hưởng đến sức mạnh của các bài kiểm định vì điều đó đến từ số lượng nhóm. Nhưng quy mô nhóm nhỏ hơn sẽ hạn chế độ chính xác của các bài kiểm tra hệ số ngẫu nhiên (sự khác biệt giữa các nhóm về các hệ số chặn hoặc các biến độc lập).

Cách import số liệu nhập file excel vào stata

Nhóm MBA Bách Khoa hướng dẫn bạn cách đưa file excel vào chương trình Stata để thực hiện phân tích số liệu nhé.

Các bước import số liệu nhập file excel vào stata

Bước 1: Mở chương trình Stata

Bước 2: Vào menu File-Import-Excel Spreadsheet

Bước 3: Bấm nút Browse để chọn file excel, sau đó check vào Import first row as variable names.( nếu file excel có nhiều sheet thì bạn nhớ chọn đúng sheet cần đưa vào ở mục Worksheet nhé)

Sau đó nhấn ok. Là dữ liệu đã được đưa vào Stata rồi nhé

Để kiểm tra lại, bạn có thể gõ lệnh sum để thống kê mô tả các biến để xem đưa vào thành công chưa nhé

Như vậy bạn đã biết cách import số liệu nhập file excel vào stata. Quá trình làm có thắc mắc các bạn cứ liên hệ nhóm nhé.

 

Chuyển dạng số liệu từ số liệu dài thành số liệu rộng, long->wide

Số liệu từ dài sang rộng được minh họa như bên dưới
 

Phần này minh họa sức mạnh và sự đơn giản của Stata trong khả năng định hình lại các file dữ liệu. Những ví dụ này lấy các file số liệu dài và định hình lại chúng thành dạng rộng. Hình minh họa như trên.

Ví dụ 1: reshape 1 biến

Bạn nhập cách lệnh sau vào Stata để tạo bộ số liệu dọc nhé

clear
input famid birth age
1 1 9
1 2 6
1 3 3
2 1 8
2 2 6
2 3 2
3 1 6
3 2 4
3 3 2
end
list

 

Gõ lệnh sau để tạo số liệu ngang

reshape wide age, i ( famid) j (birth)
 

Ví dụ 2: reshape nhiều biến

Bạn nhập cách lệnh sau vào Stata để tạo bộ số liệu nhé

clear
input famid kidname birth age wt sex
1 Beth 1 9 60 f
1 Bob 2 6 40 m
1 Barb 3 3 20 f
2 Andy 1 8 80 m
2 Al 2 6 50 m
2 Ann 3 2 20 f
3 Pete 1 6 60 m
3 Pam 2 4 40 f
3 Phil 3 2 20 m
end
list


Giờ ta sẽ chuyển dữ liệu long về wide như sau
reshape wide kidname age wt sex, i(famid ) j(birth)
list

Và đây là kết quả
 

Ví dụ 3: mã hóa với hậu tố là chuỗi

Nhập lệnh sau để có được số liệu thu nhập của cha và mẹ
clear
input famid str4 name inc str4 dadmom
2 Art 22000 dad
1 Bill 30000 dad
3 Paul 25000 dad
1 Bess 15000 mom
3 Pat 50000 mom
2 Amy 18000 mom
end
list

 

Nhập lệnh sau nhé:

reshape wide name inc, i(famid) j(dadmom) string

Và đây là kết quả

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:

phone number

– Facebook  facebook.com/hotroStata

Email  hotrostata@gmail.com

Chuyển dạng số liệu từ số liệu rộng thành số liệu dài, wide->long trong Stata

Phần này minh họa sức mạnh (và sự đơn giản) của Stata trong khả năng định hình lại các file dữ liệu. Những ví dụ này lấy các file số liệu rộng và định hình lại chúng thành dạng số liệu dài.

Trước mắt cần hiểu số liệu rộng wide là gì? Số liệu dài long là gì? Như ví dụ hình dưới, số liệu rộng là số liệu thu nhập income các năm khác nhau là các biến khác nhau, còn số liệu dài là số liệu thu nhập income các năm khác nhau là các dòng khác nhau.

Định hình lại dữ liệu từ rộng thành dài

Ví dụ 1(i có một tham số)

Hãy nhập dữ liệu thu nhập của gia đình bên dưới theo câu lệnh
clear
input famid faminc96 faminc97 faminc98
3 75000 76000 77000
1 40000 40500 41000
2 45000 45400 45800
end

 

Đây là thu nhập của hộ gia đình ở 3 năm 1996, 1997, 1998
Bây giờ sẽ chuyển dữ liệu lại, giá trị năm không nằm ở hàng ngang nữa mà nằm dạng cột dọc như ví dụ sau, vậy ta cần làm gì?
 

Các bạn gõ lệnh sau là bộ số liệu sẽ ra kết quả như mong muốn
reshape long faminc , i(famid) j(year)
Muốn quay lại như cũ bạn chỉ cần gõ lệnh
reshape wide

Ví dụ 2 (i có hai tham số)

Ta nhập số liệu như sau để có số liệu
clear
input famid birth ht1 ht2
1 1 2.8 3.4
1 2 2.9 3.8
1 3 2.2 2.9
2 1 2 3.2
2 2 1.8 2.8
2 3 1.9 2.4
3 1 2.2 3.3
3 2 2.3 3.4
3 3 2.1 2.9
end

 

Ta có số liệu về chiều cao lúc 1 tuổi và chiều cao lúc 2 tuổi của các trẻ em, giờ ta sẽ chuyển về số liệu dọc long nhé
reshape long ht,i(famid birth) j(age)
Lưu ý là tham số của i phải là khóa chính, nghĩa là không được trùng, nên ở đây cần kết hợp hai giá trị famid và birth để tạo thành giá trị của i.
Kết quả như sau:
 

Ví dụ 3(i có hai tham số và mã hóa cho 2 biến luôn)

Ta nhập số liệu như sau để có số liệu
clear
input famid birth ht1 ht2 wt1 wt2
 1 1 2.8 3.4 19 28
 1 2 2.9 3.8 21 28
 1 3 2.2 2.9 20 23
 2 1 2 3.2 25 30
 2 2 1.8 2.8 20 33
 2 3 1.9 2.4 22 33
 3 1 2.2 3.3 22 28
 3 2 2.3 3.4 20 30
 3 3 2.1 2.9 22 31
end

Ở đây số liệu tương tự ví dụ 2, và có thêm giá trị cân nặng lúc 1 tuổi và 2 tuổi. Bây giờ ta sẽ dùng lệnh sau để chuyển thành dữ liệu dọc long nhé.
reshape long ht wt, i ( famid birth) j ( age)
Kết quả như sau:
 

Ví dụ 4: hậu tố là chữ, không phải số

Các ví dụ ở trên thì các hậu tố đều là số, ví dụ 1 tuổi 2 tuổi, còn nếu là chữ thì ví dụ này sẽ xử lý như sau:
 

Ví dụ này là có tên cha tên mẹ, tiền lương của cha và tiền lương của mẹ.
clear
input famid str4 ten_cha tien_cha str4 ten_me tien_me
1 Bill 30000 Bess 15000
2 Art 22000 Amy 18000
3 Paul 25000 Pat 50000
end
list
reshape long ten_ tien_, i( famid) j(chame) string
list

Tóm lại cú pháp lệnh reshape long như sau

reshape long stem-of-wide-vars, i(wide-id-var) j(var-for-suffix)

  • stem-of-wide-vars: là gốc của các biến rộng, ví dụ: faminc
  • wide-id-var là biến xác định tính duy nhất của số liệu, ví dụ famid
  • var-for-suffix là biến sẽ chứa hậu tố của các biến số rộng, ví dụ: năm

 

Cách ghép nối file dữ liệu Stata bằng lệnh merge và append

Bạn có nhiều bộ số liệu, với các cột giống nhau cần gom lại. Hoặc là bạn có nhiều bộ số liệu, tuy các cột không giống nhau hoàn toàn nhưng các cột đó có quan hệ với nhau và cần gom lại, thì bài này là giải pháp dành cho bạn với 2 lệnh cực kì mạnh để xử lý kết nối file là mergeappend.

Lệnh merge thì thường dùng để kết nối file theo chiều ngang( nghĩa là thêm cột,ví dụ 2 bộ số liệu, mỗi bộ có 3 biến, thì bộ số liệu cuối cùng có thể có 4-5-6 biến), còn lệnh append thì thường dùng để ghép nối file theo chiều dọc( nghĩa là 2 bộ số liệu mỗi bộ có 100 quan sát, bộ số liệu cuối cùng có thể có 200 quan sát).
Stata chỉ có thể hiển thị một tập dữ liệu tại một thời điểm. Tập dữ liệu đang được hiển thị, đang được sử dụng, được gọi là dữ liệu chủ master. Bộ dữ liệu bạn muốn nối vào được gọi là dữ liệu using. Lệnh append ghép nối file dữ liệu dựa trên tên biến và lệnh merge ghép nối file dữ liệu dựa trên giá trị của biến.
Khi bạn có hai file dữ liệu, bạn có thể muốn kết hợp chúng bằng cách xếp chồng chúng lên nhau.

Ví dụ lệnh append

Bây giờ sẽ là ví dụ minh họa. Ta sẽ tạo 2 bộ số liệu sau đó sẽ ghép lại với nhau theo chiều dọc nhé( dùng lệnh append)
Lệnh sau dùng tạo file số liệu chứa mã hộ và tên cha
input famid str4 name inc
2 "Art" 22000
1 "Bill" 30000
3 "Paul" 25000
end
save dads, replace
list

 

Lệnh sau dùng tạo file số liệu chứa mã hộ và tên mẹ
clear
input famid str4 name inc
1 "Bess" 15000
3 "Pat" 50000
2 "Amy" 18000
end
save moms, replace
list

 

2 bộ số liệu mỗi bộ có 3 dòng, giờ sẽ gộp lại thành 1 bộ có 6 dòng nhé
use dads, clear
append using moms

 

Như vậy 3 dòng số liệu màu đỏ là của bộ số liệu dads, 3 dòng màu xanh là của bộ số liệu moms, tất cả đã được Stata gom lại thành 1 file duy nhất, bây giờ bạn có thể lưu lại thành file mới sau khi sử dụng lệnh append rồi nhé.

Ví dụ lệnh merge

Ghép file dạng 1:1

Bây giờ tạo một file mới chứa thu nhập của hộ gia đình:
clear
input famid faminc96 faminc97 faminc98
3 75000 76000 77000
1 40000 40500 41000
2 45000 45400 45800
end
save faminc, replace
list

 

Giờ ta sẽ dùng lệnh merge để thêm các thông tin về thu nhập của hộ gia đình vào file dads ở ví dụ trên nhé.
clear
use dads
merge 1:1 famid using faminc.dta
list

 
Như vậy các cột màu đỏ đã được thêm vào bộ số liệu, với khóa ở đây là mã số của hộ gia đình famid
Lệnh merge 1:1, có nghĩa là ghép vào dạng đơn giản, còn dưới dây là dạng phức tạp hơn, bây giờ file dads sẽ được ghép vào với file con cái.

Ghép file dạng 1:nhiều

Trước tiên ta tạo file danh sách các con nhé
clear
input famid str4 kidname birth age wt str1 sex
1 "Beth" 1 9 60 "f"
2 "Andy" 1 8 40 "m"
3 "Pete" 1 6 20 "f"
1 "Bob" 2 6 80 "m"
1 "Barb" 3 3 50 "m"
2 "Al" 2 6 20 "f"
2 "Ann" 3 2 60 "m"
3 "Pam" 2 4 40 "f"
3 "Phil" 3 2 20 "m"
end
save kids3

 

Sau đó ta ghép các con này vào danh sách các người cha lúc nãy
clear
use dads
merge 1:m famid using kids3
list

 

Các cột màu đỏ chính là danh sách các con của các ông bố này nhé. Như vậy bộ số liệu stata đã được ghép theo dạng 1:m, nói cách khác là 1:nhiều, nghĩa là một gia đình, 1 ông bố có nhiều đứa con.

Ghép file dạng nhiều:1

Bây giờ ta làm việc tương tự, nhưng ta sẽ chọn file chủ là file kids, file được chọn thêm là file dads. Vì một ông bố có nhiều con nên cú pháp sẽ là như sau:
clear
use kids3
merge m:1 famid using dads
list

 

Cột đỏ chính là các thông tin về cha của đứa trẻ các bạn nhé.

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:

phone number

– Facebook  facebook.com/hotroStata

Email  hotrostata@gmail.com

Lệnh foreach để thực hiện các vòng lặp dữ liệu trên Stata

Nhóm ThS Bách Khoa minh họa:

  • Cách tạo và mã hóa lại các biến theo cách thủ công.
  • Cách sử dụng lệnh foreach để dễ dàng quá trình tạo và mã hóa các biến.
  • Sử dụng lệnh foreach để so sánh giữa các biến

Hãy xem xét chương trình mẫu dưới đây, chương trình này đọc dữ liệu thu nhập trong mười hai tháng.
input famid inc1-inc12
1 3281 3413 3114 2500 2700 3500 3114 3319 3514 1282 2434 2818
2 4042 3084 3108 3150 3800 3100 1531 2914 3819 4124 4274 4471
3 6015 6123 6113 6100 6100 6200 6186 6132 3123 4231 6039 6215

end
list

 

Cách tạo và mã hóa lại các biến theo cách thủ công.

Bây giờ sử dụng cách tính toán các biến thủ công để tính toán thuế cho từng tháng
Giả sử chúng tôi muốn tính số tiền thuế (10%) phải trả cho mỗi tháng, cách đơn giản nhất để làm điều này là tính 12 biến (taxinc1-taxinc12) bằng cách nhân mỗi biến trong số (inc1-inc12) với 10% như minh họa phía dưới. Như bạn thấy, điều này yêu cầu nhập lệnh tính thuế cho mỗi tháng dữ liệu (từ tháng 1 đến tháng 12) thông qua lệnh generate như sau:
generate taxinc1 = inc1 * .10
generate taxinc2 = inc2 * .10
generate taxinc3 = inc3 * .10
generate taxinc4 = inc4 * .10
generate taxinc5 = inc5 * .10
generate taxinc6 = inc6 * .10
generate taxinc7 = inc7 * .10
generate taxinc8 = inc8 * .10
generate taxinc9 = inc9 * .10
generate taxinc10= inc10 * .10
generate taxinc11= inc11 * .10
generate taxinc12= inc12 * .10

Có 12 biến mới đã được tạo ra giá trị bằng 10% của các biến gốc nhé
 

Tính toán các biến tự động sử dụng lệnh foreach

Một cách khác để tính toán 12 biến đại diện cho số thuế đã nộp (10%) cho mỗi tháng là sử dụng lệnh foreach. Trong ví dụ dưới đây, chúng tôi sử dụng lệnh foreach để chạy vòng lặp qua các biến inc1 đến inc12 và tính thu nhập chịu thuế là thueinc1 – taxinc12.
foreach var of varlist inc1-inc12{
 generate thue`var'=`var'*.10
 }

Có 12 biến mới đã được tạo ra giá trị bằng 10% của các biến gốc nhé
 

Câu lệnh foreach ban đầu cho Stata biết rằng chúng ta muốn lặp qua các biến inc1 đến inc12. Lần đầu tiên chúng ta duyệt qua các câu lệnh, giá trị của var sẽ là inc1 và lần thứ hai giá trị của var sẽ là inc2 và cứ tiếp tục như vậy cho đến lần lặp cuối cùng trong đó giá trị của var sẽ là inc12. Mỗi câu lệnh trong vòng lặp (trong trường hợp này, chỉ một câu lệnh tạo) được đánh giá và thực thi. Khi chúng ta ở bên trong vòng lặp foreach, chúng ta có thể truy cập giá trị của var bằng cách đặt nó bằng dấu ngoặc kép như thế này là `var '. Dấu `là ngay bên dưới dấu ~ trên bàn phím của bạn và dấu ' là bên dưới dấu " trên bàn phím của bạn. Lần đầu tiên qua vòng lặp, `var 'được thay thế bằng inc1, vì vậy câu lệnh
generate thue`var' = `var' * .10
trở thành
generate thueinc1 = inc1 * .10
Điều này được lặp lại cho inc2 và sau đó inc3 và như vậy cho đến inc12. Vì vậy, vòng lặp foreach này tương đương với việc thực hiện 12 câu lệnh tạo theo cách thủ công, nhưng dễ dàng hơn và ít bị lỗi hơn nhiều.

Thêm một ví dụ khác:

Bây giờ sẽ tính tổng thu nhập theo từng quý, cách làm thủ công như sau:
generate incqtr1 = inc1 + inc2 + inc3
generate incqtr2 = inc4 + inc5 + inc6
generate incqtr3 = inc7 + inc8 + inc9
generate incqtr4 = inc10+ inc11+ inc12
list incqtr1 – incqtr4

Cách làm tự động như sau
foreach qtr of numlist 1/4 {
 local m3 = `qtr'*3
 local m2 = (`qtr'*3)-1
 local m1 = (`qtr'*3)-2
 generate incqtr`qtr' = inc`m1' + inc`m2' + inc`m3'
}
list incqtr1 – incqtr4

Ý nghĩa lệnh này: sẽ lặp biến qtr từ 1 đến 4 , trong mỗi vòng lặp đó thì tính tổng thu nhập của quý đó.
Trong ví dụ này, chỉ với 4 quý dữ liệu, có lẽ sẽ dễ dàng hơn nếu bạn chỉ cần viết ra 4 câu lệnh tạo theo cách thủ công, tuy nhiên nếu bạn có 40 quý dữ liệu, thì vòng lặp foreach có thể giúp bạn tiết kiệm đáng kể thời gian, công sức và những sai lầm.

Sử dụng lệnh foreach để so sánh giữa các biến

Lệnh foreach cũng có thể được sử dụng để xác định các mối quan hệ trên các biến của tập dữ liệu. Ví dụ, giả sử một người cần biết tháng nào có thu nhập nhỏ hơn thu nhập của tháng trước. Để có được thông tin này, các biến giả có thể được tạo ra để cho biết điều này xảy ra vào những tháng nào. Khi một tháng có thu nhập nhỏ hơn thu nhập của tháng trước, các chỉ số giả lowinc2-lowinc12 sẽ được gán "1". Khi trường hợp này không xảy ra, chúng được gán "0". Chương trình này được minh họa bên dưới (lưu ý để đơn giản, chúng tôi giả sử dữ liệu về thu nhập không bị missing thiếu).
foreach curmon of numlist 2/12 {
 local lastmon = `curmon' – 1
 generate lowinc`curmon' = 1 if ( inc`curmon' < inc`lastmon' )
 replace lowinc`curmon' = 0 if ( inc`curmon' >= inc`lastmon' )
}

 
Do đó lệnh này rất hữu ích, tưởng tượng không phải là 12 tháng mà là 120 tháng thì viết câu lệnh thủ công sẽ cực biết nhường nào.

Tóm lại, lệnh foreach rất hữu ích khi bạn cần thực hiện các vòng lặp, qua một số lượng biến quan sát nhiều, chỉ cần đầu tư viết vài dòng lệnh thì hiệu quả đạt được chắc chắn làm bạn hài lòng.

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:

phone number

– Facebook  facebook.com/hotroStata

Email  hotrostata@gmail.com