很抱歉,如果我的问题标题不清楚,但很难在一行汇总。我有一个面板数据集(生成它的代码位于底部):
. 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_1
,x_2
和x_3
,其中x_j
在x
{{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
答案 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)
迟到条目,但如果您想使用reshape
和merge
,则可以避免循环:
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:使用egen
和total, 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,那就太棒了。