请选择 进入手机版 | 继续访问电脑版
楼主: 小鳄鱼a
1291 8

补齐前后观测 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

小鳄鱼a 发表于 2015-5-31 09:04:13 |显示全部楼层 |坛友微信交流群
50论坛币


就是把每个code ,每个id 所对应的前后一个观测补齐

codeidyearqtrvar

1

1

2001

1

1

1

1

2001

4

2

1

2

2002

3

3

1

2

2005

2

4

5

1

2007

1

19

5

1

2007

3

20

5

1

2008

1

21



code1补齐之后 ,  是这个样子的


codeidyearqtrvar

1

1

2000

4

0

1

1

2001

1

1

1

1

2001

2

0

1

1

2001

3

0

1

1

2001

4

2

1

1

2002

1

0

1

2

2002

2

0

1

2

2002

3

3

1

2

2002

4

0

1

2

2005

1

0

1

2

2005

2

4

1

2

2005

3

0






关键词:code year ODE COD dei
yongyitian 发表于 2015-5-31 09:04:14 |显示全部楼层 |坛友微信交流群
  1. data have;
  2. input code id year qtr var;
  3. datalines;
  4. 1 1 2001 1 1
  5. 1 1 2001 4 2
  6. 1 2 2002 3 3
  7. 1 2 2005 2 4
  8. 5 1 2007 1 19
  9. 5 1 2007 3 20
  10. 5 1 2008 1 21
  11. ; run;

  12. data want;
  13.     set have (rename=(var=var_ qtr=qtr_));
  14.       if qtr_ = 1 then do;
  15.         year = year - 1;  qtr = 4;  var = 0;     output;
  16.         year = year + 1;  qtr = 1;  var = var_;  output;
  17.                           qtr = 2;  var = 0;     output;
  18.       end;
  19.     if qtr_ = 4 then do;
  20.         qtr = 3;   var = 0;     output;
  21.         qtr = 4;   var = var_;  output;
  22.         qtr = 1;   VAR = 0;     year = year+1; output;
  23.     end;
  24.     else if qtr_ = 2 or qtr_ = 3 then do;
  25.         qtr = qtr_ - 1 ; var = 0;    output;
  26.         qtr = qtr_;      var = var_; output;
  27.         qtr = qtr_ + 1;  var = 0;    output;
  28.     end;
  29.     drop var_ qtr_;
  30. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

小鳄鱼a 发表于 2015-5-31 22:23:38 |显示全部楼层 |坛友微信交流群
yongyitian 发表于 2015-5-31 21:24
非常感谢   不过不好意思   可能举得那个例子不够明显   

请再看一个   原数据

code        id        year        qtr        var
1        1        2001        1        1
1        1        2001        2        2
1        1        2001        4        3
1        2        2005        2        4
5        1        2005        1        19
5        1        2005        2        20
5        1        2005        3        21


想的到的数据



code        id        year        qtr        var
1        1        2000        4        0
1        1        2001        1        1
1        1        2001        2        2
1        1        2001        3        0
1        1        2001        4        3
1        1        2002        1        0
1        2        2005        1        0
1        2        2005        2        4
1        2        2005        3        0
5        1        2004        4        0
5        1        2005        1        19
5        1        2005        2        20
5        1        2005        3        21
5        1        2005        4        0

使用道具

小鳄鱼a 发表于 2015-5-31 22:58:03 |显示全部楼层 |坛友微信交流群
yongyitian 发表于 2015-5-31 21:24
把每个code中id前后观测补齐,但是如果该观测前一期有观测,那么就把在前一期的观测补上

使用道具

yongyitian 发表于 2015-6-1 00:16:11 |显示全部楼层 |坛友微信交流群
小鳄鱼a 发表于 2015-5-31 22:23
非常感谢   不过不好意思   可能举得那个例子不够明显   

请再看一个   原数据
这是两个完全不同的数据和结果。

在每一观测前面和后面各加一相邻的观测。 那么原数据中每两条观测之间最少要间

隔两个时间单位(time unit)。 否则用二楼的code做出的结果中会有重复的观测。

试试去掉这重复的观测。 如果还不是想要的结果,应考虑对问题作重新定义

使用道具

Imasasor 发表于 2015-6-1 16:35:46 |显示全部楼层 |坛友微信交流群
  1. data b;
  2. set a;
  3. if first.id then do;
  4. if qtr=1 then do;
  5. qtr=4; year=year-1;
  6. output;
  7. qtr=1;year=year+1;
  8. output;
  9. end;
  10. else if qtr in (2,3,4) then do;
  11. qtr=qtr-1;
  12. output;
  13. qtr=qtr+1;
  14. output;
  15. end;
  16. end;


  17. else if last.id then do;
  18. output;
  19. if qtr=4 then do;
  20. qtr=1; year=year+1;
  21. output;
  22. end;

  23. else if qtr in (1,2,3) then do;
  24. qtr=qtr+1;
  25. output;
  26. end;

  27. end;

  28. else output;

  29. by id notsorted;

  30. run;





  31. data b1;
  32. set b;
  33. year2=lag(year);
  34. if first.id then do;
  35. year1=year;
  36. do qtr1=qtr to 4;
  37. output;
  38. end;
  39. end;

  40. else if not last.id then do;

  41. if year-year2=1 then do;
  42. year1=year;
  43. do qtr1=1 to 4;
  44. output;
  45. end;
  46. end;

  47. else if year-year2>1 then do;
  48. do year1=(year2+1) to year;
  49. do qtr1=1 to 4;
  50. output;
  51. end;
  52. end;
  53. end;

  54. end;


  55. else if last.id then do;
  56. if year-year2=1 then do;
  57. year1=year;
  58. do qtr1=1 to qtr;
  59. output;
  60. end;
  61. end;

  62. else if year-year2>1 then do;
  63. do year1=(year2+1) to year;
  64. do qtr1=1 to qtr;
  65. output;
  66. end;
  67. end;
  68. end;

  69. end;



  70. by id notsorted;

  71. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

小鳄鱼a 发表于 2015-6-1 17:03:48 |显示全部楼层 |坛友微信交流群
Imasasor 发表于 2015-6-1 16:35
非常感谢,但是var在某个时期的值相同的,我想的是如果该时期有数值,就保留原值,该观测前后如果没有观测,那么按照时间前后补上之后,补上的着一些var取值是0,而不是与该时期的一样。具体可以看看我后来的回复   。

使用道具

Imasasor 发表于 2015-6-1 22:59:16 |显示全部楼层 |坛友微信交流群
小鳄鱼a 发表于 2015-6-1 17:03
非常感谢,但是var在某个时期的值相同的,我想的是如果该时期有数值,就保留原值,该观测前后如果没有观测 ...
最后数据集与中间数据集merge一下就行了
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

小鳄鱼a 发表于 2015-6-2 10:07:48 |显示全部楼层 |坛友微信交流群
Imasasor 发表于 2015-6-1 22:59
最后数据集与中间数据集merge一下就行了
能否给改一下,对这个不大熟悉,谢谢

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-17 02:27