當前位置:
首頁 > 最新 > CFPS和CHARLS資料庫分析技巧大指南

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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 計量經濟學圈 的精彩文章:

SSCI論文寫作和投稿技巧指南針

TAG:計量經濟學圈 |