查看原文
其他

软件应用 | Stata数据处理:面板数据的填充和补漏

数据Seminar 2022-12-31

The following article is from 连享会 Author 连享会


本文转载自公众号连享会(ID:lianxh_cn)




目录

  • 问题描述

  • 解决方法1:使用 tssmooth ma 命令

  • 解决方法2:使用 duplicates tag 命令

  • 附:文中使用的代码


问题描述

我有一份面板数据,有些年份上的数据有两行或多行记录 (例如,本例中 2007 年的数据)。棘手的是,这两行数据存在差异,且无法判断哪一个记录是正确的。此时,比较稳妥的选择是:将这两汉数据都舍弃,使用相邻年度 (2006 和 2008 年) 的均值作为 2007 年的观察值 (插值)。

clear
input ID year var1 var2 var3
1 2006 34 45 65
1 2007 45 43 41
1 2007 3 56 59
1 2008 39 54 76
1 2009 41 57 68
end
save "data00.dta", replace

原始数据详情:

. list

+--------------------------------+
| ID year var1 var2 var3 |
|--------------------------------|
1. | 1 2006 34 45 65 |
2. | 1 2007 45 43 41 |
3. | 1 2007 3 56 59 |
4. | 1 2008 39 54 76 |
5. | 1 2009 41 57 68 |
+--------------------------------+


解决方法1:使用 tssmooth ma 命令

思路:

  • 先删除重复的观察值 (2007 年的数据)
  • 继而使用 tsfill 填充年份,让数据变成平行面板;
  • 最后用 tssmooth ma 命令插值 (用前后两年的平均值代替 2007 年的缺失值)。说明:此处 mamoving average 的简写。

命令如下:

. use "data00.dta", clear
*-删除重复值 (数据有误)
. drop if year == 2007
. tsset ID year
. tsfill
. list
+--------------------------------+
| ID year var1 var2 var3 |
|--------------------------------|
1. | 1 2006 34 45 65 |
2. | 1 2007 . . . |
3. | 1 2008 39 54 76 |
4. | 1 2009 41 57 68 |
+--------------------------------+
*-填充缺失值:
forv i = 1/3 {
tssmooth ma v`i' = var`i' , w(1, 0, 1)
replace var`i' = v`i' if var`i' == .
}
drop v?
list

运行结果如下:

. forv i = 1/3 {
2. tssmooth ma v`i' = var`i' , w(1, 0, 1)
3. replace var`i' = v`i' if var`i' == .
4. }
The smoother applied was
(1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var1
(1 real change made)
The smoother applied was
(1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var2
(1 real change made)
The smoother applied was
(1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var3
(1 real change made)

. drop v?

. list
+--------------------------------+
| ID year var1 var2 var3 |
|--------------------------------|
1. | 1 2006 34 45 65 |
2. | 1 2007 36.5 49.5 70.5 |
3. | 1 2008 39 54 76 |
4. | 1 2009 41 57 68 |
+--------------------------------+

从结果的提示信息可以看出 w(1, 0, 1) 选项的含义:

The smoother applied was
     (1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var1


解决方法2:使用 duplicates tag 命令

思路:

  • 使用 duplicates tag 命令标记重复的观察值,并使用 gen() 选项产生新变量用以记录标记情况;
  • 删除重复的观察值 (其实,这两步可以合为一步);
  • 使用 _n 标记观察先后顺序 (x[_n] 表示 x[_n-1] 表示 x[_n+1] 表示 ),进行插值;
clear
input id year var1 var2 var3
1 2006 34 45 65
1 2007 45 43 41
1 2007 3 56 59
1 2008 39 54 76
1 2009 41 57 68
end

使用 duplicates tag 标记重复的观察值:

. duplicates tag id year, gen(mistake)
. list
. bysort id year: keep if (_n == 1)
foreach v of varlist var1 var2 var3 {
replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake
}

结果如下:

. duplicates tag id year, gen(mistake)
Duplicates in terms of id year

. list // A-1
+------------------------------------------+
| id year var1 var2 var3 mistake |
|------------------------------------------|
1. | 1 2006 34 45 65 0 |
2. | 1 2007 45 43 41 1 |
3. | 1 2007 3 56 59 1 |
4. | 1 2008 39 54 76 0 |
5. | 1 2009 41 57 68 0 |
+------------------------------------------+

. bysort id year: keep if (_n == 1)
(1 observation deleted)

. list // A-2
+------------------------------------------+
| id year var1 var2 var3 mistake |
|------------------------------------------|
1. | 1 2006 34 45 65 0 |
2. | 1 2007 45 43 41 1 |
3. | 1 2008 39 54 76 0 |
4. | 1 2009 41 57 68 0 |
+------------------------------------------+

. foreach v of varlist var1 var2 var3 {
2. replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake
3. }

. list // A-3
+------------------------------------------+
| id year var1 var2 var3 mistake |
|------------------------------------------|
1. | 1 2006 34 45 65 0 |
2. | 1 2007 36.5 49.5 70.5 1 |
3. | 1 2008 39 54 76 0 |
4. | 1 2009 41 57 68 0 |
+------------------------------------------+


附:文中使用的代码

*------------
*-Solution 1:
* You could use tssmooth ma.
* For example:

clear
input ID year var1 var2 var3
1 2006 34 45 65
1 2007 45 43 41
1 2007 3 56 59
1 2008 39 54 76
1 2009 41 57 68
end

list

drop if year == 2007
tsset ID year
tsfill
list

forv i = 1/3 {
tssmooth ma v`i' = var`i' , w(1, 0, 1)
replace var`i' = v`i' if var`i' == .
}
drop v?
list

*------------
*-Solution 2:

clear
input id year var1 var2 var3
1 2006 34 45 65
1 2007 45 43 41
1 2007 3 56 59
1 2008 39 54 76
1 2009 41 57 68
end

duplicates tag id year, gen(mistake)
list
bysort id year: keep if (_n == 1)
list
foreach v of varlist var1 var2 var3 {
replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake
}
list




星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


软件应用 | 使用Stata清洗问卷数据

数据可视化 | 好图表坏图表,手把手教你正确选择图表

统计计量 | 鸡肋的豪斯曼检验与约定俗成的心传:为什么我们偏爱固定效应模型?

软件应用 | 常用的27个Stata命令

统计计量  | Angrist等:更好研究设计如何规避计量经济学弊端?实证经济学的可信度变革

统计计量 | 有了企业固定效应后,还需要行业固定效应吗?

数据资源 | 为什么要做数据清洗?







数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


推荐 | 青酱


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存