2016-09-07 9 views
0

generateには、time==1で始まる一連の値を使って書き込まれた変数があります。前の時点の値を入力してください - 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からどのように再起動したいかを以下に示します。すなわち、第2のシーケンスでは、rest1w==0,load!=trainloadである。

0の新しいシーケンスごとに、loadの値が再び開始時刻(ここではtime==1)に戻ります。これは、loadの値の2番目の0の値が最初のシーケンスとまったく同じであることによって示されます。換言すれば、time==1,trainload==.478、次にload==.478である。しかし、ここでtime==11は、次いで、load==.478time==15load==.450(ここtime==5用としてload同じ)配列中の(クロックは、本質的にloadのでtime==1ために再起動します)。これが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の3番目のシーケンスには適用されません。 –

+0

私は生成したい変数のサンプルデータ( 'x'と' load')が役立つかもしれないと書いて説明することができないことをお詫びします。私はあなたがルールの意味すると思うものを加えました。明らかに、コードは 'gen load = trainload if rest1w == 0'であることは明らかであるが、後続のシーケンス(すなわち第2のシーケンス)においてタイムクロックがリセットされるので、これは事を複雑にする。 –

+0

これは、後続のシーケンスのいずれかが最初のシーケンスより長い場合に何が起こるかを説明していませんが、それに沿って私を助けます。 –

答えて

0

私はこれをstatalist.orgでクロスポストし、2つの実行可能な回答を得ました。

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 
関連する問題