Skip to content

disaggregate from monthly to daily time series

7 messages · Brian G. Peterson, Hodgess, Erin, John P. Burkett +1 more

#
I would like to disaggregate a monthly average (Consumer Price Index) to 
create a daily time series.  The new daily series should be smooth 
(i.e.--exhibit no unusual jump from the last day of a month to the first 
day of the next month) and be consistent with the original monthly data 
(i.e.--the average value of the new series for the days of a month 
should equal the given value for that month).

If all months had 30 days and I were using S+Finmetrics, I would try to 
create the daily series with a command such as
disaggregate(CPI, 30, method="spline", how="mean")
where CPI is the monthly data on the Consumer Price Index.
The fact that months are of different lengths complicates matters.

Suggestions for how to accomplish the disaggregation in R would be 
greatly appreciated.

-John
#
Well, leaving aside the fact that this seems like a pretty low-utility 
idea (ymmv), na.approx or na.spline will do this if you cbind a monthly 
series to a daily series, and then apply na.approx to the NA's in the 
(formerly) monthly data.

   - Brian
John P. Burkett wrote:

  
    
#
John,

Here's some code that follows Brian's suggestion.

library(xts)
x <- xts(cumprod(1+rnorm(999)/100),Sys.Date()-999:1)
m <- timeBasedSeq('2006-11/2009-07', 'Date')
mx <- x[m]
M <- merge(mx,x)

mtod.spline <- xts(spline(1:NROW(M),M[,1],n=NROW(M))$y,index(x))
mtod.linear <- xts(approx(1:NROW(M),M[,1],n=NROW(M))$y,index(x))
mtod <- merge(x,mtod.spline,mtod.linear)
plot.zoo(mtod)

HTH,
Josh
--
http://www.fosstrading.com
On Mon, Jul 27, 2009 at 1:22 PM, Brian G. Peterson<brian at braverock.com> wrote:
#
Hodgess, Erin wrote:
Some people involved with rolling portfolio management and risk 
supervision like to work with daily data on asset prices (Gourieroux and 
Monfort, "The Econometrics of Efficient Portfolios," Journal of 
Empirical Finance, v. 12 (2005) pp. 22-23).  However, to adjust these 
prices for inflation, one should divide them by a general price index 
such as the CPI.  That's the motivation for trying to disaggregate the 
monthly CPI data to daily frequency.

-John

  
    
#
Joshua Ulrich wrote:

            
Thank you, Brian and Joshua, for your suggestions. Having tried the code 
on a Ubuntu box running R 2.8.1, I'm inserting my comments below the 
relevant lines.
This line elicits the message "Error in strftime(x) : wrong class"
However the line seems to work o.k. if shortened to
m <- timeBasedSeq('2006-11/2009-07')
This line generates 50 or more warnings of the form
"In timeBasedSeq(x, NULL) : NAs introduced by coercion"
Are those the NAs Brian mentioned?
dim(mx) is 0, 1.  Doing "mx" gets the following response:
   Data:
   numeric(0)
   Index:
   integer(0)
Is that what was intended?
The end result on my box is three seemingly identical series: x, 
mtod.spline, mtod.linear. I'm still thinking about how they relate the 
problem of disaggregating a monthly series into smooth daily series with 
the original mean.

  
    
#
On Mon, Jul 27, 2009 at 5:10 PM, John P. Burkett<burkett at uri.edu> wrote:
I would suggest you upgrade to R-2.9.1 and the latest version of xts.
This won't work because timeBasedSeq will return zoo's "yearmon" class
by default in this case, and you can't subset an xts object via "mmm
yyyy" style strings.  The original code returned a Date class object,
which you can then use to extract the first values of the month from
the xts object "x".
They are not.  This line throws an error on R-2.9.1 with the latest xts.
Error in `[.xts`(x, m) : subscript out of bounds
No, it's an empty xts object - the result of the warnings above.
The "mx" object is empty, so "M" and "x" _are_ identical.  I'm not
familiar with S+Finmetrics and I wasn't aware that's what
disaggregate(..., how="mean") implied.  If my example retains the mean
of the original series, it would be completely unintentional.

Best,
Josh
--
http://www.fosstrading.com