填写较早时间点的值 - Stata

时间:2016-09-07 03:27:35

标签: stata

我正在尝试generate使用从time==1开始的值序列填充的变量。

每次variable rest1w从0更改为1时,序列都会更改,反之亦然。

首先,我认为我需要生成x,这是序列重新开始的地方(参见下面的示例数据集)。在我的例子中,这是统一的,但在我的完整数据集中,变化是变化的(即每次第5次观察时它都不会改变)。

 list time restload trainload rest1w x in 1/15

         +-----------------------------------------+
         | time   restload   trainload   rest1w   x |
         |-----------------------------------------|
      1. |    1   .1994715   .4780615        0   1 |
      2. |    2   .2077734    .471063        0   2 |
      3. |    3   .2157595   .4641159        0   3 |
      4. |    4   .2234298   .4572202        0   4 |
      5. |    5   .2307843   .4503757        0   5 |
         |-----------------------------------------|
      6. |    6   .2378229   .4435827        1   1 |
      7. |    7   .2445457    .436841        1   2 |
      8. |    8   .2509527   .4301506        1   3 |
      9. |    9   .2570438   .4235116        1   4 |
     10. |   10   .2628191   .4169239        1   5 |
         |-----------------------------------------|
     11. |   11   .2682785   .4103876        0   1 |
     12. |   12   .2734221   .4039026        0   2 |
     13. |   13   .2782499    .397469        0   3 |
     14. |   14   .2827618   .3910867        0   4 |
     15. |   15   .2869579   .3847558        0   5 |
         +-----------------------------------------+

其次,我需要generate变量load。下面的内容显示了每次序列重启时我想从time==1重新启动的方式。也就是说,在rest1w==0load!=trainload

的第二个序列

规则是,对于0的每个新序列,load的值再次返回到时间的开始(其中time==1)。这通过0的第二序列中的load值与第一序列完全相同来证明。换句话说,time==1trainload==.478然后load==.478;但是time==11load==.478(时间基本上重新启动load所以time==1)和time==15load==.450(相同)关于load)的地方time==5。这就是我想生成x的原因,因为我认为我可以将其用作新的time变量。

         +-----------------------------------------+
         | time   restload   trainload   rest1w   x  load
         |-----------------------------------------
      1. |    1   .1994715   .4780615        0   1   .4780615
      2. |    2   .2077734    .471063        0   2   .471063
      3. |    3   .2157595   .4641159        0   3   .4641159
      4. |    4   .2234298   .4572202        0   4   .4572202
      5. |    5   .2307843   .4503757        0   5   .4503757
         |-----------------------------------------
      6. |    6   .2378229   .4435827        1   1   .1994715
      7. |    7   .2445457    .436841        1   2   .2077734
      8. |    8   .2509527   .4301506        1   3   .2157595
      9. |    9   .2570438   .4235116        1   4   .2234298
     10. |   10   .2628191   .4169239        1   5   .2307843
         |-----------------------------------------
     11. |   11   .2682785   .4103876        0   1   .4780615 
     12. |   12   .2734221   .4039026        0   2   .471063
     13. |   13   .2782499    .397469        0   3   .4641159
     14. |   14   .2827618   .3910867        0   4   .4572202
     15. |   15   .2869579   .3847558        0   5   .4503757
         +-----------------------------------------+

以下代码仅为我提供了_n==1

的条目
gen load==.
replace load = restload[_n==1] if rest1w==1 

我喜欢levelsof的使用但是还没有能够让它发挥作用(虽然它可能会在我生成x之后起作用,但是在使用时间时它并没有&#39} ; t显然重启序列。

gen load=.
levelsof x, local(levels) 
 foreach l of local levels {
     replace load=trainload if rest1w==0
     replace load=restload if rest1w==1  
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我最终在statalist.org上交叉发布了这个,得到了两个可行的答案。

http://www.statalist.org/forums/forum/general-stata-discussion/general/1355917-fill-with-values-from-an-earlier-time-point

这些是:

gen newtime = 1 if rest1w[_n - 1] != rest1w
replace newtime = newtime[_n - 1] + 1 if newtime == .
gen newload = cond(rest1w == 0, trainload[newtime], restload[newtime])

和...

gen newtime = 1 
replace newtime = newtime[_n-1] + 1 if rest1w == rest1w[_n-1]
gen newload = .
replace newload = restload[newtime] if rest1w == 1
replace newload = trainload[newtime] if rest1w == 0