查看原文
其他

CFPS和CHARLS数据库分析技巧大指南

欢迎投稿(荐稿)计量经济圈,计量相关都行

箱:econometrics666@sina.cn

编辑: @计量经济圈(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文档进行查看。

今天介绍一下常用的数据库,它是来自北大的CHARLS数据(网址:http://charls.pku.edu.cn/zh-CN)。顾名思义,这个追踪调查得到的是一个关于健康与养老方面的panel数据。


这个数据其实分成了两个部分:第一个是主干的追踪调查,从2011年基期开始,经过2013年、2015年调查,在全国范围内已经进行了三期(前两期的预调查不具备全国推断的能力);第二个是2014年的生命历程数据,这个数据采用了回溯性的调查方法,对老年人的生命历程中的若干事件进行了回顾。由于个体ID和村居、社区等层面的ID都有,且保持了一致,所以匹配时候也比较方便。


有过大型数据库分析经历的朋友肯定对这些库的复杂性深有体会,那么,怎样能够更简便地操作这些数据库呢?答案是。。。没有捷径。除非在熟悉数据的情况下,直接copy别人的命令脚本。


但是呢,有一条路是每个人都可以走的,那就是熟能生巧。因为这些数据库都会有一个内在的逻辑,掌握了他们的逻辑,分析起来就游刃有余。无他,但手熟尔。


很久以前的上次,介绍过中国家庭追踪调查的数据(CFPS),感兴趣的朋友可以翻一翻看看那个,由于是在公众号运行的早期,木有很好地排版什么的,不美观。所以,这次的CHARLS就稍微给它略施粉黛,排一排版。


另外呢,介绍顺序稍微打乱一下,从数据的结构讲起。



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,这样,给不同模块合并提供了“钥匙”。



一般来讲,我们合并数据时候,需要做的预处理就以下几个部分:

  1. 保存不同数据中相关的ID变量;

  2. 根据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的循环用法,在数据分析专题的第一讲(参考公众号上次推送的文章)就介绍了forval在处理相应结构的数据时候,如何用forval来处理重复结构的变量。为了节约大家时间,我简要回顾一下:


第一,生成若干个结构相近的变量,并用某些值来代替,

        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.合并


结果展示:

最后,可以把几张图合并来看:


计量经济圈是中国计量第一大社区,我们致力于推动中国计量理论和实证技能的提升,圈子以海内外高校研究生和教师为主。计量经济圈六多精神:计量资料多,社会科学数据多,科研牛人多,名校人物多,热情互助多,前沿趋势多。如果你热爱计量并希望长见识,那欢迎你加入到咱们这个大家庭戳这里,要不然你只能去其他那些Open access圈子了。注意:进去之后一定要看小鹅社群“群公告”,不然接收不了群息,也不知道怎么进入咱们的微信群和计量论坛。



帮点击一下下面的小广告,谢谢支持!


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存