Stata - 如何为面板数据中的每个t创建具有值的T变量

时间:2016-10-14 14:50:55

标签: stata

很抱歉,如果我的问题标题不清楚,但很难在一行汇总。我有一个面板数据集(生成它的代码位于底部):

. xtset id year
       panel variable:  id (strongly balanced)
        time variable:  year, 1 to 3
                delta:  1 unit

. l, sep(3)

     +-----------------+
     | id   year     x |
     |-----------------|
  1. |  1      1   1.1 |
  2. |  1      2   1.2 |
  3. |  1      3   1.3 |
     |-----------------|
  4. |  2      1   2.1 |
  5. |  2      2   2.2 |
  6. |  2      3   2.3 |
     +-----------------+

我想创建变量x_1x_2x_3,其中x_jx {{1}中的值为year每个j。我可以按照以下方式实现它(没有追求优雅):

id

有没有使用循环的方法?我知道我可以写一个. forv k=1/3 { 2. capture drop tmp 3. gen tmp = x if year==`k' 4. by id: egen x_`k' = mean(tmp) 5. } (4 missing values generated) (4 missing values generated) (4 missing values generated) . drop tmp . l, sep(3) +-----------------------------------+ | id year x x_1 x_2 x_3 | |-----------------------------------| 1. | 1 1 1.1 1.1 1.2 1.3 | 2. | 1 2 1.2 1.1 1.2 1.3 | 3. | 1 3 1.3 1.1 1.2 1.3 | |-----------------------------------| 4. | 2 1 2.1 2.1 2.2 2.3 | 5. | 2 2 2.2 2.1 2.2 2.3 | 6. | 2 3 2.3 2.1 2.2 2.3 | +-----------------------------------+ program文件(自动确定变量名称),但我想知道是否有一些内置命令用于我的目的。

完整的命令在这里。

ado

3 个答案:

答案 0 :(得分:2)

循环很好。我能为你做的是缩短你的循环:

clear all
set obs 6
gen id = floor((_n-1)/3)+1
by id, sort: gen year = _n
xtset id year
gen x = id+year/10
l, sep(3)

forv k=1/3 {
    by id: gen x_`k' = x[`k'] 
}

l, sep(3)

平衡面板有一个体面的假设。这个循环不做这样的假设,但你需要循环观察的年份:

forv year = 1/3 {
    by id: egen X_`year' = total(x / (year == `year'))  
}

另见this discussion,尤其是第9和10节。

您可能也对separate感兴趣,它避免了显式循环,但只能让您找到想要的位置。

所有这一切,很难相信你根本就需要这些变量。时间序列算子的机制解决了许多问题,而rangestat(SSC)等工具填补了许多空白。

答案 1 :(得分:2)

迟到条目,但如果您想使用reshapemerge,则可以避免循环:

clear *
input float(id year x)
1 1 1.1
1 2 1.2
1 3 1.3
2 1 2.1
2 2 2.2
2 3 2.3
end

tempfile master
save `master'

reshape wide x, i(id) j(year)

tempfile using
save `using'

use `master', clear
merge m:1 id using `using', nogen

答案 2 :(得分:1)

这个"答案",我发帖因为评论太长,包含了Nick Cox回答后的实践结果。所有的积分都归他所有。

方法1:使用egentotal, missing

levelsof year, local(yearlevels)
foreach v of varlist x {
    foreach year of local yearlevels {
        by id: egen `v'_`year' = total(`v' / (year==`year')), missing
    }
}

missing选项处理不平衡的面板。

方法2:使用separate然后复制值。

foreach v of varlist x {
    separate `v', by(year) gen(`v'_)
    local newvars = r(varlist)
    foreach w of local newvars {
        by id: egen f_`w' = total(`w'), missing
    }
    drop `newvars'
}

这也处理不平衡面板,但新变量名称为f_x_1等。第一种方法需要year级别,而第二种方法需要创建一组中间变量。我个人稍微偏爱第一个。如果可以缩短方法2,那就太棒了。