我正在嘗試使用從time==1
開始的一系列值填充的變量generate
。用較早時間點的值填充 - Stata
每當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
,但使用時間顯然不會重新啓動序列)。
gen load=.
levelsof x, local(levels)
foreach l of local levels {
replace load=trainload if rest1w==0
replace load=restload if rest1w==1
}
感謝您的幫助!
您的問題聲明還不清楚。雖然在堆棧溢出中預期呈現代碼,但另一個期望是在這種情況下明確聲明您嘗試在代碼中實現的規則。我想我理解的唯一規則是「如果第一個序列有rest1w == 0,那麼load = trainload就是這個序列。」但即使這個規則只適用於第一個序列;它不適用於第三個序列,它又具有rest1w == 0。 – 2016-09-07 12:53:39
由於不能很好地用書面形式解釋道歉,我希望我想要生成的變量的示例數據('x'和'load')可能有所幫助。我已經添加了我認爲你的意思的規則。對於第一個序列很容易,因爲顯然如果rest1w == 0,代碼只是'gen load = trainload',但是由於時鐘在後續序列(即第二序列)中重置,這使事情變得複雜。 –
這幫助我,雖然它不能解釋如果任何後續序列比第一個序列更長會發生什麼。 – 2016-09-08 03:16:12