楼主: yayacuiliu
1592 8

[原创博文] 程序求助 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

22%

还不是VIP/贵宾

-

威望
0
论坛币
4 个
通用积分
2.0004
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
2817 点
帖子
87
精华
0
在线时间
158 小时
注册时间
2008-9-16
最后登录
2024-9-27

楼主
yayacuiliu 发表于 2011-12-15 08:44:33 |AI写论文
10论坛币
贸易数据格式举例如下(为贸易数据):
有不同的进口方,不同的出口方,不同的商品。年份连续或者不连续。
同时进口方为多个,出口方为多个,产品类别多个。
相同进口出口方和商品的,归为同一组。其中年份连续的各项(即相同进口方、出口方以及相同商品的并且年份连续的)归为同一段。
进口方 出口方 产品类别 年份 分段 分组
001 0024 01010101 1990 1 1
001 0024 01010101 1991 1 1
001 0024 01010101 1994 2 1
001 0024 01010101 1995 2 1
001 0024 01010101 1996 2 1
001 0024 02020220 1993 3 2
001 0024 02020220 1994 3 2
001 0024 02020220 1995 3 2
001 0036 01010101 1996 4 3
001 0036 01010101 1997 4 3
001 0036 02020220 1998 5 4
001 0036 02020220 2001 6 4
002 0024 01010101 1991 7 5
002 0024 01010101 1994 8 5
002 0035 01010101 1995 9 6
002 0035 02000000 1993 10 7
002 0035 02000000 1994 10 7
002 0035 02000000 1998 11 7
002 0038 02020220 1993 12 8
002 0038 02020220 1994 12 8
002 0038 02020220 1995 12 9
003 0024 01010101 1996 13 10
003 0036 02020220 1993 14 11
003 0036 02020220 1994 14 11
003 0038 02020220 1995 15 12
.
.
.


另外我有发生银行危机数据(多个出口方,多个年份)
出口方 年份
0024 1994
0035 1996
0036 1998
0038 1995
。。。

我需要生成两个状态变量。STATUS和TREAT
出口方每段贸易数据年份区间不包括银行危机年份的,每段的最后年份不等于银行危机年份的(比如分段=1的),STATUS=0 TREAT=0;最后年份等于银行危机年份的 STATUS=1 TREAT=0.出口方每段贸易数据年份区间包括银行危机年份的, 每段的最后年份等于银行危机年份的(比如分段=12) STATUS=1 TREAT=1
每段的最后年份不等于银行危机年份的(比如分段=2) STATUS=0 TREAT=1

希望我描述清楚了。谢谢高手!

最佳答案

可~乐 查看完整内容

额,我试着编了一下,可能我把它改得比较复杂了,代码比较长一点,你试试看
关键词:status treat 银行危机 贸易数据 状态变量 程序 贸易

沙发
可~乐 发表于 2011-12-15 08:44:34
额,我试着编了一下,可能我把它改得比较复杂了,代码比较长一点,你试试看
  1. data test1;
  2. input in $ out $ size $ year fenduan group;
  3. cards;
  4. 001 0024 01010101 1990 1 1
  5. 001 0024 01010101 1991 1 1
  6. 001 0024 01010101 1994 2 1
  7. 001 0024 01010101 1995 2 1
  8. 001 0024 01010101 1996 2 1
  9. 001 0024 02020220 1993 3 2
  10. 001 0024 02020220 1994 3 2
  11. 001 0024 02020220 1995 3 2
  12. 001 0036 01010101 1996 4 3
  13. 001 0036 01010101 1997 4 3
  14. 001 0036 02020220 1998 5 4
  15. 001 0036 02020220 2001 6 4
  16. 002 0024 01010101 1991 7 5
  17. 002 0024 01010101 1994 8 5
  18. 002 0035 01010101 1995 9 6
  19. 002 0035 02000000 1993 10 7
  20. 002 0035 02000000 1994 10 7
  21. 002 0035 02000000 1998 11 7
  22. 002 0038 02020220 1993 12 8
  23. 002 0038 02020220 1994 12 8
  24. 002 0038 02020220 1995 12 9
  25. 003 0024 01010101 1996 13 10
  26. 003 0036 02020220 1993 14 11
  27. 003 0036 02020220 1994 14 11
  28. 003 0038 02020220 1995 15 12
  29. ;
  30. data test2;
  31. input out $ time;
  32. cards;
  33. 0024 1994
  34. 0024 1996
  35. 0035 1996
  36. 0035 1998
  37. 0036 1991
  38. 0036 1993
  39. 0036 1998
  40. 0038 1995
  41. ;

  42. data _null_;
  43.         set test2 nobs=m;
  44.         id=_n_;
  45.         call symputx("out"||left(id),out);
  46.         call symputx("time"||left(id),time);
  47.         call symputx("n",m);
  48. run;

  49. %macro test;
  50. data test3;
  51.         %do i=1 %to &n.;
  52.                 sum&i.=0;
  53.     %end;
  54.         do until(last.fenduan);
  55.                 set test1;
  56.                 by fenduan;
  57.                         %do i=1 %to &n.;
  58.                 if out=&&out&i. then do;
  59.                                         if year=&&time&i. then x&i.=1;/*判断每一个年份是否与银行发生危机的年份相同*/
  60.                                else x&i.=0;
  61.                     sum&i.+x&i.;/*求出每一分段数据里面是否有与银行发生危机的年份相同,若没有则sum=0,若有则sum^=0*/
  62.                             end;
  63.             %end;
  64.                             sum=sum(of sum1-sum&n.);
  65.                             x=sum(of x1-x&n.);
  66.                         %do j=1 %to &n.;
  67.                 if last.fenduan then do;
  68.                         if sum^=0 then do; /*如果有与银行发生危机的年份相同*/
  69.                                 if x=1 then do;        /*如果是最后一年与银行发生危机的年份相同*/
  70.                                         STATUS=1;TREAT=1;
  71.                                 end;
  72.                                 else do; /*如果不是最后一年与银行发生危机的年份相同*/
  73.                                         STATUS=0;TREAT=1;
  74.                                 end;
  75.                         end;
  76.                         else do; /*如果没有与银行发生危机的年份相同*/
  77.                                 STATUS=0;TREAT=0;
  78.                         end;
  79.                 end;
  80.             %end;
  81.                 output;   /*若注释表示只输出每段最后一条记录*/
  82.                 end;
  83. run;

  84. data test;
  85.         set test3;
  86.         keep  in  out  size  year fenduan group STATUS TREAT;
  87. run;
  88. %mend;
  89. %test;
复制代码

藤椅
yayacuiliu 发表于 2011-12-17 20:00:40
自己顶一下!等待高手!

板凳
beyondcj 发表于 2011-12-18 03:56:02
kankan

报纸
可~乐 发表于 2011-12-18 13:20:10
LZ不知道是不是可以这样理解比较简单点
若出口方每段贸易数据年份区间包括银行危机年份的,则TREAT=1;否则TREAT=0;
若出口方每段贸易数据的最后年份等于银行危机年份的,则STATUS=1;否则STATUS=0;
嗯,还有就是银行危机数据,一个出口方是否有多个年份发生危机(如0024 1994,0024 1995……)
下面这个程序时针对一个出口方只有一个年份发生危机的
  1. data test1;
  2. input in $ out $ size $ year fenduan group;
  3. cards;
  4. 001 0024 01010101 1990 1 1
  5. 001 0024 01010101 1991 1 1
  6. 001 0024 01010101 1994 2 1
  7. 001 0024 01010101 1995 2 1
  8. 001 0024 01010101 1996 2 1
  9. 001 0024 02020220 1993 3 2
  10. 001 0024 02020220 1994 3 2
  11. 001 0024 02020220 1995 3 2
  12. 001 0036 01010101 1996 4 3
  13. 001 0036 01010101 1997 4 3
  14. 001 0036 02020220 1998 5 4
  15. 001 0036 02020220 2001 6 4
  16. 002 0024 01010101 1991 7 5
  17. 002 0024 01010101 1994 8 5
  18. 002 0035 01010101 1995 9 6
  19. 002 0035 02000000 1993 10 7
  20. 002 0035 02000000 1994 10 7
  21. 002 0035 02000000 1998 11 7
  22. 002 0038 02020220 1993 12 8
  23. 002 0038 02020220 1994 12 8
  24. 002 0038 02020220 1995 12 9
  25. 003 0024 01010101 1996 13 10
  26. 003 0036 02020220 1993 14 11
  27. 003 0036 02020220 1994 14 11
  28. 003 0038 02020220 1995 15 12
  29. ;
  30. data test2;
  31. input out $ time;
  32. cards;
  33. 0024 1994
  34. 0035 1996
  35. 0036 1998
  36. 0038 1995
  37. ;

  38. proc sort data=test1;
  39.         by out;
  40. run;

  41. data test;
  42.         merge test1 test2;
  43.         by out;
  44. run;

  45. proc sort data=test;
  46.         by in ;
  47. run;

  48. data test;
  49.         sum=0;
  50.         do until(last.fenduan);
  51.                 set test;
  52.                 by fenduan;
  53.                 if year=time then x=1;/*判断每一个年份是否与银行发生危机的年份相同*/
  54.                 else x=0;
  55.                 sum+x;/*求出每一分段数据里面是否有与银行发生危机的年份相同,若没有则sum=0,若有则sum^=0*/
  56.                 if last.fenduan then do;
  57.                         if sum^=0 then do; /*如果有与银行发生危机的年份相同*/
  58.                                 if x=1 then do;        /*如果是最后一年与银行发生危机的年份相同*/
  59.                                         STATUS=1;TREAT=1;
  60.                                 end;
  61.                                 else do; /*如果不是最后一年与银行发生危机的年份相同*/
  62.                                         STATUS=0;TREAT=1;
  63.                                 end;
  64.                         end;
  65.                         else do; /*如果没有与银行发生危机的年份相同*/
  66.                                 STATUS=0;TREAT=0;
  67.                         end;
  68.                         end;
  69. /*                output;*/   /*若注释表示只输出每段最后一条记录*/
  70.                 end;
  71. run;
复制代码

地板
yayacuiliu 发表于 2011-12-18 16:29:59
可~乐 发表于 2011-12-18 13:20
LZ不知道是不是可以这样理解比较简单点
若出口方每段贸易数据年份区间包括银行危机年份的,则TREAT=1;否则 ...
多谢回复!是我发的时候忽略了。银行危机的数据的确是有出口方包含多个危机年份的。如果有包含多个危机年份的,如何修改该程序呢?麻烦了。

7
yayacuiliu 发表于 2011-12-19 19:19:29
可~乐 发表于 2011-12-18 20:59
额,我试着编了一下,可能我把它改得比较复杂了,代码比较长一点,你试试看
多谢你了!

8
可~乐 发表于 2011-12-19 22:49:58
yayacuiliu 发表于 2011-12-19 19:19
多谢你了!
,能帮你解决就好..

9
beyondcj 发表于 2011-12-21 08:44:35
同样学学

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 08:34