如何在Stata中正确地按周折叠数据?

时间:2015-08-27 19:34:02

标签: stata

我有一个交易级别数据集,我想要折叠并计算每周平均价格。数据集可简化如下,

clear 
input str9 date quantity price id
"01jan2010" 50 70 1
"02jan2010" 60 80 2
"02jan2010" 70 90 3
"04jan2010" 70 95 4
"08jan2010" 60 81 5
"09jan2010" 70 88 6
"12jan2010" 55 87 7
"13jan2010" 52 88 8
end
gen date2=date(date,"DMY")
format date2 %td
drop date

我想创建一个变量date3。对于一周内发生的每笔交易,date3是该周的周一。

这是我的代码:

sort date2
gen date3=date2 if dow(date2)==1
replace date3=date3[_n-1] if missing(date3)
format date3 %td

但是,周一没有交易,但本周其余时间都有交易。在这些情况下,date3不是该周的星期一日期,而是前几周的星期一日期。

使用上面的代码我的数据如下:

quantity    price   id  date2       date3
50          70  1   01jan2010   
60          80  2   02jan2010   
70          90  3   02jan2010   
70          95  4   04jan2010   04jan2010
60          81  5   08jan2010   04jan2010
70          88  6   09jan2010   04jan2010
55          87  7   12jan2010   04jan2010
52          88  8   13jan2010   04jan2010

对我而言,id = 1,2,3没有date3并不重要。我担心的是id = 7而id = 8应该有date3的11jan2010。但由于当天没有交易,日期变为04jan2010。有办法解决这个问题吗?

(我正在考虑构建一个新的数据集,其中包含自01jan2010以来的连续日期,然后是merge以及上面的那个,然后drop如果缺少价格数量。但我想知道是否还有更多有效的方式)。

此外,我有一个每周索引数据,自2010年10月1日起每周五报告。如果我使用wofd命令,Stata将在2010年产生53周。(或者更确切地说,两个2010w52。)我怎样才能在Stata中获得52周的时间?

(我发现了http://www.stata.com/statalist/archive/2012-02/msg01030.html,但我仍然无法弄清楚这有助于解决我的问题。)

1 个答案:

答案 0 :(得分:2)

你的周从星期一开始。你需要的一切都来自于使用dow()来利用这样一个事实,即在你的每个星期中,星期几函数dow()产生1,2,3,4,5,6,0的日子从周一到周日。

每日日期daily的当前或上周一仅为

 gen Monday = cond(dow(daily) == 0, daily - 6, daily - dow(daily) + 1) 

分支是这样的。如果是星期天,则前一个星期一是6天前。否则,本周开始的星期一是今天,如果它是星期一,dow()收益率为1,昨天是星期二和2,等等。这里变量Monday只是定义周数的星期一的日期。

重要细节:此处没有关于数据中的完成日期甚至是顺序的假设。

小注:date2date3之类的任意名称并不重要。在您的问题(和您的实践)中使用令人回味的名字。

Robert Ferrer提到的文章有续集。在Stata search week, sj获取参考资料。

使用Stata的周,特别是使用wofd()函数(不是命令),因为它们无法帮助您。 Stata的周数不会映射到您的周。罗伯特费雷尔提到的文章真的值得阅读以理解这一点(即使我写了它)。

(这是在您链接到的Statalist主题中解释的。)