Programming Stata
Bagian ini adalah pengenalan lembut untuk pemrograman Stata. Kami membahas macro dan loop , dan menunjukkan bagaimana menulis sendiri (sederhana) program Anda. Ini adalah topik besar dan semua kita bisa berharap untuk lakukan di sini adalah memberikan beberapa tips yang mudah-mudahan akan memicu minat Anda dalam penelitian lebih lanjut. Namun, materi yang dibahas akan membantu Anda menggunakan Stata lebih efektif.
Stata 9 memperkenalkan bahasa pemrograman matriks baru dan sangat kuat yang disebut Mata . Ini meluas alat programmer baik di luar alat substitusi makro dibahas di sini, tapi Mata adalah subjek yang layak perawatan yang terpisah. Usaha Anda di sini tidak akan sia-sia, namun, karena Mata melengkapi, bukan pengganti yang lengkap untuk, pemrograman Stata klasik.
Untuk mempelajari lebih lanjut tentang program Stata Anda harus membaca Bab 18 di Panduan Pengguna dan kemudian merujuk pada Programming volume dan / atau bantuan online yang diperlukan. Kolom rutin nick Cox dalam Stata Journal adalah sumber daya yang indah untuk belajar tentang Stata. Sumber lainnya yang terdaftar dalam Bagian 1 dari tutorial ini.
1. Makro
Sebuah makro hanyalah sebuah nama yang terkait dengan beberapa teks. Makro dapat lokal atau dalam lingkup global.
1.1 Menyimpan Text di Macro lokal
Macro lokal memiliki nama hingga 31 karakter dan hanya dikenal dalam konteks saat ini (konsol, file do, atau program).
Anda mendefinisikan makro lokal menggunakan local name [=] text
dan Anda mengevaluasi menggunakan`name'
. (Catatan penggunaan backtick atau kutipan kiri.)
Varian pertama, tanpa tanda sama, digunakan untuk menyimpan teks yang sewenang-wenang hingga ~ 64k karakter (sampai satu juta di stata SE). teks sering tertutup dalam tanda kutip, tetapi tidak harus.
Anda perlu menjalankan sekelompok persamaan regresi yang mencakup satu set standar variabel kontrol, mengatakan age
, agesq
, education
, dan income
. Anda bisa, tentu saja, ketik nama-nama ini di setiap persamaan, atau Anda bisa memotong dan menyisipkan nama, tapi alternatif ini membosankan dan rawan kesalahan. Cara cerdas adalah untuk mendefinisikan makro
local controls age agesq education income
Anda kemudian ketik perintah seperti
regress outcome treatment `controls'
yang dalam hal ini adalah persis sama dengan mengetik regress outcome treatment age agesq education income
.
Jika hanya ada satu regresi untuk menjalankan Anda belum menyimpan apa-apa, tetapi jika Anda harus menjalankan beberapa model dengan hasil atau perlakuan yang berbeda, makro menyimpan pekerjaan dan menjamin konsistensi.
Pendekatan ini juga memiliki keuntungan bahwa jika nanti penasihat Anda menegaskan bahwa Anda harus menggunakan log-laba daripada pendapatan sebagai kontrol, semua yang perlu Anda lakukan adalah mengubah definisi makro di bagian atas file do Anda, mengatakan untuk membaca logincome
sebaliknya dari income
dan semua model berikutnya akan berjalan dengan penghasilan benar login (dengan asumsi variabel ini ada).
Peringatan : Mengevaluasi makro yang tidak ada bukan kesalahan; itu hanya mengembalikan sebuah string kosong.Jadi hati-hati untuk mengeja nama makro dengan benar. Jika Anda mengetik regress outcome treatment `contrls'
, Stata akan membaca regress outcome treatment
, karena makro contrls
tidak ada. Hal yang sama akan terjadi jika Anda mengetik `control'
karena nama makro tidak dapat disingkat jalan nama variabel bisa.Either way, regresi akan berjalan tanpa kontrol. Tapi Anda selalu memeriksa output Anda, bukan?
Misalkan Anda bekerja dengan survei demografi di mana usia telah dikelompokkan dalam kelompok lima tahun dan berakhir diwakili oleh tujuh dummies, mengatakan age15to19
untuk age45to49
, enam di antaranya akan digunakan dalam regresi Anda. Mendefinisikan makro
local age "age20to24 age25to29 age30to34 age35to39 age40to44 age45to49"
dan kemudian dalam model regresi Anda menggunakan sesuatu seperti
regress ceb `age' urban
yang tidak hanya lebih pendek dan lebih mudah dibaca, tetapi juga lebih dekat dengan apa yang Anda berniat, yang untuk mundur ceb
pada "usia", yang kebetulan menjadi sekelompok dummies. Hal ini juga membuat lebih mudah untuk mengubah representasi usia; jika Anda kemudian memutuskan untuk menggunakan linear dan hal kuadrat bukannya enam dummies semua yang Anda lakukan adalah menentukan local age "age agesq"
dan jalankan kembali model Anda. Perhatikan bahwa kejadian pertama age
di sini adalah nama makro dan yang kedua adalah nama variabel. Saya menggunakan tanda petik untuk membuat kode lebih jelas. Stata tidak pernah jadi bingung.
Catatan pada macro Bersarang. Jika makro meliputi evaluasi makro, ini diselesaikan pada saat makro dibuat, tidak ketika dievaluasi. Misalnya jika Anda mendefinisikan local controls `age' income education
. Stata melihat bahwa itu termasuk age
dan mengganti nilai saat age
. Mengubah isi dari makro age
di lain waktu tidak mengubah isi makro controls
.
Ada, Namun, cara untuk mencapai efek tertentu. Caranya adalah dengan melarikan diri karakter evaluasi makro ketika Anda mendefinisikan makro, mengetik local controls \`age' income education
. Sekarang Stata tidak mengevaluasi makro (tapi makan karakter escape), sehingga isi controls
menjadi `age' income education
.Ketika controls
makro dievaluasi, Stata melihat bahwa itu termasuk makro age
dan pengganti isinya saat ini.
Dalam satu kasus substitusi terjadi ketika makro didefinisikan, di lain ketika dievaluasi.
1.2 Menyimpan Hasil di Macro lokal
Tipe kedua definisi makro local name = text
, Dengan tanda sama dengan digunakan untuk menyimpan hasil . Ini menginstruksikan Stata untuk mengobati teks pada sisi kanan sebagai ekspresi, mengevaluasi, dan menyimpan representasi teks hasilnya dengan nama yang diberikan.
Misalkan Anda hanya menjalankan regresi dan ingin menyimpan hasil R-squared, untuk perbandingan dengan regresi kemudian. Anda tahu bahwa regress
toko R-squared di e(r2)
, sehingga Anda berpikir local rsq e(r2)
akan melakukan trik.
Tapi itu tidak. Makro Anda disimpan formula e(r2)
, seperti yang Anda lihat dengan mengetik display "`rsq'"
.Apa yang Anda butuhkan untuk menyimpan adalah nilai. Solusinya adalah dengan mengetik local rsq = e(r2)
, dengan tanda sama. Hal ini menyebabkan Stata untuk mengevaluasi ekspresi dan menyimpan hasilnya.
Untuk melihat perbedaan coba ini
sysuse auto, clear regress mpg weight local rsqf e(r2) local rsqv = e(r2) di `rsqf' // this has the current R-squared di `rsqv' // as does this regress mpg weight foreign di `rsqf' // the formula has the new R-squared di `rsqv' // this guy has the old one
Cara lain untuk memaksa evaluasi adalah untuk menyertakan e(r2)
tanda kutip tunggal ketika Anda mendefinisikan makro. Ini disebut ekspresi makro , dan juga berguna ketika Anda ingin menampilkan hasil. Hal ini memungkinkan kita untuk mengetik display "R-squared=`rsqv'"
bukan display "R-squared=" `rsq'
. (Apa yang Anda pikir akan terjadi jika Anda mengetik display "``rsqf''"
?)
Cara alternatif untuk menyimpan hasil untuk kemudian digunakan adalah dengan menggunakan skalar (tipe help scalars
untuk mempelajari lebih lanjut.) Ini memiliki keuntungan bahwa Stata menyimpan hasil dalam bentuk biner tanpa kehilangan presisi. Sebuah toko makro representasi teks yang baik hanya untuk sekitar 8 digit. Downside adalah bahwa skalar berada di namespace global, sehingga ada potensi konflik nama, khususnya dalam program (kecuali jika Anda menggunakan nama sementara, yang kita bahas nanti).
Anda dapat menggunakan tanda sama ketika Anda menyimpan teks, tapi biarkan aku memberitahu mengapa hal ini tidak selalu ide yang baik. Kita bisa mengatakan local controls = "age agesq education income"
dan ini akan bekerja. Perhatikan penggunaan tanda kutip untuk memastikan bahwa sisi kanan adalah ekspresi, dalam hal ini string. Dan di situlah letak masalahnya: string dibatasi untuk 244 karakter (digunakan untuk menjadi 80 di Intercooler Stata sebelum 9.1), sedangkan teks makro bisa lebih lama seperti disebutkan di atas (tipe help limits
diingatkan).
1.3 Keyboard Pemetaan dengan Global Macro
Makro global yang memiliki nama hingga 32 karakter dan, seperti namanya menunjukkan, memiliki lingkup global.
Anda mendefinisikan makro global yang menggunakan global name [=] text
dan mengevaluasi menggunakan$name
. (Anda mungkin perlu menggunakan ${name}
untuk memperjelas di mana nama berakhir.)
Saya sarankan Anda menghindari makro global karena potensi konflik nama. Sebuah aplikasi yang berguna, bagaimanapun, adalah untuk memetakan fungsi tombol pada keyboard Anda. Jika Anda bekerja pada folder jaringan bersama dengan nama yang panjang mencoba sesuatu seperti ini
global F5 \\server\shared\research\project\subproject\
Kemudian ketika anda menekan F5 Stata akan mengganti nama lengkap. Dan Anda do file dapat menggunakan perintah seperti do ${F5}dofile
. (Kita perlu kawat gigi untuk menunjukkan bahwa makro disebut F5
, tidakF5dofile
.)
Jelas Anda tidak ingin mengetik makro ini setiap kali Anda menggunakan Stata. Larutan? Masukkan dalam Andaprofile.do
berkas, satu set perintah yang dieksekusi setiap kali Anda menjalankan Stata. Profil Anda terbaik disimpan di direktori start-up Stata ini, biasanya C:\data
. Ketik help profilew
untuk mempelajari lebih lanjut.
1.4 Lebih lanjut tentang Macro
Macro juga dapat digunakan untuk memperoleh dan menyimpan informasi tentang sistem atau variabel dalam dataset Anda menggunakan fungsi makro diperpanjang . Misalnya Anda dapat mengambil label variabel dan nilai, fitur yang bisa berguna dalam pemrograman.
Ada juga perintah untuk mengelola koleksi macro, termasuk macro list
dan macro drop
. Ketik help macro
untuk mempelajari lebih lanjut.
2. Perulangan
Loop yang digunakan untuk melakukan tugas yang berulang. Stata memiliki perintah yang memungkinkan perulangan lebih dari urutan nomor dan berbagai jenis daftar, termasuk daftar variabel.
Sebelum kita mulai, namun, jangan lupa bahwa Stata melakukan banyak perulangan dengan sendirinya. Jika Anda ingin menghitung log pendapatan, Anda dapat melakukannya di Stata dengan satu baris:
gen logincome = log(income)
Ini loop secara implisit atas semua pengamatan, menghitung log dari setiap pendapatan, dalam apa yang kadang-kadang disebut vektoralisasi operasi. Anda bisa kode loop sendiri, tetapi Anda harus bukan karena (i) Anda tidak perlu, dan (ii) kode Anda akan jauh lebih lambat yang Stata built-in lingkaran.
2.1 Looping Lebih Urutan Nomor
Perintah perulangan dasar mengambil bentuk
forvalues number = sequence { ... body of loop using `number' ... }
Berikut forvalues
adalah kata kunci, number
adalah nama dari makro lokal yang akan ditetapkan untuk setiap nomor dalam urutan, dan sequence
merupakan rentang nilai yang dapat memiliki bentuk
min/max
untuk menunjukkan urutan angka darimin
kemax
dalam langkah-langkah dari satu, misalnya1/3
hasil 1, 2 dan 3, ataufirst(step)last
yang menghasilkan urutan darifirst
kelast
dalam langkah-langkah dari ukuranstep
. Misalnya15(5)50
menghasilkan 15,20,25,30,35,40,45 dan 50.
(Ada dua cara lain untuk menentukan jenis kedua berurutan, tapi saya menemukan satu yang tercantum di sini yang paling jelas, lihat help forvalues
untuk alternatif.)
Pembukaan meninggalkan brace harus menjadi hal terakhir pada baris pertama (selain komentar), dan loop harus ditutup oleh gol tepat pencocokan pada garis dengan sendirinya. Loop dijalankan sekali untuk setiap nilai dalam urutan dengan makro setempat number
(atau apa pun yang Anda menyebutnya) memegang nilai.
Berikut cara favorit saya untuk menciptakan variabel dummy untuk mewakili kelompok umur. Anda bisa, tentu saja, kelompok usia ke dalam interval lima tahun dan kemudian menggunakan tabulage ageg, gen(ageg)
untuk memiliki Stata menghasilkan dummies, tapi cepat, apa ageg3
? Berikut ini adalah alternatif yang mengarah ke nama variabel yang lebih baik:
forvalues bot = 20(5)45 { local top = `bot' + 4 gen age`bot'to`top' = age >= `bot' & age <= `top' }
Ini akan membuat variabel dummy age20to24
untuk age45to49
. (By the way age25to29
adalah sama ageg3
. Yang jelas?) Cara loop bekerja adalah bahwa makro lokal bot
akan mengambil nilai antara 20 dan 45 dalam langkah 5 (maka 20, 25, 30, 35, 40, dan 45) , batas bawah dari kelompok usia.
Di dalam loop kita membuat makro lokal top
untuk mewakili batas atas dari kelompok usia yang sama dengan batas bawah ditambah 4. Pertama kali melalui loop bot
adalah 20, sehingga top
adalah 24. Kami menggunakan tanda sama untuk menyimpan hasil penambahan 4 sampai bot
.
Baris berikutnya adalah sederhana menghasilkan pernyataan. Pertama kali melalui loop line akan mengatakan gen age20to24 = age >= 20 & age <= 24
, seperti yang Anda lihat dengan melakukan substitusi makro sendiri. Ini akan membuat boneka pertama, dan Stata kemudian akan kembali ke atas untuk membuat yang berikutnya.
2.2 Looping Selama Elemen di Daftar Suatu
Perintah perulangan kedua adalah foreach
dan datang dalam enam rasa, berurusan dengan berbagai jenis daftar.Saya akan mulai dengan daftar generik:
foreach item in a-list-of-things { ... body of loop using `item' ... }
Berikut foreach
adalah kata kunci, item
adalah nama makro lokal pilihan Anda sendiri, in
adalah kata kunci yang lain, dan apa yang terjadi setelah ini adalah daftar kata-kata kosong yang dipisahkan. Coba contoh ini
foreach animal in cats and dogs { display "`animal'" }
Lingkaran ini akan mencetak "kucing", "dan", dan "anjing", sebagai makro lokal animal
diatur ke masing-masing kata dalam daftar. Stata tidak tahu "dan" bukan hewan, tetapi bahkan jika itu terjadi, itu tidak akan peduli karena daftar generik.
Jika Anda ingin loop atas urutan teratur dari nomor misalnya Anda harus melakukan sesuatu dengan Coale-Demeny model daerah tabel hidup untuk tingkat 2, 6 dan 12-- Anda bisa menulis
foreach level in 2 6 12 { ... do something with `level' ... }
Itu dia. Ini mungkin semua yang perlu Anda ketahui tentang perulangan.
2.3 Daftar Looping Selama Khusus
Stata memiliki lima varian lain dari foreach
yang loop atas tipe tertentu dari daftar yang sekarang saya jelaskan secara singkat.
foreach varname of varlist list-of-variables { ... body of loop using `varname' ... }
Berikut foreach
, of
dan varlist
adalah kata kunci, dan harus diketik persis seperti mereka. The list-of-variables
hanya itu, daftar yang ada nama variabel diketik menggunakan konvensi Stata standar, sehingga Anda dapat menyingkat nama (di risiko Anda sendiri), gunakan var*
untuk merujuk pada semua variabel yang dimulai dengan "var", atau ketik var1-var3
untuk merujuk pada variabel var1
untuk var3
.
Keuntungan dari lingkaran ini selama generik setara foreach varname in list-of-variables
adalah bahwa Stata memeriksa bahwa setiap nama dalam daftar memang sebuah nama variabel yang ada, dan memungkinkan Anda menyingkat atau memperluas nama.
Jika Anda perlu loop atas baru yang bertentangan dengan yang ada variabel menggunakan foreach varname of newlist list-of-new-variables
. The newlist
kata kunci menggantikan varlist
dan memberitahu Stata untuk memeriksa bahwa semua elemen daftar nama-nama hukum dari variabel yang tidak ada sudah.
Dua varian lainnya loop atas kata-kata dalam makro lokal atau global; mereka menggunakan kata kunciglobal
atau local
diikuti dengan nama makro (sebagai pengganti daftar). Sebagai contoh di sini adalah cara untuk daftar variabel kontrol dari bagian atas macro lokal:
foreach control of local controls { display "`control'" }
Mungkin Anda akan melakukan sesuatu yang lebih menarik daripada hanya daftar nama variabel. Karena kita perulangan lebih variabel dalam dataset kita bisa mencapai tujuan yang sama menggunakan foreach
denganvarlist
; di sini kita simpan pengecekan.
Stata juga memiliki foreach
varian yang mengkhususkan diri dalam daftar nomor (atau numlists
di Stataspeak) yang tidak dapat ditangani dengan forvalues
.
Misalkan survei memiliki data dasar pada tahun 1980 dan tindak lanjut pada tahun 1985 dan 1995. (Mereka benar-benar direncanakan survei pada tahun 1990 tapi itu tidak didanai.) Untuk loop atas ini Anda bisa menggunakan
foreach year of numlist 1980 1985 1995 { display "`year'" }
Tentu saja Anda akan melakukan sesuatu yang lebih menarik dari sekedar mencetak tahun. Numlist bisa ditetapkan sebagai 1 2 3
, atau 1/5
(artinya 1 2 3 4 5), atau 1(2)7
(menghitung dari 1 sampai 7 di langkah 2 untuk mendapatkan 1 3 5 7); ketik help numlist
untuk lebih banyak contoh.
Keuntungan dari perintah ini selama generik foreach
adalah bahwa Stata akan memeriksa bahwa setiap elemen dari daftar nomor memang angka.
2.4 Looping untuk Sementara
Secara umum dengan banyak bahasa pemrograman, Stata juga memiliki while
lingkaran, yang memiliki struktur sebagai berikut
while condition { ... do something ... }
dimana kondisi adalah ekspresi. loop mengeksekusi selama kondisi benar (bukan nol). Biasanya terjadi sesuatu di dalam loop untuk membuat kondisi palsu, jika kode akan berjalan selamanya.
Sebuah penggunaan khas while
adalah dalam prosedur estimasi berulang, di mana Anda dapat loop sementara perbedaan perkiraan berturut melebihi toleransi yang telah ditetapkan. Biasanya hitungan iterasi digunakan untuk mendeteksi adanya konvergensi.
The continue [,break]
perintah memungkinkan melanggar keluar dari setiap lingkaran, termasuk while
,forvalues
dan foreach
. Perintah berhenti iterasi saat ini dan berlanjut dengan berikutnya, kecuali break
ditentukan dalam hal ini keluar loop.
2.5 Pelaksanaan Bersyarat
Stata juga memiliki if
perintah pemrograman, tidak menjadi bingung dengan if
kualifikasi yang dapat digunakan untuk membatasi perintah apapun untuk subset dari data, seperti dalam summarize mpg if foreign
. The if
perintah memiliki struktur sebagai berikut
if expression { ... commands to be executed if expression is true ... } else { ... optional block to be executed if expression is false ... }
Berikut if
dan opsional else
adalah kata kunci, tipe help exp
untuk penjelasan ekspresi. Pembukaan brace{
harus menjadi hal terakhir pada baris (selain komentar) dan penutupan brace }
harus berada di baris baru dengan sendirinya.
Jika if
atau else
bagian terdiri dari satu perintah mereka bisa pergi pada baris yang sama tanpa kawat gigi, seperti dalam if expression command
. Tapi if expression { command}
tidak sah. Anda bisa menggunakan kawat gigi dengan menyebarkan kode menjadi tiga baris dan ini sering meningkatkan pembacaan kode.
Jadi di sini kita memiliki loop konyol di mana kita keluar setelah lima dari kemungkinan sepuluh iterasi:
forvalues iter=1/10 { display "`iter'" if `iter' >= 5 continue, break }
Dan dengan itu, kita keluar dari looping.
3. Menulis Perintah
Kita sekarang beralih ke menyenangkan tugas menulis perintah Stata Anda sendiri. Ikuti sepanjang seperti yang kita mengembangkan beberapa program sederhana, satu untuk menandatangani output, dan lain untuk mengevaluasi Coale-McNeil jadwal Model nuptiality, sehingga kita dapat membuat plot seperti ini:
3.1 Program Dengan Tidak Argumen
Mari kita mengembangkan perintah yang membantu label output dengan nama dan alamat email. (Biasanya Anda ingin catatan waktu, tapi itu sudah tersedia di bagian atas file log Anda. Anda selalu log output, kan?) Cara termudah untuk mengembangkan perintah adalah untuk memulai dengan melakukan berkas. Jalankan do-editor file Stata ini (Ctrl-8) dan ketik:
capture program drop sign program define sign version 9.1 display as text "German Rodriguez " display "{txt}{hline 62}" end
Itu dia. Jika Anda sekarang ketik sign
Stata akan menampilkan tanda tangan menggunakan gaya teks (biasanya hijau pada layar Anda).
The program drop
Pernyataan diperlukan dalam kasus kita melakukan perubahan dan perlu memutarkan lagi melakukan berkas, karena Anda tidak dapat menentukan program yang ada yang capture
diperlukan pertama kalinya, ketika tidak ada yang drop.
The version
pernyataan mengatakan perintah ini dikembangkan untuk versi 9.1 dari Stata, dan membantu versi masa depan dari Stata menjalankannya dengan benar bahkan jika sintaks telah berubah untuk sementara.
Baris terakhir menggunakan sedikit SMCL, diucapkan "smickle" dan pendek untuk Stata Markup Control Language, yang merupakan nama dari prosesor keluaran Stata ini. SMCL menggunakan teks biasa dikombinasikan dengan perintah diapit oleh kurung. Misalnya {txt}
set mode tampilan teks, dan {hline 62}
menarik sebuah garis horizontal persis 62 karakter lebar. Untuk mempelajari lebih lanjut tentang jenis SMCL help smcl
.
3.2 Program dengan Argumen
Untuk membuat program yang berguna Anda akan sering perlu untuk menyampaikan informasi kepada mereka, dalam bentuk "argumen" yang ditulis setelah perintah. Mari kita menulis perintah yang menggemakan apa yang Anda katakan
capture program drop echo program define echo version 9.1 display as text "`0'" end
Coba mengetik echo Programming Stata Tutorial
untuk melihat apa yang terjadi.
Ketika Anda memanggil perintah Stata menyimpan argumen dalam makro lokal disebut 0
. Kami menggunakan perintah display dengan `0'
mengevaluasi makro. Hasilnya adalah teks, sehingga kami lampirkan dalam tanda kutip. (Misalnya anda mengetik echo Hi
, sehingga makro lokal 0
memiliki Hi
; perintah akan membaca display Hi
dan Stata akan mengeluh, mengatakan 'Hi tidak ditemukan' Kami ingin perintah untuk membaca. display "Hi"
, Itulah sebabnya kami kode display "`0'"
.)
Jika kita tidak menentukan apa-apa, makro lokal 0
akan menjadi string kosong, perintah akan membaca display ""
dan Stata akan mencetak baris kosong.
3.3 Quotes Compound
Sebelum kita pergi keluar untuk merayakan kita harus memperbaiki masalah kecil dengan perintah baru. Coba mengetik Gema mudah-mudahan "akhir" run. Stata akan mengeluh. Mengapa? Karena setelah substitusi makro perintah tampilan yang sangat penting akan membaca
display "The hopefully "final" run"
Masalahnya adalah bahwa kutipan sebelum akhir menutup kutipan awal, sehingga Stata melihat ini sebagai "The hopefully "
diikuti oleh final "run"
, yang terlihat untuk Stata seperti nama yang tidak valid. Jelas kita perlu beberapa cara untuk membedakan tanda kutip dalam dan luar.
Kebetulan Anda bisa melihat persis di mana hal-hal pergi ke selatan dengan mengetik set trace on
dan menjalankan perintah. Anda dapat melihat di (sering menyakitkan) rinci semua langkah Stata melewati, termasuk semua substitusi makro. Jangan lupa untuk mengetik set trace off
ketika Anda selesai. Ketik help trace
untuk mempelajari lebih lanjut.
Solusi untuk masalah kita? Stata ini senyawa tanda kutip ganda : `"
untuk membuka dan "'
menutup, seperti dalam`"compound quotes"'
Karena pembukaan dan penutupan simbol yang berbeda kutipan ini dapat diulang.. kutipan senyawa
- dapat digunakan di mana saja kutipan ganda digunakan.
- harus digunakan jika teks yang dikutip termasuk tanda kutip ganda.
Jadi program kami harus display `"`0'"'
. Berikut versi final.
program define echo version 9.1 if `"`0'"' != "" display as text `"`0'"' end
Anda akan melihat bahwa aku menyingkirkan capture drop line
. Ini karena kita sekarang siap untuk menyimpan program sebagai basa-basi berkas. Ketik sysdir
untuk mencari tahu di mana direktori ado pribadi Anda, dan kemudian simpan file di sana dengan nama echo.ado
. Perintah sekarang akan tersedia setiap kali Anda menggunakan Stata.
(Sebagai catatan kaki, Anda akan ingin memastikan bahwa tidak ada perintah resmi Stata disebut echo
. Untuk melakukan hal ini saya mengetik which echo
. Stata menjawab "perintah gema tidak ditemukan baik sebagai built-in atau ado-file". Tentu saja tidak ada jaminan bahwa mereka tidak akan menulis satu; Stata cadangan semua kata bahasa Inggris).
3.4 Argumen Posisi
Selain menyimpan semua argumen bersama-sama di makro lokal 0
, Stata mengurai argumen (menggunakan ruang putih sebagai pembatas) dan menyimpan semua kata-kata yang ditemukan di macro lokal 1
, 2
, 3
, dll
Biasanya Anda akan melakukan sesuatu dengan `1'
dan kemudian beralih ke yang berikutnya. Perintah mac shift
datang berguna kemudian, karena menggeser semua macro turun satu, sehingga isi 2
sekarang di 1
, dan 3
dalam 2
, dan sebagainya. Dengan cara ini Anda selalu bekerja dengan apa yang ada di 1
dan bergeser ke bawah. Saat daftar habis 1
kosong dan Anda selesai.
Jadi di sini adalah program kanonik yang berisi daftar argumen
capture program drop echo program define echo version 9.1 while "`1'" != "" { display `"`1'"' mac shift } end
Jangan lupa mac shift
, jika program Anda dapat berjalan selamanya. (Atau sampai Anda menekan tombol istirahat.)
Coba echo one two three testing
. Sekarang coba echo one "two and three" four
. Perhatikan bagaimana satu kelompok dapat kata-kata menjadi sebuah argumen tunggal dengan menggunakan tanda kutip.
Metode ini berguna, dan kadang-kadang salah satu dapat diberikan argumen nama lebih bermakna menggunakanargs
, tapi kami akan melanjutkan ke tingkat berikutnya, yang jauh lebih kuat dan kuat.
(By the way seseorang dapat melewati argumen tidak hanya untuk perintah, tetapi untuk melakukan file juga. Ketikhelp do
untuk mempelajari lebih lanjut.)
3.5 Menggunakan Stata Sintaks
Jika perintah Anda menggunakan sintaks Stata standar, yang berarti argumen adalah daftar variabel, mungkin berat, mungkin sebuah if
atau in
klausa, dan mungkin banyak pilihan , Anda dapat mengambil keuntungan dari parser Stata sendiri, yang terletak menyimpan semua elemen di macro lokal siap untuk Anda gunakan.
Mari kita menulis perintah yang menghitung probabilitas menikah dengan usia tertentu dalam model Coale-McNeil dengan rata-rata yang diberikan, standar deviasi, dan proporsi menikah. Sintaks perintah diusulkan kami adalah
pnupt age, generate(married) [ mean(25) stdev(5) pem(1)]
Jadi kita memerlukan variabel yang ada dengan usia di tahun yang tepat, dan pilihan yang wajib menetapkan variabel baru yang akan dihasilkan dengan proporsi menikah. Ada juga pilihan untuk menentukan mean, standar deviasi, dan proporsi yang pernah menikah di jadwal, semua dengan default. Berikut adalah potongan pertama di perintah
capture program drop pnupt program define pnupt version 9.1 syntax varname, Generate(name) /// [ Mean(real 25) Stdev(real 5) Pem(real 1) ] // ... we don't do anything yet ... end
Hal pertama yang harus diperhatikan adalah bahwa syntax
perintah terlihat sangat seperti prototipe kami. Begitulah cara mudah ini.
Elemen pertama dalam sintaks kami adalah contoh dari daftar variabel atau varlist
. Anda dapat menentukan minima dan maksima, misalnya program yang memerlukan tepat dua variabel akan mengatakan varlist(min=2 max=2)
. Bila Anda hanya memiliki satu variabel, seperti yang kita lakukan, Anda bisa mengetik varname
, yang merupakan kependekan varlist(min=1 max=1)
.
Stata kemudian akan memastikan bahwa program anda disebut dengan tepat satu nama variabel yang ada, yang akan disimpan dalam makro lokal disebut varlist
. (Makro selalu disebut varlist
, bahkan jika Anda hanya memiliki satu variabel dan digunakan varname
dalam pernyataan sintaks Anda.) Coba pnupt nonesuch
dan Stata akan mengeluh, mengatakan "variabel sesuatu yg terbaik tidak ditemukan".
(Jika Anda telah melakukan pemrograman sebelumnya, dan Anda menghabiskan 75% dari menulis cek waktu Anda untuk kesalahan input dan hanya 25% yang berfokus pada tugas di tangan, Anda benar-benar akan menghargaisyntax
perintah. Ia melakukan banyak kesalahan memeriksa Anda.)
Elemen sintaks opsional diapit tanda kurung [
dan ]
. Dalam perintah kami generate
opsi diperlukan tetapi tiga lainnya adalah opsional. Cobalah perintah ini untuk menghasilkan dataset tes kecil dengan variabel usia berkisar 15-50
drop _all set obs 36 gen age = 14 + _n
Sekarang coba pnupt age
. Kali ini Stata senang dengan age
tetapi catatan 'pilihan menghasilkan () diperlukan'.Apakah saya mengatakan syntax
menghemat banyak pekerjaan? Pilihan yang mengambil argumen harus menentukan jenis argumen ( integer
, real
, string
, name
) dan, opsional, nilai default. Kamigenerate
membutuhkan name
, dan diperlukan, sehingga tidak ada default. Coba pnupt age, gen(2)
. Stata akan mengeluh bahwa 2 bukan nama.
Jika semuanya baik-baik, isi opsi disimpan dalam makro lokal dengan nama yang sama dengan opsi tersebut, di sinigenerate
.
confirm
:confirm new variable `generate'
Stata kemudian memeriksa bahwa Anda bisa sebenarnya menghasilkan variabel ini, dan jika tidak masalah error 110. Cobalah pnupt age, gen(age)
dan Stata akan mengatakan 'usia sudah ditetapkan'.
Ini harus jelas sekarang bahwa Stata akan memeriksa bahwa jika Anda menentukan rata-rata, standar deviasi atau proporsi yang pernah menikah, disingkat m()
, s()
dan p()
, mereka akan bilangan real, yang akan disimpan dalam macro lokal disebut mean
,, stdev
, dan pem
. Jika opsi dihilangkan makro lokal akan berisi default.
Anda bisa melakukan pengecekan lagi pada input. Mari kita melakukan pemeriksaan cepat bahwa ketiga parameter yang non-negatif dan proporsinya tidak lebih dari satu.
if (`mean' <= 0 | `stdev' <= 0 | `pem' <= 0 | `pem' > 1) { di as error "invalid parameters" exit 110 }
Anda bisa menjadi lebih baik untuk pengguna Anda dan memiliki pemeriksaan terpisah untuk masing-masing parameter, tapi ini akan lakukan untuk saat ini.
Kami sekarang siap untuk melakukan beberapa perhitungan. Kami mengambil keuntungan dari hubungan antara model Coale-McNeil dan distribusi gamma, seperti yang dijelaskan dalam Rodríguez dan Trussell (1980). Berikut adalah versi kerja program
program define pnupt *! Coale-McNeil cumulative nuptiality schedule v1 GR 24-Feb-06 version 9.1 syntax varname, Generate(name) [Mean(real 25) Stdev(real 5) Pem(real 1)] confirm new var `generate' if `mean' <= 0 | `stdev' <= 0 | `pem' <= 0 | `pem' > 1 { display as error "invalid parameters" exit 198 } tempname z g gen `z' = (`varlist' - `mean')/`stdev' gen `g' = gammap(0.604, exp(-1.896 * (`z' + 0.805))) gen `generate' = `pem' * (1 - `g') end
Kita bisa menulis rumus untuk probabilitas dalam satu baris tetapi hanya dengan mengorbankan mudah dibaca.Sebaliknya kita pertama standarisasi umur, dengan mengurangi mean dan membaginya dengan deviasi standar.Apa yang bisa kita sebut variabel ini? Anda mungkin tergoda untuk menyebutnya z
, tapi bagaimana jika pengguna program Anda telah variabel yang disebut z
? Kemudian kami mengevaluasi fungsi gamma. Apa yang bisa kita sebut hasilnya?
Solusinya adalah tempname
perintah, yang meminta Stata untuk membuat nama variabel yang unik sementara, dalam hal ini dua untuk disimpan dalam macro lokal z
dan g
. Karena macro ini lokal, tidak ada risiko konflik nama.Fitur lain dari variabel sementara adalah bahwa mereka hilang secara otomatis ketika program berakhir, sehingga Stata tidak housekeeping untuk Anda.
Jalur ini gen `z' = (`varlist' - `mean')/`stdev'
mungkin terlihat sedikit aneh pada awalnya. Ingat bahwa semua jumlah bunga sekarang disimpan di macro lokal dan kita perlu mengevaluasi mereka untuk mendapatkan di mana saja, maka profesi backticks: `z
mendapat nama variabel sementara kami, `varlist'
mendapat nama variabel umur yang ditentukan oleh pengguna, `mean'
mendapatkan nilai mean, dan `stdev'
mendapat nilai standar deviasi. Setelah substitusi makro baris ini akan membaca sesuatu seperti , yang mungkin membuat banyak lebih masuk akal. gen 000001 = (age-22.44)/5.28
Anda mungkin mempertimbangkan memungkinkan pengguna untuk menentukan if
dan in
kondisi untuk perintah Anda. Ini perlu ditambahkan ke sintaks, di mana mereka akan disimpan dalam macro lokal, yang kemudian dapat digunakan dalam perhitungan, dalam hal ini diteruskan untuk menghasilkan.
Untuk pembahasan yang lebih rinci dari jenis subjek ini help syntax
dan pilih if
kemudian in
. Entri dalam help mark
juga relevan.
3.6 Membuat Variabel Baru
Kadang-kadang semua perintah Anda akan lakukan adalah membuat variabel baru. Ini, pada kenyataannya, adalah apa perintah kecil kami tidak. Bukankah lebih baik jika kita bisa menggunakan egen
jenis perintah seperti ini:
egen married = pnupt(age), mean(22.48) stdev(5.29) pem(0.858)
Nah, kita bisa! Seperti yang terjadi, egen
dapat diperpanjang-friendly. Untuk melaksanakan fungsi yang disebutpnupt
Anda harus membuat program (file ado) disebut _gpnupt
, dengan kata lain menambahkan awalan _g
.Dokumentasi di ekstensi egen agak jarang, tapi begitu Anda tahu fakta dasar ini semua yang perlu Anda lakukan adalah melihat sumber dari egen
perintah dan menyalinnya. (Aku memandang _gmean
.)
Jadi, inilah egen
versi perintah Coale-McNeil kami.
program define _gpnupt *! Coale-McNeil cumulative nuptiality schedule v1 GR 24-Feb-06 version 9.1 syntax newvarname=/exp [, Mean(real 25) Stdev(real 5) Pem(real 1)] if `mean' <= 0 | `stdev' <= 0 | `pem' <= 0 | `pem' > 1 { display as error "invalid parameters" exit 198 } tempname z g gen `z' = (`exp' - `mean')/`stdev' gen `g' = gammap(0.604, exp(-1.896 * (`z' + 0.805))) gen `typlist' `varlist' = `pem' * (1 - `g') end
Ada sedikit perbedaan antara program ini dan sebelumnya. Alih-alih sebuah variabel input egen
menerima ekspresi, yang akan dievaluasi dan disimpan dalam variabel sementara disebut exp
. Variabel output ditentukan sebagaivarlist
, dalam hal ini newvarname
. Itu sebabnya z
sekarang bekerja dengan exp
, dan gen
menciptakanvarlist
. Misterius typlist
ada karena egen
memungkinkan Anda menentukan jenis variabel output (float
secara default) dan yang akan dilewatkan ke fungsi kita, yang dibagikan bersama untuk gen
.
3.7 A Coale-McNeil Fit
Kami siap untuk mengungkapkan bagaimana plot awal diproduksi. Data tersedia dalam file stata di website saja demografi, dan memiliki jumlah perempuan yang pernah menikah dan tunggal dengan usia. Kami menghitung proporsi diamati menikah, menghitung nilai-nilai pas berdasarkan pada perkiraan di Rodríguez dan Trussell (1980), dan plot hasil. Itu semua dilakukan dalam beberapa baris
use http://data.princeton.edu/eco572/datasets/cohhnupt gen obs = ever/total egen fit = pnupt(age+0.5), mean(22.44) stdev(5.28) pem(.858) gen agem = age + 0.5 twoway (scatter obs agem) (line fit agem), /// title(Proportions Married by Age) subtitle(Colombia 1976) /// ytitle(Proportion married) xtitle(age)
Estimasi yang sebenarnya dapat diimplementasikan dengan menggunakan prosedur kemungkinan maksimum Stata, tapi itu cerita untuk hari lain.
4 Topik Lainnya
Karena kurangnya waktu dan ruang kita tidak dibahas kembali nilai-nilai dari program Anda, jenis help return
untuk mempelajari lebih lanjut. Untuk mata kuliah terkait pada perintah estimasi yang dapat mengirim hasil estimasi melihat help ereturn
dan help _estimates
. Sebuah referensi penting estimasi adalah Estimasi Maksimum dengan Stata , Edisi Keempat, oleh Gould, Pitblado dan Poi (2010).
Subyek menarik lainnya adalah matriks (mulai dengan help matrix
), dan bagaimana membuat perintah "byable" (tipe help byable
). Untuk output serius Anda perlu mempelajari lebih lanjut tentang SMCL, mulai dengan help smcl
. Untuk bekerja pada grafis Anda mungkin ingin belajar pemrograman kelas ( help class
) dan belajar tentang sersets ( help serset
). Untuk menyediakan antarmuka pengguna grafis untuk mencoba perintah Anda help dialog programming
. Hal ini dimungkinkan untuk membaca dan menulis teks dan file biner (lihat help file
), tapi saya pikir tugas ini lebih baik ditangani dengan Mata. Anda bahkan dapat menulis ekstensi Stata di C, namun kebutuhan bagi mereka juga telah berkurang dengan ketersediaan Mata.