在Stata的重复横截面中使变量滞后

时间:2015-03-24 02:22:06

标签: stata

我每年都有一个重复的横截面。我有一个变量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,但是当数据集很大时,保存/恢复数据集需要花费大量时间。作为参考,下面是我目前的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返回的矩阵。我想知道是否有一个更优雅的解决方案(当年内没有观察时返回。 - 1)。

2 个答案:

答案 0 :(得分:3)

这似乎有点不寻常,但可能只是对标准问题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 

. gen 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 |
     +----------------------------+

答案 1 :(得分:2)

这个答案与@ Nick's交叉,但结果方面略有不同。我只检查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

gen var2 = var1[_n-1] if year != year[_n-1]
by year : replace var2 = var2[1]

list, sepby(year)