如何让SAS填写缺失的记录,其中包含股票发行04W交易的最新信息?

时间:2016-02-16 23:47:20

标签: sas

company issue   datadate    shares  price   mv_issue mv_day
4439    04W 19921006    1100    120 132000   454800
4439    05W 19921006    1400    115 161000   454800
4439    06W 19921006    800 101 80800    454800
4439    07W 19921006    900 90  81000    454800
**4439  04W 19921006    1100    120 132000   455500**missing
4439    05W 19921007    1400    116 162400   455500
4439    06W 19921007    800 99  79200    455500
4439    07W 19921007    900 91  81900    455500
5510    02W 19940126    50  5   250  1090
5510    03W 19940126    120 7   840  1090
5510    02W 19940127    50  5   250  1210
5510    03W 19940127    120 8   960  1210

**记录实际上已丢失。如何让SAS填写缺失的记录,其中包含股票发行04W交易的最新信息?

我正在尝试计算市场价值,因为每个独特问题的股票乘以价格。然后我想在那天的所有问题上总结mv_issue。我这样做是为了表明在19921006天,总市值应该是454800.但是在1992/10/07的日子里,04W的记录不存在,因为这个问题当天没有交易。如果我将之前的交易活动替换为04W,就像我在此数据集中所做的那样,mv_day将是455500.如何创建此缺失记录,以便当天的总数将包括该公司的所有可能的股票发行(04W)使用前一天的信息,05W,06W和07W)? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

老问题我偶然发现了,但是如果有人看到这个问题,我想我会回答proc扩展的替代方案。

如果所需的操作足够简单,我可以尽可能地使用数据步骤。最后的观察结果(LOCF)在我看来很简单。如果您不想要,您不需要将日期列更新为真正的SAS日期格式,尽管我个人推荐它。只需要任何排序索引。给定数据集RAW,如下所示:

     DATEC      |    DATEN   | VAL
01JAN2016T12:30   1767270600    1
01JAN2016T14:00   1767276000    2
01JAN2016T19:00   1767294000    5
02JAN2016T08:00   1767340800    3
06JAN2016T12:00   1767700800    .
21JAN2016T21:00   1769029200    8
03FEB2016T09:00   1770109200   10
13FEB2016T12:00   1770984000    6
21FEB2016T09:30   1771666200    .
15MAR2016T12:00   1773662400    .
20MAR2016T12:00   1774094400    5

这是我编写的快速代码来处理这个问题。

proc sort data=RAW; by daten; run;

data LOCF;
  retain LOCF;
  set RAW;
  if val ne . then LOCF=val;
  if val=. then val=LOCF;
  drop LOCF;
run;

结果数据集LOCF如下所示:

     DATEC      |    DATEN   | VAL
01JAN2016T12:30   1767270600    1
01JAN2016T14:00   1767276000    2
01JAN2016T19:00   1767294000    5
02JAN2016T08:00   1767340800    3
06JAN2016T12:00   1767700800    3**
21JAN2016T21:00   1769029200    8
03FEB2016T09:00   1770109200   10
13FEB2016T12:00   1770984000    6
21FEB2016T09:30   1771666200    6**
15MAR2016T12:00   1773662400    6**
20MAR2016T12:00   1774094400    5

**This value was carried forward.

公司的第一条记录是否有可能缺失值?我猜不是,但如果是这样(并且可能只是为了安全起来),请考虑这一点,以便之前公司的数据不会被推进:

data LOCF;
  retain LOCF;
  set RAW;
  by company daten;
  if val ne . then LOCF=val;
  if ^first.company & val=. then val=LOCF;
  drop LOCF;
run;