次のような計算をしたい
by group: egen x if y==1 - x if y==2
もちろん、これは実際のstataコードではありませんが、私はちょっと迷っています。Rでは、これはintrestの変数の後ろにある「[]」によって渡されるだけですが、stataについてはよくわかりません。
Rは
x[y==1] - x[y==2]
次のような計算をしたい
by group: egen x if y==1 - x if y==2
もちろん、これは実際のstataコードではありませんが、私はちょっと迷っています。Rでは、これはintrestの変数の後ろにある「[]」によって渡されるだけですが、stataについてはよくわかりません。
Rは
x[y==1] - x[y==2]
Richard Herron はreshape
、別の構造に変更する価値があると指摘しています。ここでは、既存の構造でそれを行う方法に焦点を当てます。
の各グループに正確に 2 つの観測値があると仮定するとgroup
、1 つは で、y == 1
もう 1 つはy == 2
で、
bysort group (y) : gen diff = x[1] - x[2]
の値の差を与え、x
グループ内の 2 つの観測ごとに必ず繰り返されます。仮定のない方法は、
bysort group: egen mean_1 = mean(x / (y == 1))
by group: egen mean_2 = mean(x / (y == 2))
gen diff = mean_1 - mean_2
などの表現を考えてみましょうx / (y == 1)
。ここで、分母y == 1
は y が実際に 1 の場合は 1 であり、そうでない場合は 0 です。0 で除算すると、Stata に欠落が生じますが、egen
ここでのコマンドはそれらを無視します。したがって、上記の 3 つのコマンドの最初のコマンドは、x
for の観測値の平均を生成しy == 1
、2 番目のコマンドは、 x
whichの観測値の平均値を生成しますy == 2
。の他の値y
(欠落している場合でも) は無視されます。最初の方法が有効な場合、この方法は最初の方法と一致する必要があります。
同様の問題のレビューについては、http://stata-journal.com/article.html?article=dm0055を参照してください。
Stata では、if
ここで参照されるのは修飾子です (コマンドではありません)。
私は使用しますreshape
。
clear
version 11.2
set seed 2001
* generate data
set obs 100
generate y = 1 + mod(_n - 1, 2)
generate x = rnormal()
generate group = 1 + floor((_n - 1) / 2)
list in 1/10
* reshape to wide and difference
reshape wide x, i(group) j(y)
generate x_diff = x1 - x2
list in 1/5
reshape
Rでも使用します。そうしないと、すべてが適切に順序付けられており、必要な違いが得られると確信できますか?
きちんとした Mata ソリューションがある可能性がありますが、私は Mata をほとんど知りません。あなたがingを嫌うなら、あなたは見つけpreserve
て役立つかもしれません.restore
reshape