1

このための不明な機能meanを取得しています。egen値ごとに計算する必要があるため使用できません。少し混乱しています。

edu_mov_avg=.
forvalues current_year =  2/133 {
    local current_mean = mean(higra) if longitbirthqtr >= current_year - 2  & longitbirthqtr >= current_year + 2
    replace edu_mov_avg = current_mean if longitbirthqtr = 
}
4

1 に答える 1

3

あなたのコードは機能するにはほど遠いです。これはもっと近いはずです。

gen edu_mov_avg = .
qui forvalues current_qtr =  2/133 {
    su higra if inrange(longitbirthqtr, `current_qtr' - 2, `current_qtr' + 2), meanonly  
    replace edu_mov_avg = r(mean) if longitbirthqtr == `current_qtr' 
}
  1. generate新しい変数を作成するには、コマンドを使用する必要があります。

  2. 引用符でローカル マクロ値を参照する必要があります。

  3. egen独自のmean()機能がありますが、変数を生成しますが、ここでは定数が必要です。を使用summarize, meanonlyするのが最も効率的な方法です。Stata には、mean()どこにでも適用できる機能はありません。を使用するsummarizeと、その結果を保持するためにローカル マクロを使用する必要はありません。ここでr(mean)直接使用できます。

  4. あなたは>=2回持っていますが、おそらくそれを意味するものではありません. 条件を記述する際に使用inrange()は必須ではありませんが、より短いコードが得られます。

  5. 修飾子を使用して、マクロのif割り当てを修飾することはできません。localこのようなマクロは定数であるため、Stata には意味がありません。

  6. longitbirthqtr四半期ごとの日付のようです。したがって、私は名前を使用しませんでしたcurrent_year

この短いウィンドウでは、時系列演算子を使用する代替手段があります

tsset current_qtr 
gen edu_mov_avg = (L2.higra + L1.higra + higra + F1.higra + F2.higra) / 5 

最初の 2 つの観測値と最後の 2 つの観測値で欠損値が返されるため、これは厳密には同じではありません。

データがパネル データの場合、コードにさらに作業が必要になる場合があります。ただし、パネル識別子を宣言する限り、時系列演算子のアプローチは簡単です。

tsset panelid current_qtr 

その後のgenerate呼び出しは上記と同じです。

そうは言っても、rollingそのような計算のためのフレームワークを提供します。

于 2013-09-24T01:27:35.423 に答える