Stata绘图:面板数据可视化-panelview

发布时间:2022-08-12 阅读 633

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:韩杰 (暨南大学)
邮箱han_ovetk@foxmail.com

编者按:本文参考自「PANELVIEW: Stata module to visualize panel data」,特此致谢!


目录


1. 简介

本文主要介绍由 Mou、Hongyu 和 Yiqing Xu (2022) 共同开发的面板数据可视化命令——panelview。该命令具备以下三大功能:

  • 在面板数据集中绘制处理组状态和缺失值;
  • 以时间序列的方式可视化感兴趣的变量;
  • 以单位或总体描述自变量与因变量之间的二元关系。

这些工具可以帮助研究人员在进行统计分析之前,更好地理解他们的面板数据。

2. 命令介绍

2.1 命令安装

首先,我们需要安装几个必备命令:grc1leggr0075labutilsencode

net install grc1leg, from(http://www.stata.com/users/vwiggins) replace
net install gr0075, from(http://www.stata-journal.com/software/sj18-4) replace
ssc install labutil, replace
ssc install sencode, replace

在 Stata 15.1 或更高版本的安装 panelview,一种方法是通过 ssc install

ssc install panelview, all replace 

另一种方法是使用 net install 来安装最新版本的 panelview

net install panelview, all replace from("https://yiqingxu.org/packages/panelview_stata")

2.2 命令语法

该命令的语法如下:

panelview Y D X [if] [in] , i(varname) t(varname numeric) type(string) [options]

其中,

  • Y D X:因变量、自变量和协变量。由于协变量中缺少值,包含协变量可能会改变图的外观;
  • ifin:添加限定条件;
  • i()t():指定单位 (组) 和时间指标;
  • type()type(treat) 使用热力图绘制处理组分配。type(outcome) 以时间序列的方式绘制结果变量。type(bivar)type(bivariate) 在同一图表中绘制结果和处理组与时间的关系。type(miss)type(missing) 绘制变量的数据缺失状态;
  • continuoustreat:处理变量表示为连续变量;
  • discreteoutcome:当变量是离散的,确保 panelviewtype(outcome) 图中保持它的离散性;
  • bytiming:按首次接受处理的时间对单位进行排序,如果时间是相同的,那么就是接受处理的总时长;
  • ignoretreat:省略处理指标,即 Y 之后的所有变量都被解释为协变量;
  • ignoreY:显示 varlist 中第一个变量的处理状态,而不是第二个,需要与 type(treat)type(missing) 结合使用。如果 varlist 中只有一个变量,则该选项禁用;
  • MYCOLor():改变配色方案;
  • PREpost:区分处理组的处理前和处理后阶段;
  • xlabdist()ylabdist():更改 x 轴和 y 轴上标签之间的整数间隔,默认值为 1;
  • bygroup:将每个单元放入不同的处理组,然后在调用 type(outcome) 时将它们分别绘制在列中;
  • style():确定绘图中元素的样式。第一项和第二项分别定义了结果变量和处理组的风格。Connectedc 表示连接线,linel 表示线;
  • byunit:当调用 type(bivar) 时,绘制每个单元的结果变量和处理变量与时间的关系图;
  • theme(bw):使用黑白主题,当指定 type(bivar) 时为默认;
  • lwd():设置行宽的 type(bivar),默认为 medium
  • leavegap:如果时间分布不均匀,将时间间隔用白色条表示;
  • bygroupside:将分组的子图形排列在一行中而不是列中;
  • displayall:如果单位数超过 500,则显示所有单位,否则随机选择 500个单位呈现。

3. Stata 实例

3.1 制定处理组的特征

3.1.1 处理组的两种情形

利用 turnout.dta 数据集 (一个平衡面板),我们展示了给定年份每个州选举日登记 (EDR) 的处理状态。我们可以使用 title 选项来更改标题、xtitleytitle 选项更改 x 轴和 y 轴的标题。对于处理指标为二分法的 DID 型面板数据,我们可以通过指定 prepost 来区分处理单元的处理前和处理后时期。

在下图中,turnout 是结果,policy_edr 是处理变量,policy_mail_inpolicy_motor 是协变量。由于在协变量中缺少值,包含协变量可能会改变图的外观。

. lxhuse turnout.dta, clear  
. panelview turnout policy_edr policy_mail_in policy_motor, i(abb) t(year) ///
>     type(treat) xtitle("Year") ytitle("State") title("Treatment Status")

我们可以使用 bytiming 选项来按接受处理的时间 (其次是按接受处理的总时间) 对单位进行排序,legend 选项来更改图例中的标签,以及 prepost 选项来区分处理组处理前和处理后的阶段。

. panelview turnout policy_edr policy_mail_in policy_motor, i(abb) t(year) type(treat) ///
>     xtitle("Year") ytitle("State") title("Treatment Status") prepost bytiming

如果时间分布不均匀,我们可以使用 leavegap 来保持时间间隙为白条。否则,我们将跳过时间间隔,并警告 Time is not evenly distributed (possibly due to missing data)

. drop if year==1924
. drop if year==1928
. drop if year==1940
. panelview turnout policy_edr policy_mail_in policy_motor, i(abb) t(year) type(treat) leavegap

3.1.2 缺失和处理状态开关

对于处理组可能开启和关闭的面板数据集,我们不再区分处理前和处理后的状态。为了展示 panelview 如何在更一般的情况下使用,下图使用了 capacity.dta 数据集,该数据集用于调查民主的影响,其中 demo 是体制类型的二元指标。

从下图中,我们看到了相当多的民主逆转的案例,有许多缺失的变量 (白色区域)。在这里,我们使用 xlabdistylabdist 选项来改变 x 轴和 y 轴上标签之间的间隙。

. lxhuse capacity.dta, clear 
. panelview lnpop demo lngdp , i(country) t(year) type(treat) mycolor(Reds) ///
>     title("Democracy and State Capacity") xlabdist(3) ylabdist(10)

如果 varlistD X,我们可以用 ignoreY 来表示 D 的处理状态,不考虑 Y 缺失的状态。

. panelview lnpop demo lngdp , i(country) t(year) type(treat) mycolor(Reds) ///
>     title("Democracy and State Capacity") xlabdist(3) ylabdist(10)

根据一个单位接受处理的第一个周期进行分类的单位,会提供一个更吸引人的视觉效果。

. panelview lnpop demo lngdp, i(country) t(year) type(treat) mycolor(Reds) ///
>     title("Democracy and State Capacity") xlabdist(3) ylabdist(10) bytiming

3.1.3 绘制部分单位

有时,一个数据集有许多单位,我们只想取单位子集,此时可以通过 if 选项指定显示单元。注意,如果变量没有包含在 varlisti()/t() 后面,我们建议研究人员添加变量到 varlist 中。在下图中,我们绘制了前 25 个单位的处理状态。

. egen ccodeid = group(ccode)
. panelview lnpop demo lngdp ccodeid if ccodeid >= 1 & ccodeid <= 26, i(ccode) ///
>     t(year) type(treat) mycolor(PuBu) title("Democracy and State Capacity") xlabdist(3)

3.2 两种以上的处理组特征

3.2.1 三种处理组类型

panelview 支持 2 级以上处理的面板数据。例如,我们创建了一个有三个处理水平的制度类型的变量。

. lxhuse capacity.dta, clear
. gen demo2 = 0
. replace demo2 = -1 if polity2 < -0.5
. replace demo2 = 1 if polity2 > 0.5
. panelview Capacity demo2 lngdp, i(ccode) t(year) type(treat) title("Regime Type") ///
>     xlabdist(3) ylabdist(10) mycolor(Reds) 

3.2.2 五种以上处理组类型

如果处理类型数大于 5,则处理指标视为连续变量。

. lxhuse capacity.dta, clear
. gen demo2 = 0
. replace demo2 = -2 if polity2 < -0.7
. replace demo2 = -1 if polity2 < -0.5 & polity2 > -0.7
. replace demo2 = 1 if polity2 > 0.5 & polity2 < 0.7
. replace demo2 = 2 if polity2 > 0.7
. tab demo2, m 
. panelview Capacity demo2 lngdp, i(ccode) t(year) type(treat) title("Regime Type") ///
>     xlabdist(3) ylabdist(10)

3.3 连续的处理变量

panelview 的第二个功能是以时间序列的方式显示面板数据集的原始结果变量。语法非常类似,只是我们需要指定 type(outcome)。不同的颜色代表不同的处理条件。

3.3.1 连续的处理变量

我们把处理开始前的一段时间画成处理期。与 type(treat) 不同,type(outcome) 不需要 xlabdistylabdist。如果需要,我们应该使用 xlabelylabel 来代替。同时使用 prepost 区分处理单元的处理前和处理后阶段。

. lxhuse turnout.dta, clear
. panelview turnout policy_edr policy_mail_in policy_motor, i(abb) t(year) type(outcome) ///
>     xtitle("Year") ytitle("Turnout") title("EDR Reform and Turnout") prepost

3.3.2 处理变量分组绘图

为了更好地理解数据,有时我们希望根据观察区间内处理状态是否发生变化来绘制结果,此时可以通过选项 bygroup 实现。算法会对数据进行分析,并自动将每个单元分成不同的组,如 1)一直是处理的单元,2) 一直是控制的单元,3) 处理状态发生变化的单元。

. lxhuse turnout.dta, clear
. panelview turnout policy_edr policy_mail_in policy_motor, i(abb) t(year) type(outcome) ///
>     xtitle("Year") ytitle("Turnout") by(, title("EDR Reform and Turnout"))             ///
>     bygroup xlabel(1920 (20) 2000) 

3.4 离散的处理变量

我们可以通过设定 discreteoutcome 来绘制离散的变量。下面是一个使用 pvsimdata.dta 数据集的示例,其中结果变量有三个值:0、1、2。

. lxhuse pvsimdata.dta, clear
. panelview Y D if time >= 8 & time <= 15, type(outcome) i(id) t(time) mycolor(Reds) ///
>     discreteoutcome title("Raw Data") xlabel(8 (2) 15) ylabel(0 (1) 2)

3.5 同时绘制Y和D时间序列

通过指定 type(bivar)type(bivariate),实现在一个图中可视化结果和处理变量的时间序列。对于连续变量,我们默认使用线图,对于离散变量,我们使用条形图。

3.5.1 绘制所有单位的平均时间序列

对于连续的结果变量和离散的处理组,这里有两个例子。在前者中,style(c,b) 表示连接的散点图,而不是表示结果变量的默认线形图和处理组的条形图。如果有连接线,可以通过 msize() 指定符号的大小。

. lxhuse turnout.dta, clear
. panelview turnout policy_edr, i(abb) t(year) xlabdist(7) type(bivariate) msize(*0.5)     ///
>     style(c b) ytitle("turnout") ytitle("policy_edr", axis(2)) legend(label(1 "turnout") ///
>     label(2 "policy_edr")) ylabel(40 (10) 70) ylabel(0 (0.1) 0.5, axis(2)) 

3.5.2 按每个单位绘制时间序列图

我们使用 byunit 绘制 DY 与时间的关系图,并将四个子图排列在一行中。

. lxhuse turnout.dta, clear
. panelview turnout policy_edr policy_mail_in policy_motor if abb >= 1 & abb <= 12,     ///
>     i(abb) t(year) xlabdist(10) type(bivar) byunit
. lxhuse capacity.dta, clear 
. panelview lnpop demo if country >= 1 & country <= 24, i(country) t(year) xlabdist(20) ///
>     type(bivar) byunit

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 可视化, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh