Tag Archives: foreach

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