Stata连享会 主页 || 视频 || 推文 || 知乎
温馨提示:定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh
Source: /forums/forum/general-stata-discussion/general/17996-substitute-rows-with-average-of-row-above-and-below
文章目录
@[toc]问题描述解决方法1: 使用 tssmooth ma 命令解决方法2: 使用 duplicates tag 命令附:文中使用的代码🍎 完整阅读:Stata数据处理:面板数据的填充和补漏
问题描述
我有一份面板数据,有些年份上的数据有两行或多行记录 (例如,本例中 年的数据)。棘手的是,这两行数据存在差异,且无法判断哪一个记录是正确的。此时,比较稳妥的选择是:将这两汉数据都舍弃,使用相邻年度 ( 和 年) 的均值作为 年的观察值 (插值)。
clearinput ID year var1 var2 var31 34 45 651 45 43 411 3 56 591 39 54 761 41 57 68endsave "data00.dta", replace
原始数据详情:
. list+--------------------------------+| ID year var1 var2 var3 ||--------------------------------|1. | 1 344565 |2. | 1 454341 |3. | 1 35659 |4. | 1 395476 |5. | 1 415768 |+--------------------------------+
解决方法1: 使用 tssmooth ma 命令
思路:
先删除重复的观察值 ( 年的数据)继而使用tsfill
填充年份,让数据变成平行面板;最后用tssmooth ma
命令插值 (用前后两年的平均值代替 年的缺失值)。
说明:此处ma是moving average的简写。
命令如下:
. use "data00.dta", clear*-删除重复值 (数据有误). drop if year == . tsset ID year. tsfill. list+--------------------------------+| ID year var1 var2 var3 ||--------------------------------|1. | 1 344565 |2. | 1 ... |3. | 1 395476 |4. | 1 415768 |+--------------------------------+*-填充缺失值: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 344565 |2. | 1 36.5 49.5 70.5 |3. | 1 395476 |4. | 1 415768 |+--------------------------------+
从结果的提示信息可以看出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]表示 xt;x_{t};xt;x[_n-1]表示 xt−1x_{t-1}xt−1;x[_n+1]表示 xt+1x_{t+1}xt+1),进行插值;
clearinput id year var1 var2 var31 34 45 651 45 43 411 3 56 591 39 54 761 41 57 68end
使用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 344565 0 |2. | 1 454341 1 |3. | 1 35659 1 |4. | 1 395476 0 |5. | 1 415768 0 |+------------------------------------------+. bysort id year: keep if (_n == 1)(1 observation deleted). list // A-2+------------------------------------------+| id year var1 var2 var3 mistake ||------------------------------------------|1. | 1 344565 0 |2. | 1 454341 1 |3. | 1 395476 0 |4. | 1 415768 0 |+------------------------------------------+. foreach v of varlist var1 var2 var3 { 2.replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake3. }. list // A-3+------------------------------------------+| id year var1 var2 var3 mistake ||------------------------------------------|1. | 1 344565 0 |2. | 1 36.5 49.5 70.5 1 |3. | 1 395476 0 |4. | 1 415768 0 |+------------------------------------------+
附:文中使用的代码
*------------*-Solution 1:* You could use tssmooth ma.* For example:clearinput ID year var1 var2 var31 34 45 651 45 43 411 3 56 591 39 54 761 41 57 68endlistdrop if year == tsset ID yeartsfilllist 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: clearinput id year var1 var2 var31 34 45 651 45 43 411 3 56 591 39 54 761 41 57 68endduplicates tag id year, gen(mistake) listbysort id year: keep if (_n == 1)listforeach v of varlist var1 var2 var3 { replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake}list
🍎 完整阅读:
Stata数据处理:面板数据的填充和补漏