stata面板数据就近补全

这里只有作者精心编写的研究经历!
回复
头像
hellohappy
网站管理员
网站管理员
帖子: 364
注册时间: 2018年11月18日, 14:27
点赞次数: 1 time
被点赞: 9 time

#1 stata面板数据就近补全

未读帖子 hellohappy »

简介:
    有时候会遇到一种情况,就是数据的就近补全。这里举两个例子。基本前提:面板数据是地区为一个维度、时间为一个维度,分别为country_id 和 whichyear 两个变量。

举例一:
    这个例子是,假设有一个变量 EFW_SIZE_GOV  ,它在1980到2000年之间都是五年公布一次数据,2000年以后一年公布一次。我需要的数据是1980到2020年的所有数据。所以这里应该进行补全。
    (就近向下补全)假设我补全的方法是用1980年数据替换掉同一个国家地区的1981、1982、1983、1984年的数据。那么只需要以下命令即可:

代码: 全选

sort country_id whichyear
local x EFW_SIZE_GOV
replace `x' = `x'[_n-1] if `x' == . & country_id[_n-1] ==  country_id[_n] & whichyear <= 2020
    (就近向上补全)但是如果我希望用1985年数据替换掉同一个国家地区的1981、1982、1983、1984年的数据,一条命令是不行的,应该执行至少四次下面的命令。

代码: 全选

sort country_id whichyear
local x EFW_SIZE_GOV
replace `x' = `x'[_n+1] if `x' == . & country_id[_n+1] ==  country_id[_n] & whichyear <= 2020
    如果你懒得去数要执行多少次,那你直接让程序去按最大量来数。

代码: 全选

qui{
    sort country_id whichyear
    tabulate whichyear
    * 最多只需要循环 年数
    forvalue i = 1/`r(r)' {
        foreach x in EFW_SIZE_GOV{
            replace `x' = `x'[_n+1] if `x' == . & country_id[_n+1] ==  country_id[_n] & whichyear <= 2020
        }
    }
}
    上述中sort是不可省略的,因为你是通过编号_n来补全的。
举例二:
    另外一个例子很有意思,假如我有一个变量CPI,它是全世界各个国家不同年份的CPI。但是我想要生成一个美元的购买力变量,它用美国的CPI衡量。公式为:DOLLAR_DEFLATOR = CPI + 100 ,其中公式中的CPI为美国的CPI。

代码: 全选

* 美元的购买力用美国的CPI衡量
gen DOLLAR_DEFLATOR = .
* 仅替换美国的CPI数据
replace DOLLAR_DEFLATOR = CPI+100 if country_id == 251
* 接下来用补全的方法把其余国家补全
* 注意这里的sort,要先按年份再按国家地区排序
sort whichyear country_id
tabulate country_id if whichyear == 2020
* 最多只需要循环 个体数
forvalue i = 1/`r(r)' {
    * 向下补全
    replace DOLLAR_DEFLATOR = DOLLAR_DEFLATOR[_n-1] if DOLLAR_DEFLATOR == . & whichyear[_n-1] ==  whichyear[_n]
    * 向上补全
    replace DOLLAR_DEFLATOR = DOLLAR_DEFLATOR[_n+1] if DOLLAR_DEFLATOR == . & whichyear[_n+1] ==  whichyear[_n]
}
    这样就完成了。
    我觉得应该有什么命令可以一键生成的。但我目前确实不知道。

标签:
Link:
隐藏链接
显示链接

回复