2016-09-07 30 views
0

我正在嘗試使用從time==1開始的一系列值填充的變量generate用較早時間點的值填充 - Stata

每當variablerest1w從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==1,trainload==.478然後是load==.478;但是,在time==11,然後load==.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,但使用時間顯然不會重新啓動序列)。

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

感謝您的幫助!

+3

您的問題聲明還不清楚。雖然在堆棧溢出中預期呈現代碼,但另一個期望是在這種情況下明確聲明您嘗試在代碼中實現的規則。我想我理解的唯一規則是「如果第一個序列有rest1w == 0,那麼load = trainload就是這個序列。」但即使這個規則只適用於第一個序列;它不適用於第三個序列,它又具有rest1w == 0。 – 2016-09-07 12:53:39

+0

由於不能很好地用書面形式解釋道歉,我希望我想要生成的變量的示例數據('x'和'load')可能有所幫助。我已經添加了我認爲你的意思的規則。對於第一個序列很容易,因爲顯然如果rest1w == 0,代碼只是'gen load = trainload',但是由於時鐘在後續序列(即第二序列)中重置,這使事情變得複雜。 –

+0

這幫助我,雖然它不能解釋如果任何後續序列比第一個序列更長會發生什麼。 – 2016-09-08 03:16:12

回答

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