2

私はStataにかなり慣れていません。

「国のGDP年」という形式の一連の観測があります。新しい変数GDP1960を作成したいと思います。これは、各国の1960年のGDPを毎年示します。

USA     $100m   1960        USA    $100m  1960  $100m
USA     $200m   1965   -->  USA    $200m  1965  $100m
Canada  $60m    1960        Canada $60m   1960  $60m

これを実現するための正しい構文は何ですか?(私はegenいくつかの不思議な方法で関与していると思います)

4

4 に答える 4

3

で解決策を見つけましたがcond()、データのモデリングをより簡単にし、変数を作成してソートするときに発生する可能性のある問題を回避するのに役立つ可能性のあるいくつかの提案がありrankます (そしてegen、あなたが以下で尋ねた解決策があります) ):

以下のコードを do ファイル エディターに貼り付けて実行します。

*---------------------------------BEGIN EXAMPLE
clear

inp str20 country str10 gdp year
"USA"     "$100m"   1960        
"USA"     "$200m"   1965     
"Canada"  "$60m"    1960 
"Canada"  "$120m"   1965
"USA"     "$250m"   1970
"Mexico"  "$90m"    1970  
"Canada"  "$800m"   1970     
"Mexico"  "$160m"    1960 
"Mexico"  "$220m"   1965
"Mexico"  "$350m"   1975
end

//1. destring gdp so that we can work with it
destring gdp,  ignore("$", "m") replace

//2. Create GDP for 1960 var:
    bys country: g x = gdp if year==1960
    bys country: egen gdp60 = max(x)
    drop x

    **you could also create balanced panels to see gaps in your data**
        preserve
    ssc install panels
    panels country year
    fillin country year
    li   //take a look at the results win. to see how filled panel data would look
        restore

//3. create a gdp variable for each year (reshape the dataset)
    drop gdp60
    reshape wide gdp, i(country) j(year)

    **much easier to use this format for modeling
    su gdp1970
     **here's a fake "outcome" or response variable to work with**
    g outcome =  500+int((1000-500+1)*runiform())
    anova outcome gdp1960-gdp1970  //or whatever makes sense for your situation
*---------------------------------END EXAMPLE
于 2010-05-18T20:53:27.483 に答える
1

さて、私は最終的に解決策を見つけました。これは、ソートされた順序でデータを処理し、_n を使用して現在の観測を参照できるという事実generateに依存しています。replace

gen rank = 100
replace rank = 50 if year == 1960

gen gdp60 = .

sort country rank
replace gdp60 = cond(iso == iso[_n-1], gdp60[_n-1], gdp[_n])

drop rank

sort country year

編集:同じフレーバーのより直接的なソリューション:

gen wanted = year == 1960
bysort country (wanted) : gen gdp60 = gdp[_N] 
drop wanted 
sort country year 

wanted1960 年の場合は 1、それ以外の場合は 0 になります 。

于 2010-05-01T08:29:56.533 に答える
1

1行のソリューションは

   egen gdp60 = mean(gdp / (year == 1960)), by(country) 

ここでのトリックは、式による除算year == 1960です。これは 1960 年に当てはまります。この場合、1 で割ると、gdpその年の は変更されません。それ以外の年はすべて false であり、その場合は 0 で割ります。おかしなことのように聞こえますが、ゼロで割った結果は欠損値であり、egen'smean()関数では無視されます。

他のegen関数を使用することもできます。この場合、国ごとに 1960 の値が最大で 1 つある必要があるため、たとえばmax()min()total()すべても機能するはずです。(ある国が 1960 年の値を持たない場合、または欠損値がある場合は、欠損値になりますが、これはまさに本来あるべき状態です。)

http://www.stata-journal.com/article.html?article=dm0055でのディスカッション

于 2013-06-29T18:58:08.957 に答える
0

次の 2 行より短いものは考えられません。

gen temp = gdp if year == 1960
by country : egen gdp60 = max(temp) 

年ごとの変数が必要な場合 (例: gdp60, gdp61, gdp62,...)、おそらく使用する必要がありますreshape

于 2010-11-03T21:49:08.027 に答える