あなたのコードは機能するにはほど遠いです。これはもっと近いはずです。
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'
}
generate
新しい変数を作成するには、コマンドを使用する必要があります。
引用符でローカル マクロ値を参照する必要があります。
egen
独自のmean()
機能がありますが、変数を生成しますが、ここでは定数が必要です。を使用summarize, meanonly
するのが最も効率的な方法です。Stata には、mean()
どこにでも適用できる機能はありません。を使用するsummarize
と、その結果を保持するためにローカル マクロを使用する必要はありません。ここでr(mean)
直接使用できます。
あなたは>=
2回持っていますが、おそらくそれを意味するものではありません. 条件を記述する際に使用inrange()
は必須ではありませんが、より短いコードが得られます。
修飾子を使用して、マクロのif
割り当てを修飾することはできません。local
このようなマクロは定数であるため、Stata には意味がありません。
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
そのような計算のためのフレームワークを提供します。