查看原文
其他

Stata绘图系列—NBER Working paper仿图

爬虫俱乐部 Stata and Python数据分析 2023-02-21


本文作者:邱沣,河南大学中原发展研究院

本文编辑:赵微微

技术总编:李婷婷

Stata&Python云端课程来啦!

      好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程Stata进阶课程Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

引言
相信大家在阅读文献时,经常惊叹于各路学者绘制的精妙图形,今天我就带领大家看看如何仿照文献思路绘制出美观形象的图形。本期推文仿图出自2021年5月的一篇NBER working papers:Entrepreneurial Reluctance: Talent and Firm Creation in China,作者分别是Chong-En Bai, Ruixue Jia, Hongbin Li, and Xin Wang。图形如下:

首先我们需要结合文献来观察一下这两幅图形,图(a)为是否进入各个行业的估计系数分布图(对于因变量平均值的估计值),其中不仅展示了各个行业的系数大小,还包含了其95%的置信区间。
  图(b)以散点图的形式绘制了各个行业中的国家投资份额与是否进入该行业的估计相关性的残差关系,圆圈的大小则表示每个行业的公司数量,相当于为每个点赋予了权重,这样一来,彼此间会更具有可比性。
  接下来,我们一起来尝试一下如何仿制这两幅图形。

一、生成数据

在还原图形之前,我们需要生成一组数据,包含行业的虚拟变量和自变量:分数
clear all*设置观测值数set obs 1000*设置随机数种子,保证结果可重复set seed 123gen Treat=(uniform()<=0.6)bysort Treat: gen int group=uniform()*90+Treat*90+1bysort group: gen industry=2016-_n+1gen score=ln(1+uniform()*100)
*生成各个行业gen D=industry-2012gen health = (D==-3 & Treat==1)gen hotel =(D==-2 & Treat==1)gen IT=(D==-1 & Treat==1)gen power=(D==0 & Treat==1)gen finance=(D==1 & Treat==1)gen transport=(D==2 & Treat==1)gen education=(D==3 & Treat==1)gen manufacturing=(D==4 & Treat==1)

生成回归系数,并提取出来(注:当然不止这一种仿图思路,这里只是提供一种借鉴和模仿的方法)

foreach var in health hotel IT power finance transport education manufacturing{ reg `var' score i.industry, vce(robust) est store `var' mat a = r(table) //用矩阵保存线性回归命令的返回值 local b = a[1,1] //提取估计系数 local ll = a[5,1] //提取左置信区间 local ul = a[6,1] //提取右置信区间 mat a = [`b',`ll',`ul'] //横向合并矩阵 mat rownames a = "`var'" //以变量名为矩阵的行名 mat theResults = nullmat(theResults) \ a //纵向合并矩阵}mat colnames theResults = "b" "ll" "ul" //修改矩阵的列名matlist theResults //查看矩阵元素

二、绘制估计参数分布图

得到各个回归的系数之后,就可以着手绘制图(a)了,这里我们可以使用外部命令coefplot来实现。coefplot是用来绘制回归系数和其他结果的图表的命令,在这里若想输出回归系数,需要在回归后通过est store保存回归结果,然后再借助coefplot完成图形输出。具体命令如下:
coefplot health hotel IT power finance transport education manufacturing, keep(score) ci(95) ///ylabel(none) ytitle("industry-specific estimates") ///mlabel(@plot) mlabposition(10) mcolor(red) ///legend(order( 1 "95% CI" 2 "impact of 1-sd score(% of the mean)") row(2) ring(0) position(10) size(small)) title(Estimates By Industry)

如上述程序所示,首先,我们需要指定要输出的回归结果,还可利用keep选项输出特定变量的估计系数,ci选项设置置信区间范围。之后的一些选项都是绘图中的通用选项了,ylabel设置Y坐标轴标签,ytitle设置Y坐标轴标题,mlabel给点打上标签,mlabposition和mcolor分别为设置标签的方位和颜色。具体如何使用可参考之前推文《如何绘制任泽平《鼓励生育基金》的几幅图》。这里需要注意的是,在coefplot中有一些内部变量可在mlabel中使用,比如这里的@plot即为之前各个回归结果的名称。更多用法详见:help coefplot
  legend选项则是用来设置图例的,其中order选项不仅可更改图例中的顺序,还可以替换、隐藏图例中标签的文本。row选项设置图例显示在几行中,ring(0) 选项将图例放置在绘图区域中,position(10) 设置图例放置在十点钟位置,更多用法详见:《Stata绘图系列——玩转绘图通用选项之图例》
  生成的仿图如下:

三、绘制带有权重的散点图(气泡图)

为了便于展示,这里仍然使用了前几个回归中的系数,并分别标上对应的行业,生成随机的投资份额和公司数量(权重数)。
clear //清除原始数据svmat theResults , names(col) //将矩阵转化为变量gen industry = "."local i = 1 foreach var in health hotel IT power finance transport education manufacturing{ replace industry = "`var'" in `i' local i = `i'+1}set seed 12456gen share=ln(1+uniform()*100)gen int wt = uniform()*20

接下来,使用生成的数据就可着手仿制图(b)了。

tw (scatter b share [w=wt], msymbol(Oh) ) ///(scatter b share , msymbol(i) mlabel(industry) mlabposition(1) mlabangle(45) mlabgap(*3)) ///(lfit b share ) ,legend(order( 1 "impact of 1-sd score (resid)" 3 "fitted:coeff = -0.059,s.e.=0.024") row(1) position(6) size(small)) ///ytitle("impact of 1-sd score resid") xtitle(ln state investment share resid) title("Estimates vs. State penetration (controlling schooling by industry)",size(small))

绘制图b的关键就在于 twoway scatter 中的赋权选项 [w=varname] ,指定权重变量后,点的大小便会由此决定。需要注意的是,mlabel选项和[w=varname]选项不能同时使用,所以我们还需再绘制一次散点图,给每个点打上标签。其他选项,比如msymbol设置点的样式,其中Oh为大的空心圆圈,i为不可见的点,mlabel和mlabposition和上文一致,mlabangle设置标签的角度,mlabgap设置点与标签的间距。
  twoway lfit则是拟合直线,legend和title选项和上文类似,具体更多用法可参考往期Stata绘图系列推文。
  生成的仿图如下:

结语

本期推文旨在为大家提供一种仿图的思路和方法,带着大家了解更多的绘图命令,学会如何灵活地运用Stata来绘制出生动形象的图形,当然方法肯定不止这一种,欢迎大家也积极尝试,探索更多的绘图技巧和方法。(END)重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!



往期推文推荐       Camelot:从PDF中提取表格数据      Stata之计算财务指标——融资约束

      列表生成式|让你的代码更简洁

Stata绘图系列——玩转绘图通用选项之坐标轴

       玩转地图的好帮手--pyecharts

       爬虫俱乐部又又又输送了一位研究助理!!!      【数据分析】一文教你玩转DataFrame

 震惊,爬虫俱乐部竟是这样运营答疑群的?!

【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新

带你玩转Stata编码一言不合就teamviewer

【基础篇】循环语句的continue与break

        教你用Stata爬取全国疫情风险地区数据,原来这么简单!【数据结构】集合的使用方法      Stata爬取七普人口数据

       浅析Python的序列化与反序列化

     爬虫俱乐部的精彩答疑--爬虫为何失败?

       利用Stata批量制作学生证     【数据分析-入门】科学计算基本库—Numpy的简单使用      Stata绘图系列——玩转绘图通用选项之图例

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可

以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


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

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