滞后于具有非唯一id x时间观测值的变量



我每年都有一个重复的横截面。我有一个变量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返回的矩阵。我想知道是否有一个更优雅的解决方案(当第一年没有观测到时,会返回)。

这看起来有点不寻常,但可能只是这里解释的标准问题的一个转折。

. 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)

最新更新