
私は、数年にわたる多くの国の治安状況に関する指数を持っています。それぞれの国について、特定の年で何カ国が先行し、何カ国が遅れているかを調べたいのです。以下に添付した画像では、私がやりたいことを示したいと考えています。アルバニア (ALB) については手動で計算しました。サンプル内の合計 4 カ国のうち、1995 年には 3 カ国がアルバニアより先行し、1 カ国もアルバニアより下でした。同様に、1996 年には 2 カ国がアルバニアより上、1 カ国が下でした。1997 年と 1998 年も同様です。
ここでの問題は、134 か国と 16 年があることです。手動で行うには数週間かかります。MS Excel で次の数式を試しましたが、成功しませんでした。
=IF($B:$B=B2,COUNTIF($C$2:$C$17,"<"&C2))
これを実行する方法について何かアイデアはありますか? 提案があれば歓迎します。私は MS Excel と Stata を同時に使用しているため、どのプラットフォームでも動作します。
答え1
Stata での 1 つの方法:
clear all
set more off
*----- example data -----
input ///
country year law
1 1996 235
1 1997 25
1 1998 6445
2 1996 436
2 1997 2356
2 1998 224
3 1996 3129
3 1997 735
3 1998 836
end
list, sepby(country)
*----- what you want -----
sort year law
by year: gen ahead = _N - _n
by year: gen behind = _n - 1
sort country year
list, sepby(country)
もちろん、いくつかの仮定は立てられています。
編集
戦略は実にシンプルです。データを で並べ替えますyear law
。結果は次のようになります。
. list, sepby(year)
+-----------------------+
| country year law |
|-----------------------|
1. | 1 1996 235 |
2. | 2 1996 436 |
3. | 3 1996 3129 |
|-----------------------|
4. | 1 1997 25 |
5. | 3 1997 735 |
6. | 2 1997 2356 |
|-----------------------|
7. | 2 1998 224 |
8. | 3 1998 836 |
9. | 1 1998 6445 |
+-----------------------+
ここで、各グループごとにyear
、最初の観測値(つまり、観測値1、4、7)が他の2つの観測値に追い抜かれている(つまり、観測値1は2、3に追い抜かれ、観測値4は5、6に追い抜かれ、観測値7は8、9に追い抜かれている)ことに注意する必要があります。これは、二ahead
観測値1、4、7の観測値。
次に、各year
グループごとに、2番目の観測値(つまり、観測値2、5、8)が他の1つの観測値に追い抜かれます。これは、1つahead
観察2、5、8の観察。
最後に、各year
グループごとに、3番目の観測値(つまり、観測値3、6、9)は、他の観測値に追い抜かれていません。これは、ゼロahead
観察3、6、9の観察。
これで、グループsort
ごとにデータを適切に処理した後year
、シーケンスを作成するだけでよいことがわかります。2、1、0変数については、 としますahead
。これはいくつかの方法で行うことができます。私は、添え字 ( を参照help subscripting
) とシステム変数_n
および_N
( を参照help _variables
) を使用して行うことにしました。_N
はグループあたりの観測値の合計数 (3) で、 は_n
グループあたりの現在の観測値です。例: 観測値 1 の場合、計算は です3-1 = 2
。観測値 2 の場合は3-2 = 1
、などとなります。
変数behind
も同様に計算されます。
結果は次のとおりです。
+----------------------------------------+
| country year law ahead behind |
|----------------------------------------|
1. | 1 1996 235 2 0 |
2. | 2 1996 436 1 1 |
3. | 3 1996 3129 0 2 |
|----------------------------------------|
4. | 1 1997 25 2 0 |
5. | 3 1997 735 1 1 |
6. | 2 1997 2356 0 2 |
|----------------------------------------|
7. | 2 1998 224 2 0 |
8. | 3 1998 836 1 1 |
9. | 1 1998 6445 0 2 |
+----------------------------------------+
私のコードでは、新しい変数を計算した後、sort
データを元の並べ替え順序 ( country year
) で再度表示します。
答え2
ExcelではCOUNTIFS
(末尾に「S」が付く)複数の条件でカウントするために使用できるので、D2にコピーしたこの数式を試してください。
=COUNTIFS(B:B,B2,C:C,">"&C2)
E2の場合は<を>に反転するだけです
答え3
年で並べ替えて、数式を 16 回適用します。数式は次のようになります。=COUNTIF($C$2:$C$13,">"&C2)
ここで、「C2-C13 is range of values for each year and
C2」は、比較する必要のある国 (年) の値です。国の場合はそれほど時間はかからないと思います (おそらく 1 分程度)。
答え4
国を数えるには$i=1,...,n=164$を使用し、年を数えるには$t=1,...,16$を使用します。
$s_{it}$ を年 $t$ における国 $i$ のスコアとします。また、$\alpha_{it}$ を年 $t$ における国 $i$ より進んでいる国の数、$\beta_{it}$ を年 $t$ における国 $i$ より遅れている国の数とします。
当然のことながら(同点がないと仮定すると、決定を下す必要があります)、
$$ \alpha_{it}+\beta_{it}= N-1,\;\; \forall t$$ 素朴な方法:
1)16 個の観測値を(Excel で)分離し、それぞれ 164 個の断面からなる 16 個の断面シリーズを取得します。16 個のベクトルのそれぞれの値の ID を、どのような形式でも保持します(3 文字の国 ID、年)。
2)16個のベクトルを大きさ順に並べると、最低スコア最高スコア 3)16個のソートされたベクトルのそれぞれ右または左に、数列${1,2,3,...,164}$を作成します。
したがって、最低スコア$s_{it}$は数字$1$に関連付けられ、最高スコアは数字$164$に関連付けられます。
各国を各年のスコアに基づいてランク付けしました、順位$r_{it}$を表します。
それから
$$\alpha_{it} = 164-r_{it},\;\;\; \beta_{it} = r_{it}-1 $$
どれくらい時間がかかると思いますか?