Stata绘图-可视化:组间差异比较散点图

发布时间:2022-03-25 阅读 4790

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下载 - 推文合集

作者: 张蛟蛟 (上海海事大学)
邮箱: islimu@yeah.net


目录


1. 引言

散点图 是比较两种连续变量之间关系十分常用的方法,但有时我们可能需要根据另一种分类变量的取值来对二者间的关系进行分组比较。为此, Cox (2005) 提出三种常见的方法,分别是使用 separate 命令、灰色尺度分级 (gray-scale gradation) 以及使用文本字符作为分类符号进行分组。在此基础上, Musau (2020) 提出了另一种方法:根据某一变量对散点图中的 “气泡” (即散点) 进行加权之后再进行组间比较。接下来,本文将详细介绍上述四种方法。

2. 方法介绍

2.1 separate 命令的使用

在使用separate命令之前,我们可以根据分类变量将连续变量分成不同的组别并生成相应的变量。比如,我们想要根据汽车的类型 (foreign) 对里程数 (mpg) 进行分组来观察 mpgWeight 之间的关系,命令如下:

sysuse auto,clear
gen mpg0 = mpg if foreign == 0
gen mpg1 = mpg if foreign == 1
scatter mpg? weight

得到以下图形:

我们可以很明显地看出国内和国外两组观测对象中 mpgWeight 间不同的关系。然而,当分类变量的值不是两种而是三种及以上的类别时,使用上述 if 命令手动分组的方法显然是耗时的。因此,我们可以利用 separate 命令,该命令可以根据指定的分类变量对连续变量进行分组,并根据不同的组别生成包含原连续变量数值的新变量,其命令语法为:

separate varname[if][in] , by(groupvar|exp) [options]
  • varname:根据分类变量的值进行分组的连续变量;

  • by(groupvar):进行分组所依据的分类变量 (groupvar) 或条件 (exp) ,必须明确使用的是by(groupvar) 还是 by(exp)

  • [options]

    generate(stubname):将新变量的后缀命名为stubname,默认使用varname为前缀;

    sequential: 从 1 开始按顺序编号作为变量名的后缀;

    missing:为缺失值生成变量;

    shortlabel:生成较短的变量标签;

    veryshortlabel:生成比shortlabel更短的变量标签。

如上例,我们可以使用下列命令:

separate mpg, by  (foreign)  veryshortlabel  // 也可用 shortlabel
scatter mpg? weight

获得如下图形:

显然,使用 separate 命令不仅节省了时间,还生成了我们想要的所有变量并为它们贴上了清晰的标签。

2.2 灰色尺度分级 (gray-scale gradation)

如果分类变量是有序或者分级的,那么相应的编码也应该是有序的,我们可以利用深浅不同的灰色为该变量进行编码与分组。

如 Ian S. Evans (Cox,2005) 提供的一组测量数据,利用下列命令绘出图形:

. separate length, by(grade) veryshortlabel 

. #d ;
. twoway scatter length? width, 
     xsc(log) ysc(log) ms(O ..) 
     mcolor(gs1 gs4 gs7 gs10 gs13) 
     mlcolor(black ..) 
     msize(*1.5 ..) 
     yti("‘: variable label length’") 
     yla(200 500 1000 2000, ang(h)) 
     xla(200 500 1000 2000) 
     legend(pos(11) ring(0) col(1));
. #d cr

通过利用深浅不同的灰色对变量 grade 的五个值进行区分,我们可以观察不同组间 LengthWidth 的关系。但这种方法存在一个缺点:即,当样本量很大时,使用该方法可能会因标记自身颜色的明暗程度,以及标记颜色与图形背景颜色可能存在的混淆情况而影响研究者得出准确结论。

2.3 利用文本字符进行分组

有时候,使用普通的文本字符作为标记符号是灰色尺度一个有效的替代方法。这种方法可以有效避免灰色尺度分级法中颜色明暗程度带来的影响。选取文本字符的一种方法是使用字符变量的名字作为散点图中标记符号的标签。

如 Whittaker (1975) 给出了各种生态系统的净初级生产力 (net primary productivity) 和生物量密度 (biomass density) 的数据,根据下列命令得出对应的细分图形:

scatter npp bd, xscale(log) yscale(log)   ///
   ms(i) mlabpos(0) mlabsize(*1.4) mla(c) ///
   yla(3000 1000 300 100 30 10 3, nogrid ang(h)) ///
   xla(0.01 "0.01" 0.1 "0.1" 1 10 100) ///
   legend(on ring(0) pos(5)   ///
          order( - "m marine" - "w wet" - "c cultivated" ///
                 - "g grassland" - "f forest" - "b bare"))

通过按照各生态系统英文首字母进行分组,从图中我们可以看出,生物量密度越大意味着更高的生产力;而在相同的生物量密度条件下,海洋及其他湿地生态系统的生产力高于陆地生态系统。这说明,文本字符作为标记符号有时是进行组间比较的一个有效方法。

2.4 在标记符号有权重的散点图中进行组间比较

Musau (2020) 提出了 Cox (2005) 的三种散点图的一种变体 (有时可称其为气泡图) ,我们可以通过在标准散点图的语法中明确指定一个权重来创建这样的图形,权重大小体现为散点图中 “气泡” 标记的大小。基本思路是根据某一变量 (下称加权变量) 对连续变量进行加权之后,再按照分类变量进行分组,最后绘制散点图来分别比较不同组之间两种连续变量的关系。

利用 Stata 系统数据 auto.dta,假设我们想要按照汽车维修记录 (rep78) 进行加权,观察国内 (美国) 和国外两类汽车的里程数 (mpg) 和重量 (weight) 之间的关系。

首先按维修记录 (rep78) 进行加权,分别绘制未手动分组和手动分组的情况下里程数 (mpg) 与重量 (weight) 的散点图 (见下图中左、右图) :

*-不区分国内与国外
#d ;
twoway (scatter mpg weight [aweight = rep78], 
        mcolor(black) msymbol(smcircle_hollow) 
        text(31 2400 "2", color(black)) 
        text(41 2240 "1", color(black)) 
        text(18 2550 "4", color(black)) 
        text(21 2330 "3", color(black)) 
        scheme(sj) 
        legend(on order(1 "All cars")));
#d cr

*-区分国内与国外
#d ;
twoway (scatter mpg weight [aweight = rep78] if foreign==0, 
        mcolor(gs5) msymbol(smcircle_hollow))
       (scatter mpg weight [aweight = rep78] if foreign==1, 
        mcolor(gs11) msymbol(smcircle_hollow) 
        legend(order(1 "American" 2 "Foreign") row(1)) 
        text(31 2350 "2", color(black)) 
        text(41 2190 "1", color(black)) 
        text(18 2560 "4", color(black)) 
        text(21 2280 "3", color(black))
        scheme(sj)) ;
#d cr

可以看出,未手动分组与手动分组之后的散点图中气泡的尺寸大小存在差异,分组后国外组的气泡尺寸比国内 (美国) 组的尺寸明显小了许多 (从两图中已编号的气泡大小即可看出) 。为何手动分组与未手动分组所获得的两张图的气泡尺寸存在差异?在此之前,我们看一下维修记录 (rep78) 与汽车类型 (foreign) 的交叉分析表:

· tabulate rep78 foreign

    Repair |
    Record |       Car type
      1978 |  Domestic    Foreign |     Total
-----------+----------------------+----------
         1 |         2          0 |         2 
         2 |         8          0 |         8 
         3 |        27          3 |        30 
         4 |         9          9 |        18 
         5 |         2          9 |        11 
-----------+----------------------+----------
     Total |        48         21 |        69 

从表中可以看出,按照汽车类型进行分组之后,我们并未在国外组中观察到维修记录 (rep78) 的所有数值。Musau (2020) 指出,当未能在分类变量定义的每一组中观察到加权变量的所有数值时,就会存在一个问题:即 Stata 内部重新调整了组内的权重从而排除了组间比较的可能性。因此,Musau (2020) 提出了两种解决方案。

方案 1: 给数据集添加“伪观测值 (pseudo-observations) ”以确保加权变量的所有值都出现在分类变量的每一组中。

然而,这些额外的观测值可能会扭曲我们获得的图形。幸运的是,若增加的观测值是连续变量的缺失值则不会出现这种情况。我们可以使用命令 fillin 来实现,它可以通过为缺失的数据增加观测值而使变量的所有交互作用都存在。例如:


· fillin foreign rep78

· tabulate rep78 foreign

    Repair |
    Record |       Car type
      1978 |  Domestic    Foreign |     Total
-----------+----------------------+----------
         1 |         2          1 |         3 
         2 |         8          1 |         9 
         3 |        27          3 |        30 
         4 |         9          9 |        18 
         5 |         2          9 |        11 
-----------+----------------------+----------
     Total |        48         23 |        71 

此时,国外组中可以观察到 rep78 的所有数值。通过下述命令我们可以获得相应的散点图:

#d ;
twoway 
  (scatter mpg weight [aweight = rep78] if foreign==0, 
   mcolor(gs5) msymbol(smcircle_hollow))
  (scatter mpg weight [aweight = rep78] if foreign==1, 
   mcolor(gs11) msymbol(smcircle_hollow) 
   legend(order(1 "American" 2 "Foreign") row(1)) 
   text(31 2350 "2", color(black)) 
   text(41 2190 "1", color(black)) 
   text(18 2560 "4", color(black)) 
   text(21 2280 "3", color(black))
   scheme(sj));
#d cr

方案 2:借鉴 Cox (2005) 的做法,使用 separate 命令:

. separate mpg, by  (foreign) 

. #d ;
. twoway 
   scatter mpg? weight [aweight = rep78], 
   mcolor(gs5 gs11) 
   msymbol(smcircle_hollow smcircle_hollow) 
   legend(order(1 "American" 2 "Foreign") row(1)) 
   text(31 2350 "2", color(black)) 
   text(41 2190 "1", color(black)) 
   text(18 2560 "4", color(black)) 
   text(21 2280 "3", color(black)) 
   scheme(sj);
#d cr

两方案的图形见下图:

顶部和底部的图分别为执行解决方案前后的散点图,底部左图为方案 1,底部右图为方案 2。能够发现进行调整之后,可以在不同组之间比较 mpgweight 二者关系的差异。

从命令与图形可以看出,两方案的基本机制相同,但fillinseparate仍然存在一些差异。

fillinseparate 两个命令的 比较与注意事项

  • fillin 在数据集中增加了与分类变量定义的各组中加权变量的缺失值对应的观测值,separate 则在数据集中增加了与分类变量定义的组数相对应的变量。

  • 虽然由 fillin 产生的额外的观测值并未扭曲图形,但它扭曲了其他分析 (比如我们前面给出的两张交叉分析表) 。一旦图形创建完毕,我们应该根据 _fillin 变量的标记将这些额外的观测值删除,从而恢复原本的数据集。对于 separate 命令,其生成的额外变量并没有什么危害因而可删可不删。

  • 何时使用 fillin ? 何时使用 separate ?若在 graph twoway 命令中使用 if 限定词时,使用 separate 命令可以使语法更短。若是按分类变量定义的组来创建图形,那么应使用 fillin 命令,因为可以使用 by() 选项。

  • 就效率而言,由于最大尺寸的限制,向数据集添加变量似乎比添加观测值的成本更高。然而,由于在散点图中只有少数组可以合理地用加权标记来区分,实际比较一下这两种方法,这种差异并不重要。因此,对其中一个的偏爱有时是一个品味问题。

3. 参考文献

  • Musau, A., 2020. Stata tip 136: Between-group comparisons in a scatterplot with weighted markers. The Stata Journal, 20(2), pp.489-492. -PDF1-, -PDF2-

  • Nicholas J. Cox, 2005, Stata Tip 27: Classifying Data Points on Scatter Plots, Stata Journal, 5(4): 604–606. -PDF-

  • Whittaker, R. H. 1975. Communities and Ecosystems. New York: Macmillan.

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