




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、主要內(nèi)容基本概念與工具程序文件的基本格式程序控制語句實驗實驗16-1:基本概念與工具:基本概念與工具實驗基本原理實驗基本原理如果我們需要反復(fù)執(zhí)行一些命令,就可以將相關(guān)命令存放在一個do文件中,然后保存并運行相應(yīng)的do文件即可。相比起一遍一遍地輸入命令,這種方式既方便又不容易出錯。而另一些時候,我們會需要編寫程序,從而能用一個命令來實現(xiàn)某種結(jié)果。一個程序應(yīng)以program開頭,以end結(jié)束。也就是說,應(yīng)呈現(xiàn)如下的形式:program 程序名相應(yīng)的命令end我們可以采取交互的方式定義程序(即,在Stata命令窗口中輸入程序的各行命令),但實際應(yīng)用中,程序經(jīng)常是被保存到一個do文件或ado文件中去,
2、從而方便以后的應(yīng)用。在程序或do文件中,我們可能需要加入注釋,從而方便以后或他人的閱讀。通常,我們還會聲明版本,從而使得程序能夠在以后更高版本的Stata中繼續(xù)使用。此外,局部宏、全局宏、臨時變量、臨時矩陣和臨時文件等也會經(jīng)常被使用。實驗內(nèi)容及數(shù)據(jù)來源實驗內(nèi)容及數(shù)據(jù)來源本實驗中,我們會講解do文件的創(chuàng)建和執(zhí)行方法、定界符的修改、程序和do文件的聯(lián)系、ado文件的創(chuàng)建和保存、注釋的添加方法、版本的聲明、局部宏和全局宏的定義及引用以及臨時變量、臨時矩陣和臨時文件的定義和使用等內(nèi)容。本實驗主要講解編寫程序的一些基本操作,不需要使用數(shù)據(jù)文件。實驗操作指導(dǎo)實驗操作指導(dǎo)1 Do文件文件do文件是一種文本文
3、件,其擴(kuò)展名為“.do”。要創(chuàng)建一個do文件,可以通過菜單欄中Window的下拉選項Do-file Editor來打開Do文件編輯器,也可以直接點擊工具欄的圖標(biāo) 。而要執(zhí)行一個do文件,可以鍵入以下命令:do filename這里,filename指相應(yīng)的do文件的文件名。但需要注意的一點是,這個filename.do文件需要放在當(dāng)前目錄下,只有這樣,才可以不寫文件的路徑;否則,需要在文件名前寫出完整路徑(而如果路徑中有中文字符,一定要將全部路徑和文件名置于英文雙引號之間)。要查看當(dāng)前目錄,我們可輸入命令:cd當(dāng)然,我們也可以先將當(dāng)前目錄更改到我們偏好的一個文件夾下,然后再將do文件存放其中。
4、例如,如下命令可以將當(dāng)前目錄更改到d盤data文件夾下:cd “D:data”這里,需要注意的一點是,cd命令要求其后的文件夾原來就存在。對于do文件中的命令,值得注意的是,每一行命令都需要結(jié)束于一個硬回車(包括最后一行);除非通過“#delimit”命令設(shè)置其他符號為換行符。例如,輸入命令:#delimit .則我們設(shè)置以英文的句號作為換行符,也就是說,Stata只有遇到英文句號才會認(rèn)為這一句命令結(jié)束。設(shè)置其他的換行符對于將很長的命令分成幾行很有幫助,因為這時我們可以在想分行的地方輸入回車符,而Stata又不會認(rèn)為這是一句命令的結(jié)束。而如果我們想重新以硬回車(carriage return)
5、為換行符,可輸入以下命令:#delimit cr2 Stata程序和程序和Do文件文件Stata處理程序和處理do文件的方式是一樣的,包括參數(shù)的傳遞、結(jié)果的表達(dá)等。但do文件和程序也存在一些小的差別。例如,要激發(fā)一個do文件,我們需要鍵入“do filename”,而要激發(fā)一個程序,我們只需要鍵入程序名稱就可以。此外,鍵入“do filename”之后,Stata會顯示do文件中的命令以及執(zhí)行結(jié)果;而鍵入程序名之后,Stata只會顯示其執(zhí)行結(jié)果。下面,我們重點講一下,通常情況下,將程序放到do文件中去需要注意的問題。例如,我們編寫了一個簡單的程序:program exampdisplay “t
6、his is an example”end并把它保存到名為“examp.do”的文件中,且把文件置于當(dāng)前目錄下。下面,我們要執(zhí)行這個do文件,就在Stata命令窗口輸入如下的命令:do examp下面,我們再在命令窗口輸入命令:examp也就是說,我們要執(zhí)行程序examp。這時,Stata就會顯示:this is an example在隨后的時間里,我們?nèi)绻€想顯示“this is an example”,直接輸入命令“examp”就可以。這里,我們展示了共同使用do文件和程序的一種方式,即,先在do文件中寫出程序的命令并保存,再鍵入“do filename”,然后就可以在隨后的時間使用該程序
7、命令了。當(dāng)然,我們也可采取一種更為簡潔的方式,即在do文件的最后一行加上程序名,這樣,當(dāng)鍵入“do filename”的時候,Stata就會在加載完程序后就執(zhí)行程序。但需要注意的是,程序一旦被定義,Stata就不允許對其重新定義。這樣,如果我們隨后又輸入一遍“do filename”,Stata就會顯示錯誤提示。要解決這個問題,我們可以在do文件的第一行輸入這樣的命令:program drop 程序名這樣,在定義該程序之前,如果內(nèi)存中已有這個程序,我們會先將其從內(nèi)存中刪掉。但這種解決方案也存在一個問題:在打開Stata的期間第一次運行這個do文件,Stata會顯示錯誤提示。因為這時還沒有定義程
8、序,所有沒有辦法將其刪除。我們繼續(xù)修正該命令為:capture program drop 文件名將命令“capture”置于其他命令之前,就表示無論該命令是否作用,Stata也不顯示錯誤提示,且能繼續(xù)執(zhí)行下面的命令。事實上,在包含程序的do文件中,我們經(jīng)常可以看到程序的定義之前有這樣的命令。綜合了以上幾點,我們前面的do文件可以修改為這樣的形式:capture program drop exampprogram exampdisplay “this is an example”endexamp這里,第一行先檢查是否有已定義的examp程序,如果有就將其從內(nèi)存中刪除。第二到四行是定義程序exam
9、p,最后一行是執(zhí)行程序examp。3 Ado文件文件如果想自動加載并運行程序內(nèi)容,我們可以將程序保存到ado(automatically do)文件中(同樣是利用do文件編輯器,保存時選擇擴(kuò)展名為ado),以后,直接輸入程序名就可以使用該程序。但需要注意的是,ado文件的文件名和其中的程序名必須一致。值得注意的是,如果在Stata運行的過程中改變了某個ado文件的命令語句,則在重新運行這個ado文件前,要先將Stata內(nèi)存中的ado文件清除。即,輸入命令:discard否則,Stata還是會運行原來的那個ado文件。個人編寫的ado文件通常被存放在兩個地方,一個是當(dāng)前目錄,另一個是個人ado目
10、錄。個人ado目錄通常位于“C:adopersonal”,要查看其具體位置,可輸入命令:personal而要查看或改變當(dāng)前目錄,可使用命令“cd”。4 版本版本隨著Stata版本的變化,相應(yīng)的命令也會有些變化。這樣,較早版本的命令可能就沒法在現(xiàn)在的版本中使用,而現(xiàn)在的某些命令可能也沒法在以后的版本中使用。為了讓現(xiàn)在的程序能夠在其他的版本中繼續(xù)使用,我們可以在程序中聲明所使用的版本;這樣,在更新版本的Stata中運行這個程序,Stata就會做相應(yīng)的調(diào)整,按當(dāng)前版本的方式來翻譯程序的命令。要聲明版本,可輸入命令:version 10.1這里,我們使用的是10.1版的Stata。對于其他版本的Sta
11、ta,在version后面輸入相應(yīng)的版本編號即可。5 注釋注釋有時,我們想在命令中加入注釋,從而方便以后或他人的閱讀。要在do文件或ado文件中加入注釋,可以采取如下幾種方式:1.以“*”來開始一行。這樣,該行就會被當(dāng)做注釋。2.將注釋放在“/*”和“*/”之間。該種格式可以置于句中的任何位置。此外,在行末使用“/*”,并在下一行行首使用“*/”,可以將很長的命令分成兩行。3.將注釋置于雙斜線“/”之后。如果雙斜線之前有命令,則雙斜線與命令之間至少要有一個空格。4.將注釋置于三斜線“/”之后。如果三斜線之前有命令,斜線與命令之間也是至少要有一個空格。此外,對于“/”,其下一行的命令會被認(rèn)為是前
12、面命令的繼續(xù)。三斜線也可單獨置于行尾,從而將很長的命令分成幾行。例如,我們可以寫這樣一段命令:*this is an exampleuse /*get data*/ C:Stata10datasample.dtasummarize age education /occupation tab region / obtain summary statistics如果去掉注釋,上面的命令即為:use C:Stata10datasample.dtasummarize age education occupation tab region此外,對于交互方式的命令,注釋只可采取第一種方式,即在句首加上“*
13、”。6 宏宏宏是Stata程序的變量,它用一個字符串(宏的名稱)來代表另一個字符串(宏的內(nèi)容)。宏分為局部宏(local macro)和全局宏(global macro)。局部宏只屬于其所定義的程序,不能從其他程序中調(diào)用。而全局宏一旦被定義,就會留在內(nèi)存,且可以被其他程序使用。局部宏的名稱最多有31個字符,它的定義方式為:local 宏的名稱 宏的內(nèi)容或: local 宏的名稱=表達(dá)式例如,我們輸入命令:local nv “this is a newvar”就定義了一個叫做nv的局部宏,其內(nèi)容為this is a newvar。如果我們要引用這個局部宏的內(nèi)容,其格式為:nv。注意,左邊的引號為
14、標(biāo)準(zhǔn)鍵盤左上角的重音符(數(shù)字1左邊的鍵),右邊的引號為通常的單引號(回車鍵左邊的鍵)。定義完畢之后,如果我們輸入:nv我們就相當(dāng)于輸入了:this is a newvar例如,我們可以輸入如下的命令來顯示這個宏的內(nèi)容:display “nv”注意,這里,宏nv外面的雙引號必不可少,因為如果不加引號,我們相當(dāng)于輸入了如下的命令:display this is a newvarStata會顯示錯誤提示:this not found。只有加上外面的雙引號,才表示我們要顯示一個字符串。否則,Stata會將其當(dāng)做變量來處理。當(dāng)然,如果宏的內(nèi)容確實為存在的變量名,而我們要顯示這個變量,就不必加上雙引號。對
15、于定義局部宏的命令,宏內(nèi)容上的引號可以省略。也就是說,我們在定義時,可以采用如下的命令:local nv this is a newvar這與前面是等價的。當(dāng)然,加上引號能使命令的可讀性更強(qiáng)。下面,我們來看一下定義宏的兩種形式的區(qū)別。例如,對于如下兩種形式:local one 3+2 或等價地,local one “3+2”local two=3+2第一種形式中,局部宏one的內(nèi)容為字符串3+2;而第二種形式中,Stata會先計算表達(dá)式的結(jié)果(3+2=5),然后將5保存到宏two中。在第二種形式中,表達(dá)式可以是數(shù)值表達(dá)式或字符串表達(dá)式。這里,3+2是數(shù)值表達(dá)式(如果想令其為字符串型,在外面加雙
16、引號就可以)。此外,局部宏(以及全局宏)可以組合使用。例如,局部宏i為數(shù)值6,宏x6 為字符newvar,則宏xi就指代字符newvar。另外,在組合時,我們可以通過大括號來設(shè)定運算的優(yōu)先級。如果要清除一個局部宏,可將其內(nèi)容設(shè)置為空。這可以通過如下三種方式實現(xiàn):local macnamelocal macname local macname = 這里,macname指宏的名稱。而如果我們在程序中直接使用了一個沒有被定義的宏,則Stata會將其當(dāng)做一個內(nèi)容為空的宏來處理。對于全局宏而言,其名字最多可以有32個字符長。全局宏的定義方法與局部宏類似,只需要將local改為global即可。此外,引用
17、全局宏時,在其名字前加上美元符號$。此外,即便程序中的全局宏和局部宏有相同的名稱也沒有關(guān)系,因為他們的引用方法不同,Stata可以將其區(qū)分。值得注意的一點是,如果我們要顯示的內(nèi)容第一個字符為美元符號,為了和全局宏進(jìn)行區(qū)分,我們可以在該字符前加上反斜線。例如:display “$that”就表示要顯示字符串$that,而不是全局宏that的內(nèi)容。7 臨時變量、臨時矩陣和臨時文件臨時變量、臨時矩陣和臨時文件有些時候,程序在運行的過程中需要產(chǎn)生一些臨時的變量、矩陣等,而一旦程序運行結(jié)束,這些變量、矩陣等就不再需要。這種情況下,我們可以生成臨時變量等。生成臨時變量的命令格式為:tempvar var1
18、 var2 這里,tempvar 是生成臨時變量的基本命令,var1、var2代表臨時變量的名稱。確切地說,命令tempvar生成的是臨時變量的名稱,我們后面可以使用這些名稱來生成臨時變量;這些臨時變量在程序結(jié)束時會被自動刪掉。此外,tempvar生成的變量名被保存在局部宏內(nèi),在后面引用時需要加引號。臨時變量的一個優(yōu)點在于,即便內(nèi)存中已存在相同名稱的變量,我們也不必先將其刪掉;這不會影響我們定義臨時變量。例如,我們要定義并生成兩個臨時變量x和y(可能內(nèi)存中已有變量是這個名稱,但沒有關(guān)系),可輸入命令:tempvar x ygen x= gen y=這里,第一步是定義臨時變量,第二步和第三步是生
19、成相應(yīng)的臨時變量。我們這里沒有給出具體的表達(dá)式,因為這完全視具體情況而定。需要注意的是,在命令tempvar之后,我們引用臨時變量時,都需要加上局部宏的引號。類似地,定義臨時矩陣或臨時標(biāo)量的命令為:tempname ms1 ms2 這里,tempname 是定義臨時矩陣或臨時標(biāo)量的基本命令,ms1、ms2等代表臨時矩陣或臨時變量的名稱。同樣地,定義臨時文件的命令為:tempfile file1 file2 這里,tempfile是定義臨時文件的基本命令,file1、file2代表臨時文件的名稱。例如,我們在程序中可能出現(xiàn)這樣的命令:preserve /保存初始數(shù)據(jù)tempfile males
20、females /定義臨時文件males和femaleskeep if sex=1 /*保留變量sex取值為1的觀測值*/save males /*將這些觀測值保存到臨時文件male中*/restore, preserve /恢復(fù)原始數(shù)據(jù)keep if sex=0 /保留變量sex取值為0的觀測值save females /將這些觀測值保存到臨時文件female中與臨時變量相同,在程序結(jié)束時,Stata會自動刪除臨時矩陣、臨時標(biāo)量或臨時文件。實驗實驗16-2:程序文件的基本格式:程序文件的基本格式實驗基本原理實驗基本原理在編寫程序時,我們需要遵從一定的格式?;镜囊环N格式為:program d
21、efine 程序名, version #syntax end其中,第一行是定義程序,第二行是表明所用的Stata版本,第三行表明語法格式,后面是其他的一些命令,最后一行表明該程序結(jié)束。當(dāng)然,version和syntax都不是必選項。但syntax等命令的應(yīng)用在很多時候能使得程序的編寫變得比較方便。而當(dāng)我們不使用語法的時候,有時也會需要對輸入的參數(shù)進(jìn)行解析,這可以通過tokenize或gettoken命令來實現(xiàn)。此外,命令中使用的觀測值有時需要被標(biāo)記。例如,程序設(shè)定了條件語句、范圍語句,需要確認(rèn)其所使用的觀測值等。由于很多程序錯誤產(chǎn)生于在程序的不同部分使用不同的樣本,因此,我們強(qiáng)烈建議在程序的開
22、始處對樣本進(jìn)行標(biāo)記。最后,很多程序需要保存一些結(jié)果,并且可以在運行程序時返回相應(yīng)的結(jié)果。對于這些,我們也會進(jìn)行講解。實驗內(nèi)容及數(shù)據(jù)來源實驗內(nèi)容及數(shù)據(jù)來源本實驗中,我們主要講解程序的定義、程序的刪除、程序內(nèi)容的顯示、變元的定義和引用、語法的定義、標(biāo)記變量的生成和調(diào)整、輸入?yún)?shù)的解析、結(jié)果的保存和返回等內(nèi)容。本實驗的部分命令會用到本書附帶光盤data文件夾下的“usaauto.dta”工作文件。該文件給出了美國汽車產(chǎn)業(yè)的橫截面數(shù)據(jù),主要變量包括:price=汽車的價格,mpg=每加侖油所行駛的英里數(shù),weight=汽車的重量,length=汽車長度,turn=轉(zhuǎn)彎圓周,displacement=內(nèi)
23、燃機(jī)氣缸的工作容積,foreign=是否進(jìn)口車(0代表是國產(chǎn)車)。實驗操作指導(dǎo)實驗操作指導(dǎo)1 程序的定義程序的定義定義程序的基本命令為:program define program_name , nclass| rclass| eclass | sclass byable(recall , noheader| onecall) properties(namelist) sortpreserve plugin這里,program define是定義程序的基本命令,其中,define可以省略(所有中括號內(nèi)的內(nèi)容都是可選項)。program_name是程序名。選項nclass是默認(rèn)選項,用于表明程序
24、的類型,該選項表示程序不保存任何結(jié)果;rclass、eclass和 sclass分別表示程序結(jié)果保存在r()、e()和s()中。選項byable()表示程序在運用時允許“by: varlist”前綴,而默認(rèn)情況下這是不允許的。byable()主要有兩種運用形式:by(recall)和by(onecall)。其中,by(recall)最為常用。需要注意的是,如果程序中有生成新變量(指永久變量而非臨時變量),或者沒使用marksample或mark(該命令的講解見后面)來限制相關(guān)的子樣本,則僅僅使用選項by(recall)是不恰當(dāng)?shù)摹A私鈈y(recall)的作用機(jī)理會有助于我們理解這一點:如果程
25、序在運用時使用了“by: varlist”前綴,程序會被執(zhí)行k次(k是分組變量varlist的類別數(shù));而每次運行時,marksample會標(biāo)記出不屬于當(dāng)前組的觀測值。因此,如果程序中有生成永久變量,則第一次運行時就會生成,而第二次再運行時,因為相應(yīng)的變量已經(jīng)存在,故會出錯。而如果沒有用marksample來標(biāo)記相關(guān)樣本,會導(dǎo)致過多的觀測值被使用,也會出錯。by(onecall)的主要作用是用于像“generate”和“egen”這一類的程序,它運行前綴by,但作用于所有數(shù)據(jù),且生成一個變量來保存不同組的結(jié)果。如其名字所暗示的,這類程序只執(zhí)行一次。properties()表示程序的特征,比如運
26、行stepwise或svy前綴。sortpreserve表示程序會改變數(shù)據(jù)的排序,但程序結(jié)束時,就恢復(fù)初始順序。該選項會使Stata在程序開始時通過臨時變量_sortindex記錄當(dāng)前數(shù)據(jù)排序情況,并在程序結(jié)束時通過該變量恢復(fù)數(shù)據(jù)的排序。這樣,即便程序中使用命令“sort”對數(shù)據(jù)進(jìn)行了重新排序,程序結(jié)束時數(shù)據(jù)也會恢復(fù)初始的順序。需要注意的一點是,必須保證臨時變量_sortindex在程序結(jié)束時還存在,這樣,程序才能恢復(fù)原來的排序。因而,如果程序結(jié)尾處有這樣的命令:keep id varlist 我們應(yīng)修改為:keep id varlist _sortindex 此外,如果程序中還有preser
27、ve命令,則程序運行結(jié)束后,會首先恢復(fù)到preserve所保存的狀態(tài),然后再恢復(fù)到sortpreserve所保存的狀態(tài)。最后,選項plugin表示動態(tài)載入插件程序。程序的顯示和刪除程序的顯示和刪除顯示內(nèi)存中程序的命令為:program dir刪除內(nèi)存中程序的命令為:program drop program_name program_name | _all| _allado這里,program drop是刪除內(nèi)存中的程序的基本語句,program_name指要從內(nèi)存中刪除的程序名,_all表示刪除所有內(nèi)存中的程序,_allado表示刪除內(nèi)存中所有從ado文件加載的程序。顯示程序內(nèi)容的命令為:pr
28、ogram list program_name program_name | _all這里,program list是顯示程序內(nèi)容的基本語句,program_name指要顯示內(nèi)容的程序名,_all表示顯示所有內(nèi)存中的程序的內(nèi)容。3 變元變元有些時候,我們需要在程序中使用某些變量。這些變量從外界輸入,并且在每次運行程序時可以進(jìn)行修改。定義并命名變元最簡單的方式是使用args命令,定義之后,變元被保存到局部宏之中。下面,我們通過一個簡單的程序來說明該命令的應(yīng)用。程序為:program argexampargs arg1 arg2 arg3 arg4display “The 1st argument
29、 is: arg1”display “The 2nd argument is: arg2”display “The 3rd argument is: arg3”display “The 4th argument is: arg4”end這里,我們定義了四個變元,arg1、arg2、arg3和arg4;定義之后,它們被傳遞到局部宏arg1、 arg2、 arg3和arg4之中,并在后面的命令中被引用。在執(zhí)行程序時,在程序名之后依次輸入各變元的內(nèi)容就可以。下面,我們運行程序。輸入命令:argexamp this is an argument如果我們輸入以下命令:argexamp “this is
30、an argument”則字符串“this is an argument”就被看做是一個變元的內(nèi)容。此外,即便我們不通過命令args來定義變元名,也可以直接在運行程序時,于程序名后面寫上各變元的內(nèi)容。這時,Stata將依次把各變元的內(nèi)容傳遞到局部宏1、2等之中,而且,宏0會按照用戶輸入的形式來保存所輸入的內(nèi)容(包括引號等),宏*則相當(dāng)于將宏1、2等依次排列,且兩兩之間有一個空格。但這樣的一個缺點是,變元的含義往往不夠明確,程序的可讀性比較低。事實上,在用args命令之后,Stata不過把局部宏1、2的內(nèi)容又傳遞到args新定義的變元中;而這時,我們?nèi)钥稍诔绦蛑型ㄟ^局部宏1、2等來引用相應(yīng)的變量
31、。最后,如果在執(zhí)行程序時,命令后面的變元個數(shù)多于args定義的變元的個數(shù),我們可以通過數(shù)字形式的宏來引用多出來變元。4 語法語法通過在程序中設(shè)置命令的語法(syntax)格式,我們可以不必設(shè)定變元,直接按照語法來使用該程序即可。標(biāo)準(zhǔn)的語法格式為:by varlist: command varlist =exp using filename if in weight , options這里,by varlist表示按照變量varlist的類別分別運行命令,command表示命令的名稱(即程序名),varlist代表命令中的變量,=exp表示運算表達(dá)式,using filename使用數(shù)據(jù)文件fi
32、lename,if代表條件語句,in代表范圍語句,weight代表權(quán)重語句,options代表其他選項。在寫語法時,我們選取需要的部分進(jìn)行組合。也可以將某些項用中括號括起來,表明該內(nèi)容為可選項;或者不使用中括號,表明該項為必選項。但需要注意的一點是,在程序中寫語法之前,必須寫上命令snytax,表明該命令是語法格式。而by varlist和command則不必出現(xiàn)在syntax之后,它們是在運行程序時使用的。另外,執(zhí)行程序時,語法中各項內(nèi)容都會被保存在相應(yīng)的宏中。例如,條件語句會被保存在宏if中,范圍語句會被保存在宏in中,等等。下面,我們對語法格式中的幾項做進(jìn)一步的說明。對于varlist,
33、我們可以進(jìn)行多種形式的設(shè)置。例如:syntax varlist 表示執(zhí)行程序時,變量名varlist必須設(shè)置syntax varlist 表示變量名varlist為可選項syntax varlist (default=none) 設(shè)置默認(rèn)的變量個數(shù)為0syntax varlist (min=3) 表示變量varlist必須設(shè)置,且最少要有3個syntax varlist (min=2 max=5 numeric) 表示變量varlist最少要有2個,最多有5個,且必須為數(shù)值型。括號中還可設(shè)定:string=只允許字符變量,ts=允許時間序列算子等。syntax varname 只允許設(shè)置一個變
34、量,且該變量為可選項對于varlist的位置,我們也可以設(shè)置為newvarlist或newvarname,表明生成新變量。此外,如果設(shè)置為namelist或name,表明輸入的對象可以不是變量名。要想進(jìn)一步放寬要求,還可采用anything,這時,在命令后輸入表達(dá)式或一串?dāng)?shù)字等都沒有關(guān)系。最后,如果不設(shè)定varlist,則該程序命令會不允許輸入變量。此外,對于語法格式的選項weight,它必須用中括號括起來,因為weight永遠(yuǎn)是可選項。此外,我們可以設(shè)定多種權(quán)重形式,包括fweight、aweight、pweight和iweight。例如,我們可以設(shè)定:syntax fweight pwei
35、ght 表明fweight和pweight是可選的。下面,我們定義一個包含語法的程序,來對前面的講解做進(jìn)一步的說明。program mysynsyntax varlist(min=1) if in , title(string) *設(shè)定變量名為必選項,且至少要有一個變量,if、in、title()為可選項display “varlist contains |varlist|” *顯示字符串“varlist contains |變量名|”,變量名被保存在宏varlist中display if contains |if| *顯示字符串“if contains |條件語句|”,條件語句保存在宏if中
36、display in contains |in| display “ title contains |title|”end下面,在打開數(shù)據(jù)文件“usaauto.dta”的情況下,我們執(zhí)行這個程序。輸入命令:mysyn mpg weight length if foreign ,title(“my syntax”)這里,mysyn為命令名(即程序名),mpg、weight和length為變量,if foreign為條件語句,title()指標(biāo)題。mysyn后的各項即按照程序中指定的語法結(jié)構(gòu)所寫。5 標(biāo)記使用的觀測值標(biāo)記使用的觀測值有時,我們需要對命令中使用的觀測值進(jìn)行標(biāo)記。例如,程序要對不包含缺
37、失值的觀測值計算統(tǒng)計量(例如線性回歸);或程序設(shè)定了條件語句、范圍語句等,需要確認(rèn)其所使用的觀測值。由于很多程序錯誤產(chǎn)生于在程序的不同部分使用不同的樣本,因此,我們強(qiáng)烈建議在程序的開始處對樣本進(jìn)行標(biāo)記。Stata有專門的命令來生成標(biāo)記變量,對使用的觀測值進(jìn)行標(biāo)記。這種變量為臨時變量,取值為0或1;如果觀測值在隨后的編碼中被使用,則臨時變量取值為1,若未被使用,則取值為0。下面,我們對相關(guān)命令進(jìn)行介紹。(1)生成標(biāo)記變量在語法(syntax)命令之后生成標(biāo)記變量的命令格式為:marksample lmacname , novarlist strok zeroweight noby這里,marks
38、ample是生成標(biāo)記變量的基本格式;lmacname為局部宏的名字,該宏用于保存臨時變量的信息,如果某觀測值的標(biāo)記變量取值為1,就表示該觀測值在命令執(zhí)行中被使用;選項novarlist表示不排除包含缺失值的觀測值;strok表示varlist中的變量可以是字符串(string is OK);zeroweight表示不排除權(quán)重為0的觀測值;選項noby只有在程序設(shè)定了byable(recall)選項時才可以使用,它表示,在標(biāo)記樣本時,分組限制被忽略也就是說,marksample會像未設(shè)定by前綴那樣來生成標(biāo)記變量。marksample的通常使用形式是這樣的:program syntax mark
39、sample touse rest of code if touseend這里,我們使用局部宏touse作為標(biāo)記變量;這是一種慣例,而非要求。但為了保持程序間的一致性,我們推薦使用該名字。此外,倒數(shù)第二行命令含義為,如果宏touse的值為1(即樣本被使用),則對其進(jìn)行相關(guān)的操作;“rest of code”指相應(yīng)的操作的命令。此外,我們在應(yīng)用該命令時可以生成多個標(biāo)記變量,分別為其設(shè)定不同的選項,從而標(biāo)記不同的觀測值。(2)設(shè)定臨時變量為標(biāo)記變量如果我們已生成臨時變量,且要將觀測值是否被使用的信息保存到該臨時變量中,可使用如下的命令格式:mark newmarkvar if in weight
40、, zeroweight noby其中,mark是生成標(biāo)記變量的基本命令,newmarkvar是已生成的臨時變量的名稱,if代表條件語句,in代表范圍語句,weight代表權(quán)重語句。選項zeroweight和noby的含義與marksample處相同。需要說明的一點是,相比起marksample,該命令較少被使用。因為如果之前的語法中設(shè)定了條件語句等,mark命令也需要設(shè)定相應(yīng)的語句,且往往還要通過markout來設(shè)定varlist(見下一部分);而marksample可自動完成這些,不容易有遺漏項。(3)調(diào)整標(biāo)記變量在命令mark或marksample之后,如果于varlist的變量之外又有
41、了新的變量,或者,如果varlist中變量包含缺失值的觀測值都要被排除掉(即令標(biāo)記變量為0),我們可使用如下命令:markout markvar varlist , strok sysmissokmarkout是調(diào)整標(biāo)記變量的基本命令,markvar是前面設(shè)定的標(biāo)記變量名稱,varlist代表相關(guān)的變量名,選項strok表示允許字符串變量。最后,選項sysmissok表示系統(tǒng)缺失值(.)是允許的,但擴(kuò)展缺失值(形如.a、.b等)會被排除;默認(rèn)是包含任何類型缺失值的樣本都會被排除。下面,我們給出一個同時利用mark命令和markout命令的例子:program myprogversion 10s
42、yntax varlist if intempvar tousemark touse if inmarkout touse varlistend這里,mark命令依據(jù)條件語句和范圍語句來生成臨時變量touse;而如果沒有條件語句或范圍語句,則每個觀測值的touse值都是1。之后,markout命令會對標(biāo)記變量進(jìn)行更新,對于touse值為1的變量,Stata會檢查varlist的值是否缺失,如果有缺失值,則將相應(yīng)觀測值的touse值修正為0。在后面的數(shù)據(jù)管理或統(tǒng)計量計算的命令中,加上條件語句“if touse”會將命令的執(zhí)行限制在合適的樣本之中。(4)標(biāo)記變量的適用規(guī)則不管使用的是marksam
43、ple還是mark,以及它們后面有沒有markout,如下的一些規(guī)則都適用:1.觀測值的權(quán)重為0時,標(biāo)記變量被設(shè)定為0(設(shè)定選項zeroweight除外)。2.如果權(quán)重weight無效(像某些觀測值的權(quán)重小于0,或者頻率權(quán)重不是整數(shù)等),程序會被停止,且Stata會返回錯誤信息。3.如果觀測值不滿足條件語句(if),則標(biāo)記變量被設(shè)為0。4.如果觀測值不滿足范圍語句(in),標(biāo)記變量被設(shè)為0。5.如果varlist中的任何一個數(shù)值變量包含數(shù)值缺失值,標(biāo)記變量的值為0。6.如果varlist中有變量為字符串型,則所有觀測值的標(biāo)記變量為0(設(shè)定選項strok除外)。7.其他情況,標(biāo)記變量的值為1。(
44、5)尋找選定觀測值的范圍尋找選定觀測值的范圍的基本命令為:markin if in , name(lclname) noby這里,markin是尋找選定觀測值范圍的基本命令,if為條件語句,in為范圍語句,選項name()用于指定新生成的局部宏的名字,如果不設(shè)定該選項,名字in會被使用。命令markin用在marksample、mark或markout之后,且在使用時要很小心,因為該命令永遠(yuǎn)都不是必須的。但如果我們知道,前面命令的條件語句將選取很多觀察值的一個很小的樣本(例如,從58000個中選10個),且這些觀測值的序號有比較接近,則使用markin命令能使程序執(zhí)行得更快。使用該命令的一種方
45、法是,先寫出一個不帶該命令的程序,然后在定義標(biāo)記變量之后,加入這樣的語句:markin if touse 并在后面所有使用if touse的命令后面(這里,我們假定標(biāo)記變量被命名為touse)同時加上in(假定沒有指定新的局部宏的名字)。6 輸入?yún)?shù)的解析輸入?yún)?shù)的解析如果想對宏進(jìn)行分解,獲取所需的部分,我們可以通過tokenize或gettoken命令來實現(xiàn)。相比起語法(syntax)命令,這種解析方式也被稱為低水平語法分析。下面,我們對這兩個命令分別進(jìn)行介紹。(1)tokenize通過tokenize將宏分解成幾部分的基本命令為:tokenize ” string “ , parse(“p
46、chars”)其中,tokenize是解析宏的基本命令,string代表要分解的宏的名稱,選項parse(“pchars”)表示用pchars作為各個部分的分隔符,默認(rèn)為空格。tokenize命令會將指定的宏分解為幾個記號(token),并依次將各部分保存在局部宏1、 2中。下面,我們通過一個例子來說明該命令的應(yīng)用。輸入命令:local str A strange+string (定義局部宏str)tokenize str, parse( +) (將str進(jìn)行分解,設(shè)定分隔符為空格和加號)di 1=|1|, 2=|2|, 3=|3|, 4=|4|, 5=|5|, 6=|6| (顯示分解的各個部
47、分)我們得到如下的結(jié)果:1=|A|, 2=|strange|, 3=|+|, 4=|+|, 5=|string|, 6=|通過這個例子,我們可以看出,多個符號可以同時被用作分隔符(這里是空格和加號);空格被用作分隔符時不會被保存在數(shù)值宏中,但其他字符被用作分隔符時會被保存在數(shù)值宏中(這里是宏3和4)。tokenize命令對于分解語法命令(syntax)輸入的參數(shù)很方便。例如,可能有如下的形式:program myprogversion 10syntax varlist if inmarksample tousetokenize varlist /對輸入的變量進(jìn)行分解local first 1
48、/將分解后的第一個變量的局部宏命名為firstmacro shift /宏轉(zhuǎn)移,即原來第i個宏現(xiàn)在變?yōu)榈趇-1個。local rest * /將剩余的宏命名為restend(2)gettokengettoken提供了解析輸入?yún)?shù)的另一途徑,其基本命令格式為:gettoken emname1 emname2 : emname3 , parse(pchars) quotes qed(lmacname) match(lmacname) bind其中,gettoken是解析參數(shù)的基本命令。選項parse(“pchars”)表示用pchars作為各個部分(記號)的分隔符,pchars默認(rèn)為空格。該命令會
49、獲取宏emname3分隔符之前的記號(token),并將其存儲在宏emname1中。如果同時設(shè)定了宏emname2,則Stata會將剩下的記號存儲在宏emname2中。宏emname1和emname3,或者宏emname2和emname3,可以有相同的名字。宏emname可以有如下三種形式:macroname 局部宏(local) macroname 局部宏(global) macroname 全局宏對于其他的選項,quotes表示宏emname1內(nèi)容的外引號被保留;該選項不影響宏emname2,因為它總是保留其內(nèi)容的外引號。qed(lmacname)表示生成一個局部宏lmacname;如果返
50、回的記號(token)在初始字符串中為引號所包圍,則其值為1,否則為0。match(lmacname)表示,在決定記號時,括號會被匹配;此外,在記號被存儲在宏emname1之前,括號會被移除;而如果有括號,局部宏lmacname 的值為“(”,否則,就是空串。bind表示小括號()或中括號中的內(nèi)容會被當(dāng)做一個記號,即便分隔符不是括號。通常情況下, gettoken命令的運用方式是這樣的:gettoken emname1 : 0 , options或 gettoken emname1 0 : 0 , options這里,宏0包含了用戶所鍵入的內(nèi)容。第一種方式會將取出的第一個token保存到宏em
51、name1中;而第二種方式還會將剩下的部分再保存到宏0中。下面,我們通過一個交互式例子來進(jìn)一步加深對gettoken命令的理解。首先,我們定義一個局部宏str。輸入命令:local str panel+data time+series 這里,str的內(nèi)容為panel+data time+series。下面,我們對其進(jìn)行解析并顯示結(jié)果。輸入命令:gettoken left : strdisplay left這里,第一步我們對str進(jìn)行解析,以空格為分隔符,并將獲得的token放到宏left中。第二步顯示宏left的內(nèi)容。結(jié)果為:panel+data下面,我們來看一下宏str的內(nèi)容。輸入命令:di
52、splay str注意,我們在宏str之外用了復(fù)合雙引號 。這里,中間的雙引號為了表示字符串,是必須的;而外面的局部宏單引號不是必須的,但它能在一些情況下避免很多雙引號導(dǎo)致的配對混亂。上面命令的結(jié)果為:panel+data time+series可見,取出一個token之后,原序列沒有改變。下面,繼續(xù)對str進(jìn)行解析,并顯示結(jié)果。命令為:gettoken left str : str, parse( +) display left第一步中,我們以空格和加號為分隔符進(jìn)行解析,并將獲得的token放到宏left中,剩余的token還放到str中。第二步是顯示宏left的內(nèi)容。結(jié)果為:panel下面
53、,我們看一下宏str的內(nèi)容:display str 結(jié)果為:+data time+series也就是說,當(dāng)原序列的宏名稱和剩余符號的宏名稱相同時,該宏的內(nèi)容會被更新為剩余符號,即原來的字符串減去獲取的字符串之后的內(nèi)容。下面,我們對str繼續(xù)進(jìn)行解析,以空格和加號為分隔符,將獲得的token放到宏next中,剩余的token還放到str中g(shù)ettoken next str : str, parse( +)display next結(jié)果為:+也就是說,空格之外的分隔符也會被獲取,并保存到局部宏內(nèi)。最后,我們來看一下剩下的str的內(nèi)容:display str結(jié)果為:data time+series7
54、程序結(jié)果程序結(jié)果如我們本實驗第一小節(jié)所講,保存結(jié)果的程序(或者說相應(yīng)的命令)可分為三種類型:r類、e類和s類。下面,我們分別對其進(jìn)行講解。(1)保存結(jié)果的程序類型簡介1.r類命令,像summarize,其結(jié)果被保存在r()中。大部分命令都是r類命令。2.e類命令,像regress,其結(jié)果被保存在e()中。e類命令是Stata的模型估計命令。3.s類命令。其結(jié)果被保存在s()中。這類命令比較少見,有時在編程中會使用。在運行完一個r類命令之后,我們可以輸入如下命令來看一下Stata保存的結(jié)果:return list類似地,運行完一個e類命令后,如下命令可用來查看Stata保存的結(jié)果:ereturn
55、 list對于e類命令而言,用于估計的命令的名稱被保存在e(cmd)中。例如,OLS回歸之后,“regress”被保存在e(cmd)中。而完整的命令被保存在e(cmdline)中。例如,OLS回歸的完整命令為“regress mpg weight displ”,則e(cmdline)會返回“regress mpg weight displ”。估計中使用的觀測值個數(shù)被保存在e(N)中,而各觀測值是否在估計中被使用則被保存在e(sample)中。例如,輸入命令:summarize if e(sample)則我們會獲得估計值使用的各觀測值的描述統(tǒng)計量。系數(shù)向量和方差協(xié)方差矩陣分別被保存在e(b)和e
56、(V)中。要獲得系數(shù)及其標(biāo)準(zhǔn)差,可通過_bname和_sename,這里,name指變量名。其他保存在各命令e()結(jié)果中的標(biāo)量、宏或矩陣可參見相應(yīng)的命令說明。在命令窗口輸入:help 命令名我們將得到相應(yīng)命令的幫助文件,其中就列出了各個保存的結(jié)果。(2)將結(jié)果保存在r()此外,在編寫程序的過程中,我們也會希望將一些結(jié)果保存下來。而對于這三種類型的程序,保存結(jié)果的命令稍有不同。下面,我們進(jìn)行詳細(xì)的講解。在程序中,將結(jié)果保存在r()中的命令有:return scalar name = exp return local name return matrix name matname其中,第一種是保存
57、標(biāo)量(scalar),第二種是保存局部宏(local),第三種是保存矩陣(matrix)。例如,我們要編寫一個程序,匯報某變量的均值和標(biāo)準(zhǔn)差。我們可以寫出如下的一些命令:program meanse, rclass (令程序名為meanse,程序類型為r類)quietly summarize 1 (計算輸入的第一個變量的描述統(tǒng)計量,不顯示結(jié)果)local mean = r(mean) (將該變量的均值(r(mean))保存到局部宏mean中)local se = sqrt(r(Var)/r(N) (將該變量的標(biāo)準(zhǔn)差保存到局部宏se中)display mean = mean (顯示字符串“mea
58、n=”和局部宏mean的值)display SE of mean = se (顯示字符串“SE of mean=”和局部宏se的值)return scalar mean = mean (返回標(biāo)量mean,其值等于局部宏mean的值)return scalar se = se (返回標(biāo)量se,其值等于局部宏se的值)end可以將上面的程序輸入到命令窗口中,或保存到do或ado文件中去(若是保存到do文件中,需要先執(zhí)行do文件,然后才可以應(yīng)用命令)。然后,打開數(shù)據(jù)文件“usaauto.dta”,我們來看一下變量price的均值和標(biāo)準(zhǔn)差。輸入命令:meanse price下面,我們看一下該程序的返回
59、值。輸入命令:return list當(dāng)然,對于前面的程序,我們也可以不定義局部宏,而直接使用return命令。等價的程序為:program mymeanse, rclassquietly summarize 1return scalar mean = r(mean)return scalar se = sqrt(r(Var)/r(N)display mean = return(mean)display SE of mean = return(se)end需要注意的是,程序內(nèi)容的最后兩行我們使用了return(mean)和return(se)。這里,函數(shù)return()和r()的含義是一樣的,但
60、Stata在程序的運行過程中會將要返回的結(jié)果保存在return()中,而當(dāng)程序運行結(jié)束后,才由return()傳遞到r()中。從而,在程序運行過程中,如果要使用程序的返回值,應(yīng)使用函數(shù)return()而非r()。(3)將結(jié)果保存在e()將結(jié)果保存在e()中的命令為:ereturn scalar name = exp ereturn local name ereturn matrix name matname其中,第一種是保存標(biāo)量(scalar),第二種是保存局部宏(local),第三種是保存矩陣(matrix)。e類程序大多數(shù)地方都與r類程序類似,但也有幾點不同。在命令ereturn scal
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年黔南道路運輸從業(yè)資格證考試內(nèi)容是什么
- 土地開發(fā)居間合同
- 高效事務(wù)處理規(guī)范手冊
- 三農(nóng)旅游規(guī)劃指南
- 農(nóng)業(yè)設(shè)施大棚購銷合同
- 合同支付條款補(bǔ)充協(xié)議書
- 2025年山東貨運從業(yè)資格證考試模擬試題及答案
- 個人信息安全保護(hù)與管理預(yù)案
- 2025年吳忠道路運輸從業(yè)資格證考試模擬試題
- 商鋪出租遞增合同
- 頸動脈狹窄的護(hù)理查房
- 中國后循環(huán)缺血的專家共識48506課件
- 信用管理概論課件整書電子教案完整版教學(xué)課件全套ppt教學(xué)教程最全課件最新
- 思想道德與法治全冊教案
- (高職)旅游景區(qū)服務(wù)與管理電子課件完整版PPT全書電子教案
- 唯美動畫生日快樂電子相冊視頻動態(tài)PPT模板
- 設(shè)計文件簽收表(一)
- 試運行方案計劃-
- 可研匯報0625(專家評審)
- 帶電核相試驗報告
- SCH壁厚等級對照表
評論
0/150
提交評論