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

文摘   教育   2024-11-14 22:00   山西  


👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

 课程特色 · 2024机器学习与因果推断

  • 懂原理、会应用。本次课程邀请了两位老师合作讲授,目的在于最大限度地实现理论与应用的有机结合。为期四天的课程,分成两个部分:第一部分讲解常用的机器学习算法和适用条件,以及文本分析和大语言模型;第二部分通过精讲 4-6 篇发表于 Top 期刊的论文,帮助大家理解各类机器学习算法的应用场景,以及它们与传统因果推断方法的巧妙结合。
  • 以 Top 期刊论文为范例。目前多数人的困惑是不清楚如何将传统因果推断方法与机器学习结合起来。事实上,即便是 MIT 和 Harvard 的大牛们也都在「摸着石头过河」。为此,通过论文精讲和复现来学习这部分内容或许是目前最有效的方式了。张宏亮老师此前在浙江大学按照这一模式教授了「因果推断和机器学习」课程,效果甚佳:学生们能够逐渐建立起研究设计的理念,并在构造识别策略时适当地嵌入机器学习方法。

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

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

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 简介

  • 2. 命令介绍

    • 2.1 命令安装

    • 2.2 命令语法

  • 3. Stata 实例

    • 3.1 制定处理组的特征

    • 3.2 两种以上的处理组特征

    • 3.3 连续的处理变量

    • 3.4 离散的处理变量

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

  • 4. 相关推文



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

  • 专题:数据处理
    • Stata:边际处理效应及其可视化-mtefe-T309
    • Stata: 约翰霍普金斯大学 COVID-19 疫情数据处理及可视化
  • 专题:Stata绘图
    • Stata可视化:能用图形就不用表格
    • Stata绘图:回归系数可视化-multicoefplot
    • Stata绘图-可视化:组间差异比较散点图
    • Stata可视化:biplot一图看尽方差、相关性和主成分
    • Stata绘图-组间差异可视化:不良事件火山图、点阵图
    • forest-森林图:分组回归系数可视化
    • Stata绘图:回归系数可视化-论文更出彩
    • Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图
    • Stata绘图:随机推断中的系数可视化
  • 专题:结果输出
    • Stata可视化:让他看懂我的结果!
  • 专题:回归分析
    • Stata:在线可视化模拟-OLS-的性质
  • 专题:Python-R-Matlab
    • Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化
  • 专题:工具软件
    • 知乎热议:有哪些一用就爱上的可视化工具?
  • 专题:其它
    • 数据可视化:带孩子们边玩边学吧

🍓 课程推荐:2024 机器学习与因果推断专题
主讲老师:司继春 (上海对外经贸大学) ;张宏亮(浙江大学)
课程时间:2024 年 11 月 9-10 日 ;16-17日
课程咨询:王老师 18903405450(微信)

尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxh 和 songbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
  . ssc install lianxh
  . ssc install songbl
👉  使用:
  . lianxh DID 倍分法
  . songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章