我有一个相当大的冲突数据集(7100万次观察),有许多变量和日期(每天)。
这是GDELT项目的。每天都有一个目标国家和一个侵略来源国。例如,在1 January 2000上,许多国家参与了针对他人或自己的侵略行为。
看起来是这样的:
clear
input long date_01 str18 source_01 str19 target_01 str4 cameocode_01
20000101 "AFG" "AFGGOV" "2"
20000101 "AFG" "AFGGOV" "8"
20000101 "AFG" "ARE" "3"
20000101 "AFG" "CVL" "4"
20000101 "AFG" "GOV" "10"
20000101 "AFG" "GOV" "4"
20000101 "AFGGOV" "kasUAF" "3"
20000101 "FRA" "kasUAF" "8"
20000101 "AFG" "IGOUNO" "3"
20000101 "AFG" "IND" "4"
20000101 "AFG" "IND" "12"
20000102 "AFG" "IND" "19"
end变量date_01是一天,source_01是发起侵略的国家,target_01是受害者,cameocode_01是关注的变量,表示敌对或合作的程度。如果这个数字介于10和20之间,那就是敌对事件,而20则是更具敌意的事件。如果数字介于0和9之间,则表示合作(好事件),其中9是最友好的。
我管理在这个平台的帮助下隔离每个国家的事件,即分离涉及一定数量的国家(我对30感兴趣)的cameo代码,以跟踪它们的冲突随时间的演变。
我做了以下工作:
foreach c in AFG IND ARE {
generate ind_`c' = cameocode_01 if strmatch(source_01, "`c'") | ///
strmatch(target_01, "`c'")
}这产生了所需的结果:
date source target cameocode ind_AFG ind_IND ind_ARE
1. 20000101 AFG AFGGOV 2 2
2. 20000101 AFG IND 4 4 4
3. 20000101 AFG AFGGOV 8 8
4. 20000101 AFG ARE 3 3 36
5. 20000101 AFG CVL 4 4
6. 20000101 AFG GOV 10 10
7. 20000101 AFG GOV 4 4
8. 20000101 AFGGOV kasUAF 3
9. 20000101 AFGGOV kasUAF 8
10. 20000101 AFG IRQ 12 12
11. 20000102 AFG IND 19 19 19 每当某个国家作为接收者或发起者参与进来时,我都会创建一个新的变量,将特定事件及其强度隔离为给定日期。
我现在要做的是能够创建一个标准化的度量或比率,对于每个日期,冲突度量的总和(从10到20)除以每个国家的合作措施(从1到9的数字)之和。
因此,对于上面的AFG 20000101表(第5列),我想要的输出是:
(12+19) / (2+4+8+3+4+4)我想对每个变量ind_COUNTRY CODE的每个日期重复这一步骤,使每个国家每天都有一个数字。
有办法这样做吗?
发布于 2019-05-07 09:42:19
这似乎是你要找的关键伎俩。
clear
input long date str6 source float cameocode
20000101 "AFG" 2
20000101 "AFG" 4
20000101 "AFG" 8
20000101 "AFG" 3
20000101 "AFG" 4
20000101 "AFG" 10
20000101 "AFG" 4
20000101 "AFGGOV" 3
20000101 "AFGGOV" 8
20000101 "AFG" 12
end
egen num = total(cond(cameocode >= 10, cameocode, .)), by(date source)
egen den = total(cond(cameocode < 10, cameocode, .)), by(date source)
generate wanted = num / den
sort date source
list, sepby(source)
+------------------------------------------------------------+
| date source target cameoc~e num den wanted |
|------------------------------------------------------------|
1. | 20000101 AFG IND 4 22 25 .88 |
2. | 20000101 AFG GOV 4 22 25 .88 |
3. | 20000101 AFG AFGGOV 2 22 25 .88 |
4. | 20000101 AFG AFGGOV 8 22 25 .88 |
5. | 20000101 AFG IRQ 12 22 25 .88 |
6. | 20000101 AFG GOV 10 22 25 .88 |
7. | 20000101 AFG CVL 4 22 25 .88 |
8. | 20000101 AFG ARE 3 22 25 .88 |
|------------------------------------------------------------|
9. | 20000101 AFGGOV kasUAF 8 0 11 0 |
10. | 20000101 AFGGOV kasUAF 3 0 11 0 |
+------------------------------------------------------------+有关技术,请参见本文第9节和第10节。基本思想是,许多egen函数允许将表达式作为参数,这可能比变量名称更复杂。在这里,我们使用cond()来指定只有在某些时间间隔内的值才应该被总计。
在创建变量方面,透明度较低但浪费较少的配方将运行如下
egen wanted =!分子密码!
egen den =!分母代码!
replace wanted = wanted / den
drop den
https://stackoverflow.com/questions/56019219
复制相似问题