我正在尝试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==0
,load!=trainload
。
规则是,对于0的每个新序列,load
的值再次返回到时间的开始(其中time==1
)。这通过0的第二序列中的load
值与第一序列完全相同来证明。换句话说,time==1
,trainload==.478
然后load==.478
;但是time==11
,load==.478
(时间基本上重新启动load
所以time==1
)和time==15
,load==.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
}
感谢您的帮助!
答案 0 :(得分:0)
我最终在statalist.org上交叉发布了这个,得到了两个可行的答案。
这些是:
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