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.

Contoh: Kontrol Variabel di Regresi.

Anda perlu menjalankan sekelompok persamaan regresi yang mencakup satu set standar variabel kontrol, mengatakan ageagesqeducation, 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 logincomesebaliknya 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?

Contoh: Mengelola Variabel Dummy

Misalkan Anda bekerja dengan survei demografi di mana usia telah dikelompokkan dalam kelompok lima tahun dan berakhir diwakili oleh tujuh dummies, mengatakan age15to19untuk 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 cebpada "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 agedi 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 agedan mengganti nilai saat age. Mengubah isi dari makro agedi 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 controlsmenjadi `age' income education.Ketika controlsmakro dievaluasi, Stata melihat bahwa itu termasuk makro agedan 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 regresstoko 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 scalarsuntuk 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 limitsdiingatkan).

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 [=] textdan 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.doberkas, 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 profilewuntuk 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 listdan macro drop. Ketik help macrountuk 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 forvaluesadalah kata kunci, numberadalah nama dari makro lokal yang akan ditetapkan untuk setiap nomor dalam urutan, dan sequencemerupakan rentang nilai yang dapat memiliki bentuk

  • min/max untuk menunjukkan urutan angka dari minke maxdalam langkah-langkah dari satu, misalnya 1/3hasil 1, 2 dan 3, atau
  • first(step)last yang menghasilkan urutan dari firstke lastdalam langkah-langkah dari ukuran step. Misalnya 15(5)50menghasilkan 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 forvaluesuntuk 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.

Membuat Variabel Dummy

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 age20to24untuk age45to49. (By the way age25to29adalah sama ageg3. Yang jelas?) Cara loop bekerja adalah bahwa makro lokal botakan 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 topuntuk mewakili batas atas dari kelompok usia yang sama dengan batas bawah ditambah 4. Pertama kali melalui loop botadalah 20, sehingga topadalah 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 foreachdan 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 foreachadalah kata kunci, itemadalah nama makro lokal pilihan Anda sendiri, inadalah 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 animaldiatur 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 foreachyang loop atas tipe tertentu dari daftar yang sekarang saya jelaskan secara singkat.

Daftar Variabel
Mungkin varian yang paling berguna adalah
foreach varname of varlist list-of-variables {
	... body of loop using `varname' ...
}

Berikut foreachofdan varlistadalah kata kunci, dan harus diketik persis seperti mereka. The list-of-variableshanya 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 var1untuk var3.

Keuntungan dari lingkaran ini selama generik setara foreach varname in list-of-variablesadalah 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 newlistkata kunci menggantikan varlistdan memberitahu Stata untuk memeriksa bahwa semua elemen daftar nama-nama hukum dari variabel yang tidak ada sudah.

Kata-kata dalam Macro

Dua varian lainnya loop atas kata-kata dalam makro lokal atau global; mereka menggunakan kata kunciglobalatau localdiikuti 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 foreachdenganvarlist; di sini kita simpan pengecekan.

Daftar Numbers

Stata juga memiliki foreachvarian yang mengkhususkan diri dalam daftar nomor (atau numlistsdi 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 numlistuntuk 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 whilelingkaran, 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 ifdan opsional elseadalah 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 ifatau elsebagian 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 signStata akan menampilkan tanda tangan menggunakan gaya teks (biasanya hijau pada layar Anda).

The program dropPernyataan diperlukan dalam kasus kita melakukan perubahan dan perlu memutarkan lagi melakukan berkas, karena Anda tidak dapat menentukan program yang ada yang capturediperlukan pertama kalinya, ketika tidak ada yang drop.

The versionpernyataan 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 0memiliki Hi; perintah akan membaca display Hidan 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 0akan 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 ondan 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 traceuntuk 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 sysdiruntuk 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 123, 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 2sekarang di 1, dan 3dalam 2, dan sebagainya. Dengan cara ini Anda selalu bekerja dengan apa yang ada di 1dan bergeser ke bawah. Saat daftar habis 1kosong 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 dountuk 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 ifatau inklausa, dan mungkin banyak pilihan , Anda dapat mengambil keuntungan dari parser Stata sendiri, yang terletak menyimpan semua elemen di macro lokal siap untuk Anda gunakan.

Sebuah Command Prototipe

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 syntaxperintah terlihat sangat seperti prototipe kami. Begitulah cara mudah ini.

Daftar variabel

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 varnamedalam pernyataan sintaks Anda.) Coba pnupt nonesuchdan 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 menghargaisyntaxperintah. Ia melakukan banyak kesalahan memeriksa Anda.)

Pilihan dan Default

Elemen sintaks opsional diapit tanda kurung [dan ]. Dalam perintah kami generateopsi 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 agetetapi catatan 'pilihan menghasilkan () diperlukan'.Apakah saya mengatakan syntaxmenghemat banyak pekerjaan? Pilihan yang mengambil argumen harus menentukan jenis argumen ( integerrealstringname) dan, opsional, nilai default. Kamigeneratemembutuhkan 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.

Memeriksa Argumen
Sekarang kita perlu melakukan sedikit pekerjaan untuk memeriksa bahwa nama adalah nama variabel yang valid, yang kita lakukan dengan 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.

Variabel sementara

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 tempnameperintah, yang meminta Stata untuk membuat nama variabel yang unik sementara, dalam hal ini dua untuk disimpan dalam macro lokal zdan 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: `zmendapat 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

Jika / Dalam

Anda mungkin mempertimbangkan memungkinkan pengguna untuk menentukan ifdan 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 syntaxdan 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 egenjenis perintah seperti ini:

egen married = pnupt(age), mean(22.48) stdev(5.29) pem(0.858)

Nah, kita bisa! Seperti yang terjadi, egendapat diperpanjang-friendly. Untuk melaksanakan fungsi yang disebutpnuptAnda 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 egenperintah dan menyalinnya. (Aku memandang _gmean.)

Jadi, inilah egenversi 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 egenmenerima ekspresi, yang akan dievaluasi dan disimpan dalam variabel sementara disebut exp. Variabel output ditentukan sebagaivarlist, dalam hal ini newvarname. Itu sebabnya zsekarang bekerja dengan exp, dan genmenciptakanvarlist. Misterius typlistada karena egenmemungkinkan Anda menentukan jenis variabel output (floatsecara 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 returnuntuk mempelajari lebih lanjut. Untuk mata kuliah terkait pada perintah estimasi yang dapat mengirim hasil estimasi melihat help ereturndan 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.

Source: http://data.princeton.edu/stata/programming.html