CFPS和CHARLS資料庫分析技巧大指南
歡迎投稿(薦稿)計量經濟圈,計量相關都行
編輯: @計量經濟圈(ID: econometrics666);來源: 統計學和量化研究 公眾號;計量經濟圈社群有相關資料庫。
在這裡講的數據分析和商業中用到的數據不同,不是那種用Excel表格匯總出來的數據,而是一個一個個體的數據,是通過抽樣方法,從一個大的總體(population)中抽取出來的樣本數據。這種數據,是學術研究中經常會用到的,通常會由若干個庫和模塊組成,通過一定的途徑進行合併,加權。在清理之後建模,來分析、處理自己的問題。
常用的抽樣數據有很多,比如作為截面數據代表的「中國綜合社會調查(China General Social Survey)」,作為面板數據(追蹤數據)代表的「中國家庭追蹤調查(China Family Panel Studies)」。還有一些比較時間比較長的數據,比如,北卡羅來納大學所做的「中國健康與營養追蹤調查(China Health and Nutrition Survey)」,北師大做的「中國家庭收入調查(China Household Income Projects)」等等。
數據很多,而且資料庫越來越龐雜,所以用起來不是那麼輕鬆。這就需要有一定的途徑去了解這些數據的用法。
今天,開始給大家介紹中國家庭追蹤調查的數據(CFPS)分析方法。數據的官網是:http://www.isss.edu.cn/cfps/。關於數據的一切介紹,可以通過官網來了解,在本文中不再贅述。
1.註冊和登錄
CFPS數據是北京大學中國社會科學調查中心負責實施的,2008、2009年分別進行了兩次試調查,之後從2010年開始正式調查。形式為追蹤調查,根據每個受訪者的信息,形成問卷並進一步編碼為資料庫。
如何獲得數據?需要使用自己單位所用的郵箱,比如後綴分別為「edu」、「org」、「gov」這種,機構郵箱很容易驗證通過審核,大概在兩三個工作日之內。由於數據是北大主持實施的,所以北大的學生可以直接通過校內門戶進行登錄,非常簡潔。之後就是在數據中心下載數據。
2.獲得數據
登陸進去之後,可以得到數據列表。如下圖:
在這時候,我們就可以下載所需的數據了。每期的數據都分成五個庫,並附有stata和SAS兩種數據格式。其實格式都無所謂,現在絕大多數的統計軟體功能都是想通的,互相轉化數據格式也是比較簡便的。在這裡,我們以stata格式的數據(.dta)為例進行介紹。
a)社區問卷資料庫 SAS格式(下載) STATA格式(下載)
b)家庭關係資料庫 SAS格式(下載) STATA格式(下載)
c)家庭問卷資料庫 SAS格式(下載) STATA格式(下載)
d)成人問卷資料庫 SAS格式(下載) STATA格式(下載)
e)少兒問卷資料庫 SAS格式(下載) STATA格式(下載)
得到的數據如下:
需要注意的是,CFPS的用戶手冊和使用說明是一定要提前研究的,這些文件,對於數據使用非常有幫助。這裡面,需要仔細閱讀的,包括:電訪問卷和面訪問卷、抽樣設計、編碼規則、家庭關係庫的分解與匹配、權重設計等等。這些材料有助於我們理解整個數據在抽樣過程中如何設計樣本框、如何實施抽樣方案、如何實施質量監控以及最後數據產品的產出。
3.數據分析
CFPS的數據分析是非常重要的部分,應該會分成幾個部分介紹。關於CFPS數據的分析,我應該不會特別側重某個庫來介紹,而是整體上如何處理變數,如何加權以及如何匹配不同的庫。
3.1 數據清理
當我們看到CFPS問卷的第一眼,直覺上,我們會立即懵掉:這個問卷太複雜了,涉及到了太多的條件和跳轉,稍微一不留神就有可能把某個條件忽略掉。這是為什麼呢?因為數據採集時候,採用的主要是CAPI系統,也就是計算機輔助面訪技術:被訪者在回答問題的時候,是利用的計算機問卷程序,在機器里,跳轉和邏輯都是自動的,不需要解釋;但落實到紙面上的問卷的時候,就會顯得異常複雜。所以,我們需要首先搞懂問卷中的內在邏輯,然後再逐次分析。在這裡,我不面面俱到地介紹所有的變數,僅取一些比較有代表性的變數來舉例。
數據清理的第一個問題,就是如何處理缺失值。在這裡,所列舉的數據僅僅是因為其形式有代表性而使用,並不一定探究其實際意義。
我使用的素材是CFPS2010年的社區庫,也就是「村居問卷」的數據。
第一題:如何使用循環
我們看A部分(基礎設施),A3題-您村/居地界內是否有以下設施?【可多選】此題目有15個選項,對應數據中ca3_s_1- ca3_s_15十五個選項。可以看出,在這裡,我們直覺上可以判斷,多選題被編碼成多元單選題,也就是每個選項對應一個二分類的題目「是」和「否」。但是否是這樣呢?
接下來,我們看,每個變數是如何編碼的,比較常用的方法是codebook這個命令,即:codebook ca3_s_1- ca3_s_15。空間有限,我只選擇兩個變數的編碼書來表示。
這個結果很出乎意料,它並不是一個多元單選題,而是一個多元多選題,而且,裡面還出現了負數,這個負數是什麼鬼?所以,我們需要把每個變數裡面每個單一的元素「擇(zhai二聲)」出來。
先講一個比較笨的方法,但通常不會出錯誤的。上代碼:
gen new1=.
replace new1=1 if ca3_s_1==1
replace new1=1 if ca3_s_2==1
...
replace new1=1 if ca3_s_15==1
label var new1 "商店"
這樣是否大功告成了?非也,我們還需要重複這個過程15遍。上面的命令,我們已經寫了17條,再寫15遍(共255條,太嚇人),豈不是要把人累死?所以,肯定會有簡單的方法。循環語句也就正好為此準備。
這個過程,實際上涉及到了兩重循環:第一重,生成從1到15的新變數;第二重,每個值都詢問了15次,因此每個新變數都要替換15次值。所以,我們要用兩次循環才可以。
第一次:
forval i=1/15{
gen new`i"=.
label var new`i" "這是第`i"個選項"
}
第二次:
forval i=1/15{
replace new1=1 if ca3_s_`i"==1
}
把以上第二次循環重複15次。
...
讀者可能又要問:這樣命令算下來,同樣仍然有49行之多(將大括弧{}所佔位置作為單獨一行),那麼,有沒有最簡便的?
方法都是為懶人準備的,所以一定會有的。請看下面代碼:
forval j=1/15{
gen f`j"=0
label var f`j" "有第`j"項設施的村子"
forval i=1/15{
replace f`j"=1 if ca3_s_`i"==`j" & ca3_s_`i" !=.
}
}
*
/*注釋:這其中有兩層關係:
1.每個題目都有15個選項
2.共問了15次
所以,在操作時,需要考慮將每個新生成項分別替換:
例如:
f1=0,替換f1=1 if ca3這個選項中15個子問題均為1;
f2=0,替換f2=1 if ca3這個選項中15個子問題均為2;
...
f15=0,替換f15=1 if ca3這個選項中15個子問題均為15.
由此可以推測出:
f1-f15是第一層關係;ca3這15個選項是第二層關係,即子關係。
設置循環時候,需要考慮兩層。*/
其實,仔細看來,CFPS資料庫中,大多數的變數都是同樣如此,需要非常複雜的邏輯操作,這時候,使用循環語句會帶來意想不到的效果,非常節省時間。
第二題:缺失值設定及重新編碼
我們繼續往下看,A301題目中開始詢問:上述這15種設施,在村子裡有多少個?我們從數據中的ca301_a_2,即「幼兒園」開始看起。
同樣,首先是codebook
發現存在「不適用=-8」這個值。一般來說,編碼規則中,不適用和無應答等缺失值通常會被編碼為「-8」或者「-9」,我們在分析數據時候,切記要看清楚每個變數的數據標籤的含義,不然容易犯錯誤。
第二步就是tabulate一下這個變數,看一下不同值的頻次以及有多少個頻次(通常這應用於類別變數或者分類較少的定距變數,分類較多的定距變數--連續變數需要採用其他的分析方法)。
可以看出不同類別的分布和頻數統計。由上面可以知道,不適用=-8,所以,在這裡,缺失值是310個。
處理方法:編碼成缺失值
recode ca301_a_2 (-8=.),gen(newvar)
或者:recode ca301_a_2 (-8=.);二者皆可。
此外,出於不同的研究目的,我們還可以把不同的值再重新編碼,以下僅供測試:
recode ca301_a_2 (-8=0)(1/5=1)(6/10=2)(12/30=3),gen(newvar)
然後,就可以給變數加上label以及不同值的標籤。
label var newvar "for trial"
label define trial 0"none" 1 "one" 2"two" 3"three"
label value newvar trial
這樣,再進行tab,就可以看到新的變數。這個可以下來試一試,比較簡單,都是套路性的編碼方法。
3.數據分析
CFPS的數據分析是非常重要的部分,應該會分成幾個部分介紹。關於CFPS數據的分析,我應該不會特別側重某個庫來介紹,而是整體上如何處理變數,如何加權以及如何匹配不同的庫。
3.1數據清理
第三題:如何數清家裡的人數?
在使用CFPS這種大型的資料庫的時候,我們時常會為複雜的家庭關係而頭疼。為什麼這麼說呢?首先,就是資料庫中設置的家庭成員數量非常多,這體現在「家庭成員關係庫」中,就是個人、父母、配偶及子女的數量及變化;第二,就是家庭中直系親屬與非直系親屬、同住家庭成員與不同住家庭成員等等的區分。
根據2010年問卷中,家庭成員問卷對全部家庭成員進行了分類,並分別歸攏到T1、T2、T3表當中。(。問卷鏈接:http://www.isss.edu.cn/cfps/wd/wj/2010wj/)如下圖所示:
T1表是同住家庭成員表,其中:編碼為1**的成員為與家庭有血緣/婚姻/領養關係的成員,包括岳父母/繼父母/外甥孫/侄子孫等。這部分人可能會進入T2表。另外,編碼為 3**的成員為與家庭沒有血緣/婚姻/領養關係的成員,如保姆、司機、勤雜人員、臨時借住人員等,這些人是不進入表 T2,也不會有個人問卷的成員。這部分人包括是否「同灶吃飯」,也就是是否發生了經濟關係,由此判定是否屬於家庭成員以及是否屬於直系家庭成員。
承上文,T2表是針對「同住」直系親屬關係制定的統計表格;而T3表,則是針對「不同住」直系親屬制定的表格。家庭中,個人編碼也從2開頭,為2**。
了解了家庭關係問卷的結構,那麼,問題又重新回來:如何計算家庭成員數量?在這裡,我們以子女數量作為代表來進行演示:
素材:家庭成員問卷對應的數據
範圍:對於子女所在的10條(可能的)記錄。
變數:code_a_c1- tb5_siops_a_c10
我們根據「孩子`i"是否健在」來進行梳理(`i"≤10),健在記為1,反之記為0。下文即命令:
use cfps2010famconf_report_nat092014,clear /*打開數據*/
keep code_a_c1- tb5_siops_a_c10
接下來,生成新的子女目標變數:
forval i=1/10{
recode alive_a_c`i" (1=1)(0=0)(else=.),gen(new`i")
label var new`i" "trial"
}
統計一下人數:
egen childsize=rowtotal(new1- new10)
看一下子女數量的分布:
這樣,就可以得到子女數量。同樣,如果家庭成員的問卷結構依次法進行設計的話,都可以這樣進行計算。比如,在「成人庫」中,兄弟姐妹數量這個變數就是通過此法進行計算的。
最後,還要再加一句。CFPS為了用戶的使用方便,已經在各個子庫中清理出了若干公共變數,比如家庭規模(familysize),收入,父母出生年份,最高學歷等等諸多變數。這些變數都是可以直接拿來使用的。
第四題:如何實現長寬數據的轉換?
長數據轉變為寬數據,一般用reshape命令。言歸正傳,咱們仍然以家庭庫中的子女數量部分的問題為例子進行闡釋。
素材:家庭成員問卷對應的數據
範圍:對於子女所在的10條(可能的)記錄。
變數:code_a_c1- tb5_siops_a_c10
我們根據「孩子`i"是否健在」來進行梳理(`i"≤10),健在記為1,反之記為0。下文即命令:
use cfps2010famconf_report_nat092014,clear /*打開數據*/
keep code_a_c1- tb5_siops_a_c10
上文直接copy過來。在這裡,我們保留了與子女有關的全部變數,這些變數為一個10次的循環,角標也從1到10。這種結構非常適合轉換的演示。
上圖所示為第一個孩子的所有信息,除了尾巴上為第二個孩子的變數。這也說明,每個孩子的一組變數都是相同的,唯一的不同體現在角標上。因此,也預示著我們在使用reshape命令時候,只要保存主要變數名即可。
我們通過(粗糙的)命令,可以大致得出整體的結果。
gen newid=_n
reshape long code_a_c bio_c t_c pid_c tb2_a_c tby_a_c tbm_a_c ///
tbb_a_c tba_a_c alive_a_c tb3_a_c tb4_a_c tb6_a_c tb604_a_c tb60_a_c ///
tb602acode_a_c co_c td7_a_c td7spcode_a_c td8_a_c tb5_code_a_c tb50_a_c ///
tb5_isco_a_c tb5_isei_a_c tb5_siops_a_c, i(newid)
結果:(有對齊強迫症的朋友自動忽略下一段...)
Data wide -> long
-----------------------------------------------------------------------------
反之,用reshape wide即可進行反向的轉化。可用help文檔進行查看。
這個數據其實分成了兩個部分:第一個是主幹的追蹤調查,從2011年基期開始,經過2013年、2015年調查,在全國範圍內已經進行了三期(前兩期的預調查不具備全國推斷的能力);第二個是2014年的生命歷程數據,這個數據採用了回溯性的調查方法,對老年人的生命歷程中的若干事件進行了回顧。由於個體ID和村居、社區等層面的ID都有,且保持了一致,所以匹配時候也比較方便。
有過大型資料庫分析經歷的朋友肯定對這些庫的複雜性深有體會,那麼,怎樣能夠更簡便地操作這些資料庫呢?答案是。。。沒有捷徑。除非在熟悉數據的情況下,直接copy別人的命令腳本。
但是呢,有一條路是每個人都可以走的,那就是熟能生巧。因為這些資料庫都會有一個內在的邏輯,掌握了他們的邏輯,分析起來就遊刃有餘。無他,但手熟爾。
另外呢,介紹順序稍微打亂一下,從數據的結構講起。
Part I 數據結構
CHARLS的數據結構可以用一個詞來形容:複雜。如果再用一個詞形容,那就是:簡單。
為什麼用自相矛盾的詞呢?因為邏輯結構。CHARLS數據主要採用了模塊式的調查方法,從基本信息,到家庭信息、健康狀況、醫療保險、個人和家庭的收支財務、工作退休、住房等幾個模塊。每個模塊都對應了相應的ID等變數。
在這個小文章里,我以2015年追蹤數據為例,對數據結構進行展示。從2015年的問卷中,可以找到幾個比較大的模塊:
Contents ?錄
B DEMOGRAPHIC BACKGROUNDS 基本信息1
C FAMILY 家庭13
C1 RARENT, CHLIDREARING AND SIBLING INFORMATION 父母、子女、
兄弟姐妹信息. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
C2 TIME TRANSFER AND TRANSFERS 家庭交往與經濟幫助. . . . . . . 37
A HOUSEHOLD MEMBER 家戶成員. . . . . . . . . . . . . . . . . . . . . 48
D HEALTH STATUS AND FUNCTIONING 健康狀況和功能51
DA HEALTH STATUS 健康狀況. . . . . . . . . . . . . . . . . . . . . . . . 52
DB FUNCTIONAL LIMITATIONS AND HELPERS 身體功能障礙以及輔助者74
DC COGNITION & DEPPRESSION 認知和抑鬱. . . . . . . . . . . . . . . 89
E HEALTH CARE AND INSURANCE 醫療保健與保險97
PART I MEDICAL INSURANCE 第一部分:醫療保險. . . . . . . . . . . . 97
PART II HEALTH CARE COSTS AND UTILIZATION 第二部分:醫療成本與
使用情況. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
F WORK, RETIREMENT AND PENSION ?作、退休和養??121
FA JOB STATUS 工作情況. . . . . . . . . . . . . . . . . . . . . . . . . . . 123
FC AGRICULTURE WORK 農業工作. . . . . . . . . . . . . . . . . . . . . 133
FARM EMPLOYED 農業打工. . . . . . . . . . . . . . . . . . . . . . . . 133
HOUSEHOLD AGRICULTURAL WORK 自家農業生產活動. . . . . . . 133
FD EMPLOYED 受雇. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
......不做列舉
G&H INCOME, EXPENDITURES AND ASSETS 收?、?出與資產191
G2 HOUSEHOLD INCOME AND EXPENDITURES 家戶收入與支出. . . . 191
HA HOUSEHOLD ASSETS 家戶資產. . . . . . . . . . . . . . . . . . . . . 202
HB INDIVIDUAL ASSETS 個人資產. . . . . . . . . . . . . . . . . . . . . . 215
I HOUSING CHARACTERISTICS 住房情況223
這個結構可以去比對CFPS數據,CFPS數據不是根據經濟生活的模塊劃分的,而是根據家庭成員的不同屬性劃分的,如成人庫,兒童庫等不同類別。大類的好處是不需要合併,缺點是難以把握各個變數內在的關係。
此外,從CHARLS的數據結構看,這個數據的不同模塊也保留了相當大的兼容性和協調性。
例如,每個數據的前幾行都是householdID、communityID還有個體的ID,這樣,給不同模塊合併提供了「鑰匙」。
一般來講,我們合併數據時候,需要做的預處理就以下幾個部分:
保存不同數據中相關的ID變數;
根據ID,作為索引進行合併
**--基本命令--**
cd: work_file_path...
use data1.dta,clear
keep id householdid communityid x1-x5
save work1.dta,replace
use data2.dta,clear
keep id householdid communityid x1-x3 x6-x10
save work2.dta,replace
**--append--**
use work2.dta,clear
append using work1.dta
/*可以看到x1-x3的案例數出現了增加,也就是說,數據在縱向上變長了。但由於x5,x5-x10在兩個數據中分別存在,合併之後會出現缺失*/
merge和匹配~~
**--merge的用法--**
*merge的情況則比較複雜,分情況討論。
*第一種:兩個工作文件都是個體文件,都含有個體的id,那麼,直接根據ID進行一對一匹配即可;
*第二種:兩個文件都是家庭層面的匯總,但沒有個體ID。那麼需要根據家庭ID進行多對多匹配;
*第三種:兩個文件是個體文件,但某個文件是長數據(long),每個個體ID會對應幾個observations。這樣,需要根據個體ID,一對多匹配
**--merge 1--**
use work2.dta,clear
merge 1:1 id using work1.dta
/*這步的工作就是通過ID去從個體層面合併數據*/
**--merge 2--**
use work2.dta,clear
merge m:m householdid using work1.dta
/*這步的工作是講,如果家庭層面或者社區層面合併匹配,需要多對多*/
**-merge 3--**
use work2.dta,clear
*生成幾個變數,並轉變成寬數據
forval i=1/10{
gen a`i"=1
}
*根據ID,轉變成長數據
reshape long a, i(id) j(num)
save work2.dta,replace
merge id m:1 using work1.dta
*反之亦然,如果work1在前面,則是1:m
Part II ID的作用
ID有什麼作用呢?很簡單,就是鑰匙串。
無論是哪個大型的、分模塊的資料庫,一定會有一個東西把它串聯起來。「鑰匙串」應該是一個形象的比喻吧。
比如,在CHARLS中,背景中的家庭基本信息就是一個大的鑰匙串。我們在匹配家庭關係時候,必然要回到這裡。
舉一個例子,討論或者隔代撫養對老年人健康的影響。(不一定在CHARLS中,也可能在其他數據中)
我們知道,一個家庭,基本上只有一個人來填答問卷(假定為戶主),其他人的信息儘管會採集,但怎樣採集呢?給每個家庭成員一個戶內編碼。
因此,需要做的,首先是在成人庫中尋找關係,「誰是祖孫」且「他們的孫子女剛好未成年」?
符合這個條件的,可以現在家庭成員中暫時找到對應的鎖口--家庭內部編碼(三位數)
然後轉變數據格式,把每個人都變成一條記錄。
再回到家庭關係庫中找鑰匙,打開鎖,確定每個人的具體信息。
這樣,就完成了。
相似的問題還有:居住安排,子女贍養與經濟反哺等等。
這個需要寫個小循環,可以參照循環的寫法。
1.常用循環的邏輯
常用的循環(當然不止stata一家的統計語言),其實是「流程--過程」的一種體現,在這個過程中,程序的運行和演算會遵從幾個邏輯,或者可以說是特徵:
(1)if語句,體現為條件:在哪裡運行,在哪裡終止;在哪裡運行A部分,在哪裡運行B部分....不一而足。
(2)變數標籤的規律性,比如,在某量表中,對同一個維度,如「認知能力」採用了十個維度的衡量指標,那麼,這是個問題的變數標籤,在數據中通常都會體現為:(例)cog1_1, cog1_2, ...... cog1_10。這十個變數就構成未來進一步分析的基礎。
(3)變數值的規律性。仍然以上面的「認知能力」作為衡量指標。每個問題的提問方式都是比較接近的,比如,「你的記憶力如何?」這個問題,以及相關其他維度的問題。接下來,我們針對每個問題給出五個答案:很差,較差,一般,較好,很好。分別賦值為0,1,2,3,4。那麼,這十個問題對應的答案值域,就可以構成一個10X5的矩陣,然後再從其中選擇具體值即可。
2.常用循環
(1)foreach命令
一般格式是:
foreach x in varlist...{
rename `x " abc_`x"
}
這段命令有幾個特點:
第一,foreach命令需要前後兩個大括弧{}包裹起來;
第二,x在此為varlist--變數列表的暫元(local局部宏),所以在命令中,需要加上左右撇號。注意,左撇號是英文輸入法下的「~鍵」,右撇號是英文輸入法下的單引號鍵。這個非常關鍵。
第三,函數、命令的句柄在這裡只要正常使用即可。
舉例來說:
sysuse auto,clear
foreach x in make-mpg weight-turn{
sum `x"
}
解釋一下:在這裡,我想要做的是sum一下make price mpg weight length turn這六個變數的值,這六個變數構成了varlist。因為前三個相鄰,後三個相鄰,所以中間用省略號「-」連接。這樣可以節省一些空間。
參考結果
給變數重命名,也遵從此法。在這裡,我給各個變數加上前綴。
命令:
foreach x of varlist make-foreign{
rename `x" a_`x"
}
執行結果:
空間有限,關於foreach的命令就介紹到這裡。下面,介紹一種更常用的方法:forvalue。
(2)Forvalue語句
第一,生成若干個結構相近的變數,並用某些值來代替,
forval i=1/15{
gen x`i"=.
replace x`i"=_n
}
第二,根據不同層再進一步設置循環。
forval j=1/15{
gen f`j"=0
label var f`j" "有第`j"項設施的村子"
forval i=1/15{
replace f`j"=1 if ca3_s_`i"==`j" & ca3_s_`i" !=.
}
}
*
接下來,可以參考之前的介紹,來重複演練一下即可。
3.forvalue循環的更廣泛用途
其實,話說回來,forval這個命令的用途當然不止這麼局限,不光在生成變數、賦值這些地方可以運用,在其他地方同樣可以用到。大家可以open mind來想一想,哪裡可以用到?一定要敢想才可以~~
在這裡,我舉兩個例子,非常實用的例子。
(1)forval運行回歸模型
我們仍然使用auto.dta數據來做例子。
在這裡,我們先利用price做因變數,之後生成三個price的次方,price^`i",並取對數。這樣,相當於`i"*ln(price),即price對數的1至3倍。好了,介紹完畢,上程序:
sysuse auto,clear
forval i=1/3{
gen price_new_`i"=`i"*ln(price)
reg price_new_`i" mpg rep78 weight length
est store m`i"
}
*
請看結果:
m1的結果。
m2的結果
m3的結果
補充一點,我們可以用esttab命令更方便的比較這幾個模型的係數:
其實呢,esttab還可以輸出這個係數對應的表格(輸出word-rtf格式),出來之後基本不用特別多的修改,就可以直接作為學術文章中的表格,非常實用,強烈推薦。
2)forval循環製作複合圖形
由於前面很詳細的介紹了一些製圖的技巧。所以在這裡,我簡單介紹一下循環作圖的方法。其實萬變不離其宗,一個是循環,一個是作圖,兩個命令結構結合在一起,就可以做出循環的圖形。
在這裡,我們首先明確作圖的意圖:我們要做一個什麼樣的圖形?
假設,我們使用auto.dta的數據(sysuse auto,clear),根據不同價格檔次,來確定長度和重量之間的散點圖。要求:根據價格等級,分成五等,我們看不同等級與總體之間的散點分布區別,如何去操作?
上命令(注意其中的斷行):
sysuse auto,clear
xtile grade=price, nq(5)
set scheme s1color
forval i = 1/5 {
scatter length weight if grade != `i", xsc(log) ysc(log) xla(1500 2000 3000 5000) ///
yla(150 200 250 300) ms(oh) mc(blue*0.2) || scatter length weight if grade ///
== `i", xsc(log) ysc(log) xla(1500 2000 3000 5000) yla(150 200 250 300) ///
ms(O) mc(blue) yla(, ang(h)) subtitle("`: label (grade) `i""", place(w)) ///
legend(off) name(g11_`i", replace)
}
*
scatter length weight, xsc(log) ysc(log) xla(1500 2000 3000 5000) yla(150 200 250 300) ///
ms(O) mc(blue) yla(, ang(h)) name(g11_6, replace) subtitle("all", place(w))
graph combine g11_1 g11_2 g11_3 g11_4 g11_5 g11_6, saving(g11, asis replace) imargin(small)
主要的處理思路:
1.根據price設置等級;
2.每一個等級都畫一張散點圖,對比全圖;
3.畫一張全圖;
4.合併
結果展示:
最後,可以把幾張圖合併來看:
幫點擊一下下面的小廣告,謝謝支持!
追夢赤子心
追夢痴子心
GALA
00:00/05:17
TAG:計量經濟學圈 |