作者:謝作翰 | 連玉君 | (知乎 | 簡書 | 碼云)
1.1 數(shù)據(jù)讀取
1.1.1 自由格式數(shù)據(jù)
1.1.2 固定格式數(shù)據(jù)
1.2 數(shù)據(jù)文檔
1.2.1 數(shù)據(jù)標簽與注釋
1.2.2 變量標簽和注釋
1.2.3 值標簽
1.2.4 多語言標簽
1.3 創(chuàng)建新變量
1.3.1 生成和替換
1.3.2 運算符,表達式及函數(shù)
1.4 變量重編碼
1.1 數(shù)據(jù)讀取
在本節(jié)中,我們將討論如何讀取原始數(shù)據(jù)文件。如果您的數(shù)據(jù)來自其他統(tǒng)計軟件包(如SAS或SPSS),請考慮使用諸如Stat/Transfer
(www.stattransfer.com)或DBMSCopy(www.dataflux.com)之類的工具。Stata可以使用fdause命令來讀取SAS文件help fdause。Stata還可以導入和導出Excel電子表格,輸入help import excel以了解更多信息,并且可以從關系數(shù)據(jù)庫讀取數(shù)據(jù),輸入help odbc簡介。
1.1.1 自由格式數(shù)據(jù)
如果數(shù)據(jù)是自由格式——變量由空格,逗號或制表符分隔,則可以使用infile命令。有關自由格式文件的示例,請參閱http://data.princeton.edu/wws509/datasets上提供的計劃生育工作數(shù)據(jù)(請閱讀說明并單擊effort.raw)。這實質上是一個包含四列的文本文件,其中一列帶有國家名稱,另一列帶有數(shù)字變量,由空格分隔。我們可以使用該命令將數(shù)據(jù)讀入Stata
infile str14 country setting effort change using http://data.princeton.edu/wws509/datasets/effort.raw
該 infile命令后面跟著變量的名稱。由于國家名稱是一個字符串而不是數(shù)字變量,因此我們在名稱前加上str14,它將變量的類型設置為最多14個字符的字符串。所有其他變量都是數(shù)字。
該using后面跟著文件的名稱,該文件可以是計算機,本地網(wǎng)絡或互聯(lián)網(wǎng)上的文件。在這個例子中,我們直接從互聯(lián)網(wǎng)上讀取文件。更多信息help infile1。
還可以選擇webuse命令讀取該數(shù)據(jù)庫:
webuse set http://data.princeton.edu/wws509/datasets
webuse effort
首先將默認網(wǎng)址設置為普林斯頓數(shù)據(jù)庫,然后直接用webuse命令讀取相關文件。webuse 在stata小白系列中有更多介紹。
可用list查看所讀入數(shù)據(jù):
list in 1/3
┌─────────────────────────────────────┐
│ country setting effort change │
├─────────────────────────────────────┤
1. │ Bolivia 46 0 1 │
2. │ Brazil 74 0 10 │
3. │ Chile 89 16 29 │
└─────────────────────────────────────┘
1.1.2 固定格式數(shù)據(jù)
調查數(shù)據(jù)通常采用固定格式,每個案例有一個或多個記錄,每個記錄中的每個變量都處于固定位置。
讀取固定格式數(shù)據(jù)的最簡單方法是使用該infix命令指定每個變量所在的列。正如它發(fā)生的那樣,努力數(shù)據(jù)整齊排列在列中,所以我們可以閱讀它們如下:
infix str country 4-17 setting 23-24 effort 31-32 change 40-41 using
http://data.princeton.edu/wws509/datasets/effort.raw, clear
這表示country要從第4-17列讀取名稱, setting從第23-24 列讀取名稱。str指定該country是一個字符串變量,但不必指定寬度,因為寬度從列數(shù)限定中可以看出。
如果有大量的變量,應該考慮在一個單獨的文件上輸入名字和位置,這個文件又被稱為字典,然后可以用infix命令中調用字典。下面嘗試將以下字典內容輸入到名為effort.dct的文件中:
infix dictionary using http://data.princeton.edu/wws509/datasets/effort.raw {
str country 4-17
setting 23-24
effort 31-32
change 40-41
}
字典只接受*注釋,但必須出現(xiàn)在第一行之后。保存此文件后,可以使用以下命令讀取數(shù)據(jù):
infix using effort.dct, clear
請注意,您現(xiàn)在“使用”字典,它反過來“使用”數(shù)據(jù)文件。您可以使用表單指定它作為infix命令的選項,而不是在字典中指定數(shù)據(jù)文件的名稱。infix using dictionaryfile, using(datafile).第一個'using'指定字典,第二個'using'是指定數(shù)據(jù)文件的選項。如果要使用一個字典來讀取以相同格式存儲的多個數(shù)據(jù)文件,這一點尤其有用。更多信息,請參閱help infix。如果您的觀測值跨越多個記錄或線條,infix只要所有觀測記錄的記錄數(shù)量相同(不一定全部相同),仍然可以使用它們來讀取它們。欲了解更多信息,請參閱help infix。
infile命令也可以用于固定格式的數(shù)據(jù)和字典。這是一個非常強大的命令,它提供了許多不適用的選項infix; 例如它可以讓你在字典中定義變量標簽,但是語法有點復雜???code>help infile2。
1.2 數(shù)據(jù)文檔
在將數(shù)據(jù)讀入Stata之后,準備一些文檔很重要。在本節(jié)中,我們將看到如何創(chuàng)建數(shù)據(jù)集,變量和值標簽,以及如何為數(shù)據(jù)或變量創(chuàng)建注釋。
1.2.1 數(shù)據(jù)標簽與注釋
Stata允許您使用label data命令標記您的數(shù)據(jù)集,然后標記最多80個字符(Stata SE中為244)。您還可以使用notes命令,然后使用冒號和文本添加最多約64K字符的注釋:
label data "Family Planning Effort Data"
. notes: Source P.W. Mauldin and B. Berelson (1978).
Conditions of fertility decline in developing countries, 1965-75.
Studies in Family Planning, 9:89-147
數(shù)據(jù)用戶可以鍵入notes以查看您的注釋。仔細記錄您的數(shù)據(jù)總是會帶來回報。
1.2.2 變量標簽和注釋
您可以(也應該)使用label variable 命令來標記變量。命令后跟變量名稱和標簽(引號包圍,最多80k字符)。使用infile命令,您可以將這些標簽添加到字典中。否則,你應該準備一個帶有所有標簽的do文件。以下是如何為我們的數(shù)據(jù)集中的三個變量定義標簽:
label variable setting "Social Setting"
label variable effort "Family Planning Effort"
label variable change "Fertility Change"
Stata還允許您使用該命令將注釋添加到特定變量notes varname: text。請注意,該命令后面跟著一個變量名,然后是一個冒號:
. notes change: Percent decline in the crude birth rate (CBR)
the number of births per thousand population between 1965 and 1975.
鍵入describe,然后notes檢查我們到目前為止的工作。
1.2.3 值標簽
您還可以標記分類變量的值。我們的數(shù)據(jù)集沒有任何分類變量,但我們創(chuàng)建一個。我們將復制effort變量,然后將其分為三類,0-4,5-14和15+,它們分別代表弱,中等和強壯三個程度(前兩行中使用的generate和recode在下一節(jié)介紹,我們還展示了如何用一個命令完成所有這些步驟):
generate effortg = effort
recode effortg 0/4=1 5/14=2 15/max=3
(effortg: 20 changes made)
label define effortg 1 "Weak" 2 "Moderate" 3 "Strong", replace
label values effortg effortg
label variable effortg "Family Planning Effort (Grouped)"
Stata采用兩步法來定義標簽。首先定義一個標簽集,使用label define命令將整數(shù)代碼與標簽(最多80k)相關聯(lián)。然后,使用label values命令將該組標簽與變量相關聯(lián)。通常,標簽集和變量使用相同的名稱,就像我們在示例中所做的那樣。
這種方法的一個優(yōu)點是可以為多個變量使用同一組標簽。規(guī)范的例子是label define yesno 1 "yes" 0 "no",它可以與數(shù)據(jù)集中的所有0-1變量相關聯(lián),使用每個變量的形式命令label values variablename yesno。定義標簽時,如果標簽是單個單詞,則可以省略引號,但為了清晰起見,我更愿意使用它們。
可以使用add或者modify選項修改標簽集,使用label dir(僅列出名稱)或label list(列出名稱和標簽)列出標簽集,并使用label save將它們保存到一個do文件。輸入help label以了解更多信息。您也可以使用不同語言的標簽,如下所述。
1.2.4 多語言標簽
一個Stata文件可以用多種語言存儲標簽,并且您可以從一組到另一組自由移動。我將通過為我們的數(shù)據(jù)集創(chuàng)建西班牙語標簽來說明。遵循Stata建議,我們將使用ISO標準的雙字母語言代碼,en代表英文,es代表西班牙語。
首先我們使用label language用來重命名當前語言為en,并創(chuàng)建一個新的語言集es:
label language en, rename
(language default renamed en)
label language es, new
(language es now current language)
西班牙語標簽定義不會覆蓋相應的英文標簽,而是并行存在。值標簽命名時需小心些,不能直接將標簽集取名effortg.因為effortg僅表示變量和標簽之間的關聯(lián)。你需要定義一個新的標簽集; 我們在此取名ffortg_es,結合舊名稱和新語言代碼,然后將其與變量effortg相關聯(lián):
label define effortg_es 1 "Débil" 2 "Moderado" 3 "Fuerte"
label values effortg effortg_es
您可能想要嘗試命令describe現(xiàn)在??梢試L試用表格輸出:
table effortg
接下來,我們將語言改回英文并再次運行表格:
label language en
table effortg
更多信息,請鍵入 help label_language.
1.3 創(chuàng)建新變量
Stata創(chuàng)建新變量最重要的命令是generate/replace和recode,他們經常一起使用。
1.3.1 生成和替換
generate命令使用可以結合常量,變量,函數(shù),算術和邏輯運算符的表達式創(chuàng)建新變量.
gen settingsq = setting^2.
如果你打算在回歸中使用這個項,而且知道線性和二次項是高度相關的。那么在平方之前將變量中心化可能是個好主意。這里我們運行summarize,并使用quietly來抑制輸出,從存儲結果中檢索均值r(mean):
quietly summarize setting
gen settingcsq = (setting - r(mean))^2
請注意,我為此變量使用了不同的名稱。Stata不會讓你用generate來覆蓋現(xiàn)有的變量。如果你真的想替換舊變量的值使用replace。您也可以使用drop var_names從數(shù)據(jù)集中刪除一個或多個變量。
1.3.2 運算符,表達式及函數(shù)
下表顯示了您可以在表達式中使用的標準算術,邏輯和關系運算符:

Stata有大量的函數(shù),這里有一些常用的數(shù)學函數(shù),輸入help mathfun可以查看完整列表:

當參數(shù)是數(shù)據(jù)集中的變量時,這些函數(shù)會自動應用于所有觀察值。
Stata還具有生成隨機數(shù)的功能(在模擬中很有用),即uniform()。它還有一套廣泛的函數(shù)來計算概率分布(p值所需的)和它們的反函數(shù)(臨界值所需的),請參閱help density functions以獲取更多信息。
還有一些專門的函數(shù)用于處理字符串,請參閱help string functions,處理日期函數(shù),請參閱help date functions。
1.4 變量重編碼
recode命令作用是將數(shù)字變量轉化為類別變量。例如,假設一項生育率調查中對年齡在15歲至49歲的女性進行單身年齡分析.您想以5年為一個區(qū)間對樣本分組。可以使用命令:
gen age5 = int((age-15)/5)+1 if !missing(age)
但這只適用于間隔規(guī)則的情況。也可以其實用如下方法:
recode age (15/19=1) (20/24=2) (25/29=3) (30/34=4)
(35/39=5) (40/44=6) (45/49=7), gen(age5)
括號中的每個表達式都是一個重新編碼規(guī)則,由值的列表或范圍組成,后跟等號和新值。使用斜線指定的范圍包括兩個邊界,因此15/19是15到19,其也可以被指定為15 16 17 18 19或甚至15 16 17/19。您可以使用min參考最小值并max參考最大值,如在min/19和中44/max。當規(guī)則的形式為range = value時,括號可以省略,但它們通常有助于使命令更具可讀性。
值被分配到它們落在的第一個類別。從未分配給某個類別的值將保持原樣。您可以使用else(或*)作為最后一個子句來引用尚未分配的任何值?;蛘?,您可以使用missing和nonmissing引用未分配的缺失值和非缺失值; 這些必須是最后兩個語句,不能與其他語句相結合。
在我們的例子中,我們還使用了gen()選項生成一個新的變量age5,在這種情況下,新變量默認替換現(xiàn)有變量的值。我強烈建議您在重新編碼之前制作原始變量副本。
您也可以在重編碼時指定值標簽。選項label(label_name)允許您為創(chuàng)建的標簽分配一個名稱(默認與變量名稱相同)。下面是一個示例,顯示如何在一步進行重編碼和做值標簽。(上文中需使用四個命令)。
recode effort (0/4=1 Weak) (5/14=2 Moderate) (15/max=3 Strong)
, generate(efffortg) label(effortg)
對原始和重新編碼的變量進行交叉制表以檢查轉換是否按預期工作通常是一個好主意。