Stata数据处理:统计组内非重复值个数

发布时间:2020-10-07 阅读 50

Stata 连享会   主页 || 视频 || 推文

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

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

作者: 李珍 (厦门大学)


目录


Note: 本文对命令的介绍基于 Nicholas J. Cox, Speaking Stata: Distinct observations, The Stata Journal (2008) 8, Number 4, pp. 557–568. PDF

本文以系统自带数据 auto.dta 进行介绍,如何识别一个变量或者一个数据集中有多少种不同的观察结果。例如,公司 i 在第 t 年发生了 30 多笔借贷业务,我们想知道这些业务涉及了多少家银行。

目前在 Stata 中有不少命令都可以处理这个问题,比如 contract , duplicates ,但这些命令在实现过程都破坏了原有的数据结构。在这里,我们推荐两种方法,一种是使用 egen 命令自带的 tag() 函数来标记非重复值的出现与否,进而使用 total()sum() 函数进行加总;另一种方法是直接使用外部命令 egenmore 提供的 nvals() 函数。

方法一:使用 _n 和 egen 命令的 tag() 函数

. sysuse auto.dta, clear
. drop nvals
. by foreign rep78, sort: generate nvals = _n == 1 
// “等式 _n==1” 表示:如果 foreign 和 rep78 的组合第一次出现,
// 则 nvlas 就赋值为 1,否则为 0
. replace nvals = sum(nvals)    // 对nvals进行加总
. replace nvals = nvals[_N]     // 将nvals的值替换为nvals的总数。
. dis nvals
10

可以看到,foreignrep78 一共有 10 种非重复组合。当然,如果使用 tab foreign rep78,mis 能够更直接看到这 10 种类型的分布情况。

更进一步,我们可以使用分组前缀命令 by 来计算不同组的非重复值个数。

sysuse "auto.dta", clear
drop nvals
by foreign rep78, sort: generate nvals = _n == 1
by foreign: replace nvals = sum(nvals)	//计算不同foreign类别下,对 rep788 的非重复值进行计数
by foreign: replace nvals = nvals[_N]	//在不同foreign组下,计算 rep78 的非重复值。

这里当然也可以使用 by foreign: tab rep78,mis 列表呈现样本的分布特征。

我们可以使用 tag()varlist 的观察值进行标记。用 tag 可以识别出相同的观察值,并将第一次出现的观察标记为 1 ,其余所有相同观察值标记为 0 ,进而识别出所有的非重复值。

sysuse "auto.dta", clear
egen tag = tag(foreign rep78)	//识别出不同的 foreign 和 rep78 组合
egen nvals = total(tag), by(foreign)	//计算不同 foreign 类别情况下, rep78 各有多少个非重复值
tabdisp foreign, cell(nvals)	//列表展示出结果
** 注意:tabdisp 利用表格展示数据,不计算统计结果。
----------------------
 Car type |      nvals
----------+-----------
 Domestic |          5
  Foreign |          3
----------------------

需要注意的是,使用 tag() 计算出的类别与使用 等式 _n==1 有所不同,这是因为 tag() 忽略了变量中缺失值,即不将缺失值样本作为非重复样本进行计算。

方法二:使用 egenmore 命令的 nvals() 函数

使用命令 egenmore 提供的 nvals() 函数,仅一步就可以提供上述分解的简单的步骤的操作结果。

2.1 下载安装

ssc install egenmore, replace

2.2 语法结构

egen newvar = nvals(varname) [, by(byvarlist) missing]

newvar 的返回值即为 varname 变量非重复值的数量。除非指定了 missing ,否则 nvals 在计算非重复值个数时不会考虑缺失值。

2.3 应用范例

sysuse "auto.dta", clear
egen a1 = nvals(rep78)	//使用 nvals() 得到 rep78 的非重复值个数
egen a2 = nvals(rep78), by(foreign)	//不同 foreign 类别下 rep78 的非重复值个数
egen a2 = nvals(rep78), by(foreign) mis	//考虑缺失值的情况下,不同 foreign 类别下 rep78 的非重复值个数

方法三: distinct 命令

同样地,使用命令 distinct 也可以得到不同观察值的数量。 distinct 可以单独报告每个变量包含的非重复值的数量,也可以报告多个变量联合的组中非重复值的数量。变量既可以是数值型,也可以是字符型。注意,默认情况下, distinct 也不将缺失值记为一类,除非在命令中附加了 missing 选项。

3.1 下载安装

ssc install distinct, replace 

3.2 语法结构

distinct [varlist] [if] [in] [, missing abbrev(#) joint minimum(#) maximum(#) ]

可以搭配 by 语句使用

3.3 命令使用

sysuse "auto.dta", clear

distinct	//列出所有变量的样本数和非重复值个数

              |        Observations
              |      total   distinct
--------------+----------------------
         make |         74         74
        price |         74         74
          mpg |         74         21
        rep78 |         69          5
     headroom |         74          8
        trunk |         74         18
       weight |         74         64
       length |         74         47
         turn |         74         18
 displacement |         74         31
   gear_ratio |         74         36
      foreign |         74          2
          tag |         74          2
        nvals |         74          2
           a1 |         69          2


by foreign, sort: distinct rep78	//列出不同foreign类别下,rep的样本数和非重复值数量
----------------------------------------------------------------------
-> foreign = Domestic

       |        Observations
       |      total   distinct
-------+----------------------
 rep78 |         48          5

----------------------------------------------------------------------
-> foreign = Foreign

       |        Observations
       |      total   distinct
-------+----------------------
 rep78 |         21          3

4. 结语

识别一个变量或者联合多个变量时非重复值的个数,一方面可以把握样本的数据分布,另一方面,在绘图中,识别出变量重复值是很有用的,因为没有必要一次又一次地绘制完全相同的坐标。

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD