官术网_书友最值得收藏!

Stata統計分析從入門到精通

1.6 常用的幾種處理數據的操作

下載資源:\video\第1章\…

下載資源:\sample\第1章\數據1B、數據1C、數據1D、數據1E、數據1F

1.6.1 Stata 16.0的數據類型

在Stata 16.0中,數據類型主要包括3種,分別是數值型數據、字符型數據和日期型數據。

數值型數據由數字、正負號和小數點所組成,包括5個子類,默認類型為float,如表1.5所示。

表1.5 數值型數據

字符型數據由字母、特殊符號和數字所組成,一般會被保存為str#格式,str后面的數字代表最大字符長度,如str8表示可容納最大長度為8個字符的字符型變量。字符型數據一般用英文狀態下的引號""進行標注,且引號一般不被視為字符型變量的一部分。

日期型數據有多種表達方式,例如2019年6月25日,可以寫為20190625,也可以寫為25062019等。

提示

對于日期型數據,Stata將1960年1月1日視為第0天,該日期之前的天數為負值,比如1959年12月29日為第-3天。

1.6.2 對數據進行長短變換

在對數據進行分析時,可能會遇到需要針對現有的數據進行預處理的情況。在本小節中,我們將通過示例來講解常用的幾種處理數據的操作,包括對數據進行長短變換、類型變換、生成隨機數、數據壓縮、按變量合并或拆分數據文件、按樣本觀測值合并或拆分數據文件、添加標簽、對數據進行排序等。我們首先講解對數據進行長短變換,以“數據1B”數據文件為例說明。

在“數據1B”數據文件中,我們設置了4個變量,分別是province、amount2018、amount2019、amount2020。在命令窗口中依次輸入以下命令:

reshape long amount,i( province) j(year)(本命令的含義是將數據進行長短變換)

圖1.43是將數據進行長短變換的結果。在數據編輯器界面可以看到如圖1.44所示的變換后的數據。

圖1.43 將數據進行長短變換的結果

圖1.44 變換后的數據

reshape wide amount,i( province) j(year)(本命令的含義是將數據變換回來)

圖1.45是將數據變換回來,并把表示地區的字符串變量轉換成數值數據的結果。在數據編輯器界面可以看到如圖1.46所示的變換后的數據。

圖1.45 轉換成數值數據的結果

圖1.46 變換后的數據

1.6.3 對數據進行類型變換

在很多情況下,用戶需要對數據進行類型變換,比如字符型變量不能進行數值計算,如果讓字符型變量參與數值計算,Stata就會提示錯誤,此時就有必要將字符型變量轉化成數值型變量。用于對數據進行類型變換的常用命令有4個,下面一一說明。

1)encode:從字符串變量轉換到數值變量,該命令的語法格式為:

encode varname [if] [in],generate(newvar)[label(name)noextend]

其中generate(newvar) 選項是必須設定的,它作為轉換后的新數值型變量的變量名。label(name)用于指定轉換后的數值型變量的值標簽名,如果未指定label(name)選項,則轉換后的數值型變量的值標簽名與其變量名相同。只有當label(name)選項指定了新生成變量的值標簽,才可以指定noextend選項,如果label(name)選項所指定的值標簽中沒有varname包含的值,則不會對varname進行編碼。默認情況下,label(name)選項的值標簽中不存在的值都將添加到該標簽中。

2)decode:從數值變量轉換到字符串變量,該命令的語法格式為:

decode varname [if] [in],generate(newvar) [maxlength(#)]

其中generate(newvar)選項是必須設定的,它作為轉換后的新數值型變量的變量名。maxlength(#)選項用于設定轉換后的字符型變量的長度,#的設置值必須在1~32000(字節)。在默認情況下,字符型變量的長度為32000字節。

3)destring:將字符串變量轉換為數值變量,該命令的語法格式為:

destring [varlist],{generate(newvarlist)|replace} [destring options]

destring命令將varlist中的變量從字符串轉換為數值。varlist是進行數據轉化的變量列表,generate(newvarlist) | replace表示生成新的變量或者替換掉原來的變量。options是一些可選項,如果未指定varlist,則destring將嘗試將數據集中的所有變量從字符串轉換為數值。

4)tostring:將數值變量轉換為字符串變量,該命令的語法格式為:

tostring varlist,{generate(newvarlist)|replace} [tostring options]

tostring將varlist中的變量從數值轉換為字符串,是使用最緊湊的字符串格式。varlist中已經是字符串的變量將不會被轉換。

注意

讀者可以看到encode與destring類似,decode和tostring類似,不過它們的差別在于:

1)encode、decode命令是針對varname、newvar的,是變量的概念;而destring、tostring命令是針對varlist、newvarlist的,是變量列表的概念。varlist是一個變量列表。變量列表中的變量要么引用新的(尚未創建的)變量,要么引用現有的變量。一個newvarlist總是專有地引用新的(尚未創建的)變量。類似地,varname指向一個變量,可以是現有的變量,也可以是尚未創建的變量。newvar總是指向一個新變量。

2)encode命令用于給字符型變量重新編碼,它只是返回轉換后的數值型變量的標簽,而不是將原來的以字符型存儲的數值變量轉換為真正意義上的數值變量。所以,從應用的角度,如果用戶只是想為字符型變量貼上1,2,3等表示序號的編碼值,將原來的字符型數據設置為轉換后的數值型變量的標簽,則使用 encode 命令即可;而如果是想在真正意義上將字符型變量轉換為數值型變量,則要使用 destring 命令。decode和tostring命令也具有類似的差別。

下面的示例還是基于“數據1B”數據文件,不過在對數據進行長短變換后,在命令窗口中輸入以下命令:

encode province,gen(regi) (本命令的含義是把表示地區的字符串變量轉換成數值數據的變量)

decode regi,gen(regi1) (本命令的含義是把數值數據的變量轉換成表示地區的字符串變量)

結果如圖1.47所示。

圖1.47 查看數據

然后在命令窗口中輸入以下命令:

des(describe命令的簡寫,該命令旨在生成數據集的摘要)

結果如圖1.48所示,可以發現year、amount為數值型。

圖1.48 數據摘要

然后在命令窗口中輸入以下命令:

tostring year amount, generate(yearnew amountnew)(以生成新的變量yearnew amountnew的方式,將year amount從數值型變量轉換為字符型變量)

des(describe命令的簡寫,該命令旨在生成數據集的摘要)

上述命令的執行結果如圖1.49所示,可以發現新生成的變量yearnew amountnew已經變成了字符型。其中yearnew為str4,amountnew為str2,這是因為數據文件中變量year的各樣本觀測值最長是4位,變量amountnew的各樣本觀測值最長是2位,然后在命令窗口中輸入以下命令:

圖1.49 數據摘要

destring yearnew amountnew, generate(yearnew1 amountnew1)(以生成新的變量yearnew1 amountnew1的方式,將yearnew amountnew從字符型變量轉換為數值型變量)

des(describe命令的簡寫,該命令旨在生成數據集的摘要)

上述命令的執行結果如圖1.50所示,可以發現新生成的變量yearnew1 amountnew1已經變成了數值型,其中yearnew1為int子類型,amountnew1為byte子類型。

圖1.50 數據摘要

注意

在使用destring命令時,需要確保各樣本觀測值的所有字符均為數字字符。

1.6.4 生成隨機數

在命令窗口中依次輸入以下命令:

clear (本命令的含義是清除原有數據)

set obs 15 (本命令的含義是設置一個包含15個樣本的數據集)

generate suiji=uniform() (本命令的含義是生成一個隨機變量,里面包含0~1的15個隨機數據)

上述命令的執行結果如圖1.51所示。

圖1.51 隨機數據

然后在命令窗口中輸入:

clear (本命令的含義是清除原有數據)

set obs 15 (本命令的含義是設置一個包含15個樣本的數據集)

generate suiji=9+9*uniform() (本命令的含義是生成一個隨機變量,里面包含[9,18]區間15個隨機數據)

上述命令的執行結果如圖1.52所示。然后在命令窗口中輸入:

clear (本命令的含義是清除原有數據)

set obs 15 (本命令的含義是設置一個包含15個樣本的數據集)

generate suiji=9+trunc(9*uniform()) (本命令的含義是生成一個隨機變量,里面包含[9,18]區間的15個隨機數據,且數據為整數)

上述命令的執行結果如圖1.53所示。

圖1.52 隨機取出15個數據

圖1.53 隨機取出15個數據且取整

1.6.5 數據壓縮

在很多情況下,需要對數據進行壓縮,在不改變數據內容和精度的前提下,減少存儲空間的占用。數據壓縮命令的語法格式為:

compress [varlist]

其中compress為Stata命令,varlist是需要被壓縮的變量,如果用戶沒有指定varlist,那么Stata將對整個數據文件進行壓縮。在命令窗口中輸入:

clear (本命令的含義是清除原有數據)

set obs 15 (本命令的含義是設置一個包含15個樣本的數據集)

gen t=15 (本命令的含義是生成一個名為t的變量,它的值為15)describe (本命令的含義是描述變量的基本情況)

上述命令的執行結果如圖1.54所示。可以發現變量t的類型為默認的float。

然后在命令窗口中輸入:

compress t (本命令的含義是對變量t進行壓縮)

describe (本命令的含義是描述變量的基本情況)

上述命令的執行結果如圖1.55所示。可以發現變量t的類型已經被壓縮成了占用存儲空間較小的byte類型。

圖1.54 生成變量t

圖1.55 對變量t進行壓縮

1.6.6 按變量合并、拆分數據文件

在進行很多數據的處理時,往往需要將兩個結構相同或某些部分結構相同的數據文件合并成一個文件,比如兩家公司進行了兼并,需要將這兩家公司的員工信息表合并為一個信息表,這時就需要對數據文件進行樣本觀測值的合并;又比如某公司領導想將員工的績效考核數據和工資薪酬數據放在一起進行數據分析,就需要將員工績效考核信息表和員工工資薪酬信息表進行合并,這時還需要對數據進行變量的合并。

所以Stata中的數據合并也分為兩種:一種是觀測值的合并,因為觀測值在Stata的數據編輯器視圖中是以行來呈現的,因而又被稱為縱向合并,也就是將兩個有相同變量但具有不同觀測值的數據進行合并;另一種是變量的合并,因為變量在Stata的數據編輯器視圖中是以列來呈現的,所以又被稱為橫向合并,也就是將描述同一組觀測樣本的不同變量合并為一個數據文件,新的數據文件包含所有合并前的各個數據的變量。

本節先介紹按變量合并數據文件,是指將一個外部文件中的若干變量添加到當前工作文件中,即橫向合并。按變量合并數據文件,除了“通過觀察進行一對一的合并”方式外,增加變量這種合并要求兩個數據文件必須具有一個或者多個共同的關鍵變量,而且這兩個文件中的關鍵變量具有一定數量的相等的觀測量數值。所謂關鍵變量,指的是兩個數據文件中變量名、變量類型、變量值排序完全相同的變量。按變量合并數據文件的命令為merge,依據合并方法的不同,有5種命令的語法格式,分別說明如表1.6所示。

表1.6 5種合并方式說明

varlist為進行合并的關鍵變量。using filename指的是要與源文件合并的文件名及文件路徑。默認情況下,merge命令執行后會創建一個新變量_merge,其中包含與合并數據集中的每個觀察的源和內容有關的數字代碼。[,options]包括很多選項,常用的幾個選項說明如下:

1)keepusing(varlist):用來保留合并時using dataset中的部分變量,默認保留全部。

2)generate(newvar):產生一個新的用來標記合并結果的變量,默認是_merge。

3)nogenerate:不創建_merge變量。

4)noreport:不顯示匹配結果的匯總表。

5)update:使用被合并數據集中變量的值更新主數據集中同名變量的缺失值,主數據集中的非缺失值不變。

6)replace:使用被合并數據集中變量的非缺失值代替主數據集中同名變量的值,被合并數據集中的缺失值對應的主數據集中的同名變量值不變。此選項要和update一起使用。

7)force:強制字符串/數字變量類型匹配而不會出錯。

此處以本書附帶的“數據1C”和“數據1D”數據文件為例進行說明,在命令窗口中輸入:

use "C:\Users\Administrator\Desktop\數據1C.dta"(本命令的含義是打開“數據1C”數據文件)

merge m:m y1 using "C:\Users\Administrator\Desktop\數據1D.dta"(本命令的含義是將y1作為關鍵變量,將“數據1D”數據文件中的變量橫向合并進“數據1C”數據文件中)

主界面顯示的合并結果和數據編輯器界面顯示的合并結果分別如圖1.56和圖1.57所示。操作完成后,可以發現“數據1D”數據文件中的y2、y3被合并進了“數據1C”數據文件中。此外還多了一個名為_merge的變量,這個變量將顯示合并的情況,如果數值為3,則合并成功,如果數值為1或2,則合并失敗。

圖1.56 主界面顯示的合并結果

圖1.57 數據編輯器界面顯示的合并結果

合并之后如何再回到原來的狀態,或者如何對數據文件按照變量進行橫向拆分呢?前面在1.3節介紹的drop命令和keep命令就可以達到按變量拆分數據文件的目的。

我們可以先將新生成的橫向合并后的數據文件復制一份,然后在命令窗口中輸入:

drop y2 y3 _merge(本命令的含義是從當前數據文件中刪除y2 y3 _merge三個變量)

然后選擇菜單“文件|保存”,即可恢復到原來“數據1C”數據文件的狀態。

在復制數據文件的命令窗口中輸入:

drop y4 y5 y6 _merge(本命令的含義是從當前數據文件中刪除y4、y5、y6、_merge四個變量)

然后選擇菜單“文件|保存”,即可恢復到原來“數據1D”數據文件的狀態。

1.6.7 按樣本觀測值合并、拆分數據文件

接下來介紹按樣本觀測值合并數據文件(即縱向合并),將會增加觀測量,把一個外部文件中與源文件具有相同變量的觀測量增加到當前工作文件中。這種合并要求兩個數據文件至少應具有一個屬性相同的變量,即使它們的變量名不同。按變量合并數據文件的命令為append,該命令的語法格式如下:

append using filename [filename…] [,options]

using filename指的是要與源文件合并的文件名及文件路徑。用戶可以用雙引號引住文件名,如果文件名中包含空格或其他特殊字符,用戶則必須這樣做。

此處以本書附帶的“數據1E”和“數據1F”數據文件為例進行說明,在命令窗口中輸入:

use "C:\Users\Administrator\Desktop\數據1E.dta"(本命令的含義是打開“數據1C”數據文件)

des(describe命令的簡寫,該命令旨在生成數據集的摘要)

上述命令的執行結果如圖1.58所示,可以發現共有樣本觀測值(obs)30個、變量(vars)6個。

圖1.58 縱向合并前的數據集摘要

append using "C:\Users\Administrator\Desktop\數據1F.dta"(本命令的含義是將“數據1F”數據文件縱向合并進當前的“數據1E”數據文件中)

des(describe命令的簡寫,該命令旨在生成數據集的摘要)

上述命令的執行結果如圖1.59所示,可以發現共有樣本觀測值(obs)67個、變量(vars)6個。“數據1F”數據文件被縱向合并進了當前的“數據1E”數據文件中。

圖1.59 縱向合并后的數據集摘要

合并之后如何再回到原來的狀態,或者如何對數據文件按照變量進行縱向拆分呢?前面我們在1.3節介紹的drop命令和keep命令就可以達到按變量拆分數據文件的目的。

我們可以先將新生成的縱向合并后的數據文件復制一份,然后在命令窗口中輸入:

drop in 31/67(本命令的含義是從當前數據文件中刪除第31~67個樣本觀測值)

然后選擇菜單“文件|保存”,即可恢復到原來“數據1E”數據文件的狀態。

在復制數據文件的命令窗口中輸入:

drop in 1/30(本命令的含義是從當前數據文件中刪除第1~30個樣本觀測值)

然后選擇菜單“文件|保存”,即可恢復到原來“數據1F”數據文件的狀態。

1.6.8 添加標簽

Stata可以為數據庫、變量、樣本觀測值添加標簽,添加標簽的目的是為了使用戶更加清晰地知曉相關數據庫、變量、樣本觀測值的具體含義。

1)為數據庫添加標簽的命令及其語法格式為:

label data ["label"]

["label"]代表所要添加的標簽內容。用戶通過該命令在內存中向數據集附加一個標簽(最多80個字符)。后續在使用數據集和描述數據集時將顯示數據集標簽。如果沒有指定標簽(即未設置["label"],僅輸入命令label data),將刪除任何現有的標簽。

2)為變量添加標簽的命令及其語法格式為:

label variable varname ["label"]

varname代表所要添加標簽的變量,["label"]代表所要添加的標簽內容。用戶通過該命令將標簽(最多80個字符)附加到指定的變量上。如果沒有指定標簽(即未設置["label"],僅輸入命令label variable varname),則刪除任何現有的變量標簽。

3)定義值標簽的命令及其語法格式為:

label define lblname # "label" [# "label" ...] [,add modify replace nofix]

lblname代表所要定義的數值標簽,#代表所要定義的數值,"label"代表所要添加的標簽內容。需要用戶注意的是后方options的內容,其中add的作用是添加標簽內容,modify的作用是對已有的標簽內容進行修改,nofix的作用是要求Stata不改變標簽的內容而改變原變量的存儲容量。lblname最多可以包含65536個獨立標簽,單個標簽最長可達32000個字符。

4)給變量賦值標簽的命令及其語法格式為:

label values varlist lblname [,nofix]

varname代表將要添加標簽的變量,[lblname]代表剛剛定義的數據標簽。

5)列出值標簽名及其內容的命令及其語法格式為:

label list [lblname [lblname ...]]

用戶通過該命令列出存儲在內存中的值標簽名及其內容。

6)復制值標簽的命令的語法格式為:

label copy lblname [,replace]

用戶通過該命令復制一個已存在的值標簽。

7)刪除值標簽的命令的語法格式為:

label drop {lblname [lblname ...] | _all}

用戶通過該命令刪除一個已存在的值標簽。

8)在do-file中保存值標簽的命令及其語法格式為:

label save [lblname [lblname...]] using filename [,replace]

用戶通過該命令將值標簽定義保存在do-file中。這對于沒有附加到變量的值標簽特別有用,因為這些標簽沒有隨變量保存。

此處以本書附帶的“數據1E”數據文件為例進行說明,在命令窗口中輸入:

use "C:\Users\Administrator\Desktop\數據1E.dta"(本命令的含義是打開“數據1E”數據文件)

label data "嬰幼兒數據"(本命令的含義是為整個數據庫添加標簽“嬰幼兒數據”)

可以看到數據文件已經被加上了標簽“嬰幼兒數據”,如圖1.60所示。

圖1.60 數據文件標簽

然后在命令窗口中接著輸入命令:

label variable label variable y1 "序號"(本命令的含義是為變量y1添加標簽“序號”,注意原來該變量就有標簽,為“編號”,通過執行該命令,標簽變成了“序號”)

可以看到y1變量已經被加上了標簽“序號”,如圖1.61所示。

label define y2label 1 "male" 2 "female"

label values y2 y2label

其中,y2label表示標簽的名稱,1 "male" 2 "female"表示定義的規則,數字0的標簽是male,數字2的標簽是female。

在數據編輯器界面可以看到y2變量的值已經被加上了標簽,1為"male",2為"female",如圖1.62所示。

圖1.61 變量標簽

圖1.62 值標簽

標簽添加完以后,可以通過label dir命令查看已經建立標簽的相關內容。

1.6.9 對數據進行排序

在很多應用場景,用戶需要對數據進行排序處理。Stata排序命令主要為sort命令和gsort命令。

sort命令的語法格式為:

sort varlist [in] [,stable]

varlist代表將要進行排序的變量,[in]代表排序的范圍,[,stable]的含義是如果兩個觀測值相同,其順序保持與原數據相同。

gsort命令的語法格式為:

gsort [+|-] varname [[+|-] varname ...] [,generate(newvar) mfirst]

其中[+]表示按升序排列,[-]表示按降序排列,Stata默認升序排列。generate(newvar)表示排序之后生成新的變量,mfirst表示將缺失值排在最前面。

此處以本書附帶的“數據1E”數據文件為例進行說明,在命令窗口中輸入:

use "C:\Users\Administrator\Desktop\數據1E.dta"(本命令的含義是打開“數據1E”數據文件

sort y5 (本命令的含義是將“數據1E”數據文件中的樣本觀測值按變量y5從小到大排列)

上述命令的執行結果如圖1.63和圖1.64所示,其中圖1.63為排序前的數據,圖1.64為排序后的數據。

圖1.63 排序前的y5數據

圖1.64 排序后的y5數據

該操作也可以使用gsort命令完成,命令為:

gsort + y5

讀者可以自行執行一遍,查看執行結果是否與上述結果相同。

主站蜘蛛池模板: 建昌县| 军事| 乌兰察布市| 屏边| 樟树市| 绍兴县| 安龙县| 葵青区| 龙州县| 新疆| 垫江县| 石阡县| 穆棱市| 清水河县| 苍南县| 和平县| 淄博市| 北票市| 乃东县| 巴青县| 桐城市| 江西省| 昌邑市| 揭阳市| 通渭县| 茶陵县| 本溪市| 桐柏县| 东至县| 怀宁县| 苍梧县| 辉南县| 家居| 永德县| 湟中县| 安新县| 崇义县| 西宁市| 天津市| 岳阳县| 广饶县|