Loops 根据数据值有条件地计算和

Loops 根据数据值有条件地计算和,loops,if-statement,sum,stata,Loops,If Statement,Sum,Stata,我有一个相当大的冲突数据集(7100万次观察),包含许多变量和日期(每天) 这来自GDELT项目。每天都有一个目标国和一个侵略来源国。例如,2000年1月1日,许多国家对他人或自己采取了侵略行为 看起来是这样的: clear input long date_01 str18 source_01 str19 target_01 str4 cameocode_01 20000101 "AFG" "AFGGOV" "2" 20000101 "AFG" "AFGGOV" "8" 2000

我有一个相当大的冲突数据集(7100万次观察),包含许多变量和日期(每天)

这来自GDELT项目。每天都有一个目标国和一个侵略来源国。例如,2000年1月1日,许多国家对他人或自己采取了侵略行为

看起来是这样的:

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\u 01
是日期,
source\u 01
是发动侵略的国家,
target\u 01
是受害者,
cameocode\u 01
是表示敌意或合作程度的关注变量。如果数字介于
10
20
之间,则为敌对事件,其中
20
更为敌对。如果数字介于
0
9
之间,则表示合作(良好事件),其中
9
最友好

我已设法将每个国家的事件隔离,即隔离涉及一定数量国家的客串代码(我感兴趣的是
30
),以跟踪其冲突随时间的演变

我做了以下工作:

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
,我想在每个日期重复这一点,以便每个国家每天都有一个数字


有办法做到这一点吗

这似乎是您寻求的关键技巧

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 |
     +------------------------------------------------------------+
清除
输入长日期str6源浮点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
终止
egen num=总计(秒(cameocode>=10,cameocode,)),按(日期来源)
egen den=总计(秒(cameocode<10,cameocode,)),按(日期来源)
生成所需数量=num/den
排序日期源
列表,sepby(来源)
+------------------------------------------------------------+
|需要日期源目标cameoc~e num den|
|------------------------------------------------------------|
1. | 2000001 AFG IND 4 22 25.88|
2. | 2000001 AFG政府4 22 25.88|
3. | 2000001 AFG AFGGOV 2225.88|
4. | 2000001 AFG AFGGOV 8 22 25.88|
5. | 2000001 AFG IRQ 12 22 25.88|
6. | 2000001 AFG政府10 22 25.88|
7. | 2000001 AFG CVL 4 22 25.88|
8. | 2000001 AFG为3225.88|
|------------------------------------------------------------|
9. | 20000101阿夫戈夫卡苏阿夫8 0 11 0|
10. | 2000001阿夫戈夫卡苏阿夫3 0 11 0|
+------------------------------------------------------------+
有关技术,请参见。基本思想是许多
egen
函数允许表达式作为参数,这可能比变量名更复杂。在这里,我们使用
cond()
来指定只对特定间隔内的值求和

在创建变量方面,一个不那么透明但不那么浪费的方法将运行如下

egen-wanted=
!分子代码

egen den=
!分母代码

替换通缉犯=通缉犯/den


drop den

这很有意思,但在解释你的追求时可能会短得多。这些日期可能对你很有用,但对于许多Stata目的来说,它们是不合适的
generate betterdate=daily(string(date,“%8.0f”),“YMD”)
后跟一个“format”命令将为您提供更好的日期。请注意,尽管我们很乐意提供帮助,但我们也希望看到您的部分尝试编写代码来解决问题。我理解,但作为初学者,这有时会令人沮丧。我从你身上学到了很多,为此我感谢你并感谢你的帮助。希望随着病情好转,我需要的帮助会减少。我不介意。我只是在解释一个你可能会觉得有用的技巧。但我认为在许多不同的变量中重复相同的信息毫无意义。无论您想要什么,都已经在
日期源目标cameocode
中:我无法轻松想象您需要将其复制到(数百?)中的Stata目的其他变量。是因为我需要按国家对每个特定国家的股票回报进行回归,我认为这种方法很容易将其分割。但是谢谢你的技巧,我会进一步研究它。同样的评论:你不需要重复这些信息就可以做到这一点。