Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:韩杰 (暨南大学)
邮箱:han_ovetk@foxmail.com
编者按:本文参考自「PANELVIEW: Stata module to visualize panel data」,特此致谢!
目录
本文主要介绍由 Mou、Hongyu 和 Yiqing Xu (2022) 共同开发的面板数据可视化命令——panelview
。该命令具备以下三大功能:
这些工具可以帮助研究人员在进行统计分析之前,更好地理解他们的面板数据。
首先,我们需要安装几个必备命令:grc1leg
、gr0075
、labutil
和 sencode
。
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")
该命令的语法如下:
panelview Y D X [if] [in] , i(varname) t(varname numeric) type(string) [options]
其中,
Y D X
:因变量、自变量和协变量。由于协变量中缺少值,包含协变量可能会改变图的外观;if
和 in
:添加限定条件;i()
和 t()
:指定单位 (组) 和时间指标;type()
:type(treat)
使用热力图绘制处理组分配。type(outcome)
以时间序列的方式绘制结果变量。type(bivar)
或 type(bivariate)
在同一图表中绘制结果和处理组与时间的关系。type(miss)
或 type(missing)
绘制变量的数据缺失状态;continuoustreat
:处理变量表示为连续变量;discreteoutcome
:当变量是离散的,确保 panelview
在 type(outcome)
图中保持它的离散性;bytiming
:按首次接受处理的时间对单位进行排序,如果时间是相同的,那么就是接受处理的总时长;ignoretreat
:省略处理指标,即 Y
之后的所有变量都被解释为协变量;ignoreY
:显示 varlist
中第一个变量的处理状态,而不是第二个,需要与 type(treat)
或 type(missing)
结合使用。如果 varlist
中只有一个变量,则该选项禁用;MYCOLor()
:改变配色方案;PREpost
:区分处理组的处理前和处理后阶段;xlabdist()
和 ylabdist()
:更改 x 轴和 y 轴上标签之间的整数间隔,默认值为 1;bygroup
:将每个单元放入不同的处理组,然后在调用 type(outcome)
时将它们分别绘制在列中;style()
:确定绘图中元素的样式。第一项和第二项分别定义了结果变量和处理组的风格。Connected
或 c
表示连接线,line
或 l
表示线;byunit
:当调用 type(bivar)
时,绘制每个单元的结果变量和处理变量与时间的关系图;theme(bw)
:使用黑白主题,当指定 type(bivar)
时为默认;lwd()
:设置行宽的 type(bivar)
,默认为 medium
;leavegap
:如果时间分布不均匀,将时间间隔用白色条表示;bygroupside
:将分组的子图形排列在一行中而不是列中;displayall
:如果单位数超过 500,则显示所有单位,否则随机选择 500个单位呈现。
利用 turnout.dta 数据集 (一个平衡面板),我们展示了给定年份每个州选举日登记 (EDR) 的处理状态。我们可以使用 title
选项来更改标题、xtitle
和 ytitle
选项更改 x 轴和 y 轴的标题。对于处理指标为二分法的 DID 型面板数据,我们可以通过指定 prepost
来区分处理单元的处理前和处理后时期。
在下图中,turnout 是结果,policy_edr 是处理变量,policy_mail_in 和 policy_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
对于处理组可能开启和关闭的面板数据集,我们不再区分处理前和处理后的状态。为了展示 panelview
如何在更一般的情况下使用,下图使用了 capacity.dta 数据集,该数据集用于调查民主的影响,其中 demo 是体制类型的二元指标。
从下图中,我们看到了相当多的民主逆转的案例,有许多缺失的变量 (白色区域)。在这里,我们使用 xlabdist
和 ylabdist
选项来改变 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)
如果 varlist
是 D 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
有时,一个数据集有许多单位,我们只想取单位子集,此时可以通过 if
选项指定显示单元。注意,如果变量没有包含在 varlist
或 i()
/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)
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)
如果处理类型数大于 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)
panelview
的第二个功能是以时间序列的方式显示面板数据集的原始结果变量。语法非常类似,只是我们需要指定 type(outcome)
。不同的颜色代表不同的处理条件。
我们把处理开始前的一段时间画成处理期。与 type(treat)
不同,type(outcome)
不需要 xlabdist
和 ylabdist
。如果需要,我们应该使用 xlabel
和 ylabel
来代替。同时使用 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
为了更好地理解数据,有时我们希望根据观察区间内处理状态是否发生变化来绘制结果,此时可以通过选项 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)
我们可以通过设定 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)
通过指定 type(bivar)
或 type(bivariate)
,实现在一个图中可视化结果和处理变量的时间序列。对于连续变量,我们默认使用线图,对于离散变量,我们使用条形图。
对于连续的结果变量和离散的处理组,这里有两个例子。在前者中,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))
我们使用 byunit
绘制 D
和 Y
与时间的关系图,并将四个子图排列在一行中。
. 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
Note:产生如下推文列表的 Stata 命令为:
lianxh 可视化, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh