Stata数据处理: 面板数据填充和补漏
?
Stata連享會 ? 主頁 || 視頻 || 推文 || 知乎
溫馨提示: 定期 清理瀏覽器緩存,可以獲得最佳瀏覽體驗。
New! lianxh 命令發(fā)布了:
隨時搜索連享會推文、Stata 資源,安裝命令如下:
? . ssc install lianxh
使用詳情參見幫助文件 (有驚喜):
? . help lianxh
?
?
Source: http://www.statalist.org/forums/forum/general-stata-discussion/general/17996-substitute-rows-with-average-of-row-above-and-below
?
文章目錄
- @[toc]
- 問題描述
- 解決方法1: 使用 tssmooth ma 命令
- 解決方法2: 使用 duplicates tag 命令
- 附:文中使用的代碼
- 🍎 完整閱讀:
- Stata數(shù)據(jù)處理:面板數(shù)據(jù)的填充和補(bǔ)漏
- @[toc]
- 問題描述
- 解決方法1: 使用 tssmooth ma 命令
- 解決方法2: 使用 duplicates tag 命令
- 附:文中使用的代碼
- 🍎 完整閱讀:
- Stata數(shù)據(jù)處理:面板數(shù)據(jù)的填充和補(bǔ)漏
問題描述
我有一份面板數(shù)據(jù),有些年份上的數(shù)據(jù)有兩行或多行記錄 (例如,本例中 2007 年的數(shù)據(jù))。棘手的是,這兩行數(shù)據(jù)存在差異,且無法判斷哪一個記錄是正確的。此時,比較穩(wěn)妥的選擇是:將這兩漢數(shù)據(jù)都舍棄,使用相鄰年度 (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原始數(shù)據(jù)詳情:
. 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 命令
思路:
- 先刪除重復(fù)的觀察值 (2007 年的數(shù)據(jù))
- 繼而使用 tsfill 填充年份,讓數(shù)據(jù)變成平行面板;
- 最后用 tssmooth ma 命令插值 (用前后兩年的平均值代替 2007 年的缺失值)。
說明:此處 ma 是 moving average 的簡寫。
命令如下:
. use "data00.dta", clear *-刪除重復(fù)值 (數(shù)據(jù)有誤) . 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運行結(jié)果如下:
. 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 |+--------------------------------+從結(jié)果的提示信息可以看出 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 命令標(biāo)記重復(fù)的觀察值,并使用 gen() 選項產(chǎn)生新變量用以記錄標(biāo)記情況;
- 刪除重復(fù)的觀察值 (其實,這兩步可以合為一步);
- 使用 _n 標(biāo)記觀察先后順序 (x[_n] 表示 xt;x_{t};xt?;x[_n-1] 表示 xt?1x_{t-1}xt?1?;x[_n+1] 表示 xt+1x_{t+1}xt+1?),進(jìn)行插值;
使用 duplicates tag 標(biāo)記重復(fù)的觀察值:
. 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}結(jié)果如下:
. 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 mistake3. }. 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 endlistdrop 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 endduplicates 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數(shù)據(jù)處理:面板數(shù)據(jù)的填充和補(bǔ)漏
?
總結(jié)
以上是生活随笔為你收集整理的Stata数据处理: 面板数据填充和补漏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么批量给文件名编号?
- 下一篇: crossWalk替换webView集成