0

次のような計算をしたい

by group: egen x if y==1 - x if y==2

もちろん、これは実際のstataコードではありませんが、私はちょっと迷っています。Rでは、これはintrestの変数の後ろにある「[]」によって渡されるだけですが、stataについてはよくわかりません。

Rは

x[y==1] - x[y==2]
4

2 に答える 2

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 つのコマンドの最初のコマンドは、xfor の観測値の平均を生成しy == 1、2 番目のコマンドは、 xwhichの観測値の平均値を生成しますy == 2。の他の値y(欠落している場合でも) は無視されます。最初の方法が有効な場合、この方法は最初の方法と一致する必要があります。

同様の問題のレビューについては、http://stata-journal.com/article.html?article=dm0055を参照してください。

Stata では、ifここで参照されるのは修飾子です (コマンドではありません)。

于 2013-01-23T17:02:03.137 に答える
2

私は使用します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

reshapeRでも使用します。そうしないと、すべてが適切に順序付けられており、必要な違いが得られると確信できますか?

きちんとした Mata ソリューションがある可能性がありますが、私は Mata をほとんど知りません。あなたがingを嫌うなら、あなたは見つけpreserveて役立つかもしれません.restorereshape

于 2013-01-23T14:37:24.503 に答える