滞后具有非唯一 id x 时间观察的变量
Lag a variable with non unique id x time observations
我每年都有重复的横截面。我有一个变量 var1
,它在给定年份的所有观测值中都是相同的(例如,给定年份的变量的平均值)。我想创建一个变量 var1_l
,它将是 var1
.
的滞后版本
例如,来自数据集
id1 year var1
3 1990 3.5
4 1990 3.5
5 1991 4
6 1991 4
7 1991 4
我想获得
id1 year var1 var1_l
3 1990 3.5 .
4 1990 3.5 .
5 1991 4 3.5
6 1991 4 3.5
7 1991 4 3.5
一个解决方案是使用 merge
但是 saving/restoring 当数据集很大时,数据集会花费很多时间。作为参考,下面是我目前的 merge
解决方案:
preserve
keep year var1
replace year = year - 1
bys year: keep if _n == 1
rename var1 var1_l
sort year
tempfile temp
save `temp'
restore
merge m:1 year using `temp', nogen sorted
另一种选择是使用 tabstat
返回的矩阵。我想知道是否有更优雅的解决方案(即 returns 。当 year - 1 中没有观察时)。
这似乎有点不寻常,但可能只是对标准问题的扭曲 as explained here。
. input id1 year var1
id1 year var1
1. 3 1990 3.5
2. 4 1990 3.5
3. 5 1991 4
4. 6 1991 4
5. 7 1991 4
6. end
. sort year id1
. generate var1_l = var1[_n-1] if year == year[_n-1] + 1
(4 missing values generated)
. replace var1_l = var1_l[_n-1] if year == year[_n-1] & missing(var1_l)
(2 real changes made)
. list
+----------------------------+
| id1 year var1 var1_l |
|----------------------------|
1. | 3 1990 3.5 . |
2. | 4 1990 3.5 . |
3. | 5 1991 4 3.5 |
4. | 6 1991 4 3.5 |
5. | 7 1991 4 3.5 |
+----------------------------+
这个答案与@Nick 的答案交叉,但结果略有不同。我只检查 year
是否不同,而他的代码检查 year
是否连续。
clear
set more off
input ///
id year var1
1 1990 3.5
3 1990 3.5
2 1990 3.5
1 1991 2
2 1991 2
3 1991 2
3 1992 6
2 1992 6
1 1992 6
3 1993 6
2 1993 6
1 1993 6
4 1993 6
1 1994 4.3
2 1994 4.3
3 1994 4.3
end
list, sepby(year)
*----- what you want -----
sort year
generate var2 = var1[_n-1] if year != year[_n-1]
by year : replace var2 = var2[1]
list, sepby(year)
我每年都有重复的横截面。我有一个变量 var1
,它在给定年份的所有观测值中都是相同的(例如,给定年份的变量的平均值)。我想创建一个变量 var1_l
,它将是 var1
.
例如,来自数据集
id1 year var1
3 1990 3.5
4 1990 3.5
5 1991 4
6 1991 4
7 1991 4
我想获得
id1 year var1 var1_l
3 1990 3.5 .
4 1990 3.5 .
5 1991 4 3.5
6 1991 4 3.5
7 1991 4 3.5
一个解决方案是使用 merge
但是 saving/restoring 当数据集很大时,数据集会花费很多时间。作为参考,下面是我目前的 merge
解决方案:
preserve
keep year var1
replace year = year - 1
bys year: keep if _n == 1
rename var1 var1_l
sort year
tempfile temp
save `temp'
restore
merge m:1 year using `temp', nogen sorted
另一种选择是使用 tabstat
返回的矩阵。我想知道是否有更优雅的解决方案(即 returns 。当 year - 1 中没有观察时)。
这似乎有点不寻常,但可能只是对标准问题的扭曲 as explained here。
. input id1 year var1
id1 year var1
1. 3 1990 3.5
2. 4 1990 3.5
3. 5 1991 4
4. 6 1991 4
5. 7 1991 4
6. end
. sort year id1
. generate var1_l = var1[_n-1] if year == year[_n-1] + 1
(4 missing values generated)
. replace var1_l = var1_l[_n-1] if year == year[_n-1] & missing(var1_l)
(2 real changes made)
. list
+----------------------------+
| id1 year var1 var1_l |
|----------------------------|
1. | 3 1990 3.5 . |
2. | 4 1990 3.5 . |
3. | 5 1991 4 3.5 |
4. | 6 1991 4 3.5 |
5. | 7 1991 4 3.5 |
+----------------------------+
这个答案与@Nick 的答案交叉,但结果略有不同。我只检查 year
是否不同,而他的代码检查 year
是否连续。
clear
set more off
input ///
id year var1
1 1990 3.5
3 1990 3.5
2 1990 3.5
1 1991 2
2 1991 2
3 1991 2
3 1992 6
2 1992 6
1 1992 6
3 1993 6
2 1993 6
1 1993 6
4 1993 6
1 1994 4.3
2 1994 4.3
3 1994 4.3
end
list, sepby(year)
*----- what you want -----
sort year
generate var2 = var1[_n-1] if year != year[_n-1]
by year : replace var2 = var2[1]
list, sepby(year)