I have managed to reduce it to two statements using the trick that the elements of x-x are NA or 0 according to whether the corresponding element of x is NA or not. You could probably extend this to your situation too.
> library(zoo) > m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, NA), seq(7)^2), as.Date(1:7)) > > r <- replace(m[,1], TRUE, + na.locf(m[,1]) * m[,2] / na.locf(m[,2] + (m[,1]-m[,1]))) > cbind(V1 = r, V2 = m[,2]) V1 V2 1970-01-02 1.0 1 1970-01-03 2.0 4 1970-01-04 4.5 9 1970-01-05 8.0 16 1970-01-06 5.0 25 1970-01-07 7.2 36 1970-01-08 9.8 49 On Wed, May 12, 2010 at 4:58 PM, Abiel X Reinhart <abiel.x.reinh...@jpmchase.com> wrote: > Thanks Gabor, this looks like it serves my needs. I've extended the code to > work with an example where we have two multicolumn zoo objects, one with the > original data and another that has the growth rates. > > # mat1 = zoo object to extend > # mat2 = zoo object whose growth rate is used to extend mat1 > mergeGrowth <- function(mat1, mat2) > { > ix <- is.na(mat1) > mat1.locf <- na.locf(mat1, na.rm=F) > mat2.locf <- mat2 > mat2.locf[ix] <- NA > mat2.locf <- na.locf(mat2.locf, na.rm=F) > coredata(mat1)[ix] <- coredata(mat1.locf * mat2 / mat2.locf)[ix] > mat1 > } > > > Abiel Reinhart > > -----Original Message----- > From: Gabor Grothendieck [mailto:ggrothendi...@gmail.com] > Sent: Wednesday, May 12, 2010 12:00 PM > To: Abiel X Reinhart > Cc: r-help@r-project.org > Subject: Re: [R] Vectorized expression to extrapolate matrix columns with > columns of another matrix > > Yes, that is what it does. Note that na.approx interpolates and does > not work precisely as you discussed but its easy, does use m[,2] and > may be good enough. If you really do want something precisely as you > discussed try this. It NAs out the rows of m for which column 1 is NA > and then uses na.locf to move the prior non-NA into it. Then we apply > the formula: > >> library(zoo) >> m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, NA), seq(7)^2), as.Date(1:7)) >> >> # mm will hold result; m.locf >> m.locf <- mm <- m >> ix <- is.na(mm[,1]) >> m.locf[ix,] <- NA >> m.locf <- na.locf(m.locf) >> mm[ix, 1] <- m.locf[ix, 1] * mm[ix,2] / m.locf[ix,2] >> mm > > 1970-01-02 1.0 1 > 1970-01-03 2.0 4 > 1970-01-04 4.5 9 > 1970-01-05 8.0 16 > 1970-01-06 5.0 25 > 1970-01-07 7.2 36 > 1970-01-08 9.8 49 > > 1970-01-02 1.0 1 > 1970-01-03 2.0 4 > 1970-01-04 4.5 9 > 1970-01-05 8.0 16 > 1970-01-06 5.0 25 > 1970-01-07 7.2 36 > 1970-01-08 9.8 49 > > > > > > Yes, that is what it does. Please read the help file for na.approx and > approx. If you want something different you will have to special case > the end values. > > On Wed, May 12, 2010 at 11:11 AM, Abiel X Reinhart > <abiel.x.reinh...@jpmchase.com> wrote: >> Gabor, >> >> Maybe I am doing this wrong, but rule=2 does not look like it is growing the >> series out, but rather just carrying the last value forward. It looks like >> na.approx() followed by na.locf(). For instance: >> >> m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, NA), seq(7)^2), as.Date(1:7)) >> na.approx(m[, 1], x = m[, 2], rule=2) >> >> 1970-01-02 1970-01-03 1970-01-04 1970-01-05 1970-01-06 1970-01-07 1970-01-08 >> 1.0 2.0 2.7 3.7 5.0 5.0 5.0 >> >> Abiel Reinhart >> >> -----Original Message----- >> From: Gabor Grothendieck [mailto:ggrothendi...@gmail.com] >> Sent: Wednesday, May 12, 2010 10:40 AM >> To: Abiel X Reinhart >> Cc: r-help@r-project.org >> Subject: Re: [R] Vectorized expression to extrapolate matrix columns with >> columns of another matrix >> >> Use rule = 2 as in the extrapolation examples in the na.approx help file. >> >> On Wed, May 12, 2010 at 10:10 AM, Abiel X Reinhart >> <abiel.x.reinh...@jpmchase.com> wrote: >>> Gabor, >>> >>> This comes close to solving my problem, but I am still left with the >>> problem of how I can extrapolate, not just interpolate. In our example, if >>> I define m as, >>> >>> m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, NA), seq(7)^2), as.Date(1:7)) >>> >>> instead of >>> >>> m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, 7), seq(7)^2), as.Date(1:7)) >>> >>> then I will only get five values back, when I really want m[,1] to be fully >>> extrapolated so that there are seven values. Is there a workaround? >>> >>> Abiel Reinhart >>> >>> -----Original Message----- >>> From: Gabor Grothendieck [mailto:ggrothendi...@gmail.com] >>> Sent: Wednesday, May 12, 2010 8:37 AM >>> To: Abiel X Reinhart >>> Cc: r-help@r-project.org >>> Subject: Re: [R] Vectorized expression to extrapolate matrix columns with >>> columns of another matrix >>> >>> Try this using the zoo package. See ?na.approx for more and note that >>> this functionality requires zoo 1.6-3 or later. >>> >>> .> m <- zoo(cbind(c(1, 2, NA, NA, 5, NA, 7), seq(7)^2), as.Date(1:7)) >>>> na.approx(m[, 1], x = m[, 2]) >>> 1970-01-02 1970-01-03 1970-01-04 1970-01-05 1970-01-06 1970-01-07 1970-01-08 >>> 1.000000 2.000000 2.714286 3.714286 5.000000 5.916667 7.000000 >>>> na.approx(m[, 1]) >>> 1970-01-02 1970-01-03 1970-01-04 1970-01-05 1970-01-06 1970-01-07 1970-01-08 >>> 1 2 3 4 5 6 7 >>> >>> >>> On Tue, May 11, 2010 at 4:48 PM, Abiel X Reinhart >>> <abiel.x.reinh...@jpmchase.com> wrote: >>>> I have two identically sized matrices of data that represent time series >>>> (I am storing the data in zoo objects, but the idea should apply to any >>>> matrix of data). The time series in the second matrix extend further than >>>> in the first matrix, and I would like to use the data in matrix 2 to >>>> extrapolate the data in matrix 1. In other words, if mat1[i,j] == NA, then >>>> mat1[i,j] <- mat1[i-1, j]*mat2[i,j]/mat2[i-1,j]. Of course, before we can >>>> calculate mat1[i,j] we may need to calculate mat1[i-1,j], and that in turn >>>> may require the computation of mat1[i-2,j], etc. This could all clearly be >>>> done with loops, but I am wondering if anyone can think of a vectorized >>>> expression or other efficient method that would work. >>>> >>>> Thanks very much. >>>> >>>> Abiel Reinhart >>>> This communication is for informational purposes only. It is not >>>> intended as an offer or solicitation for the purchase or sale of >>>> any financial instrument or as an official confirmation of any >>>> transaction. All market prices, data and other information are not >>>> warranted as to completeness or accuracy and are subject to change >>>> without notice. Any comments or statements made herein do not >>>> necessarily reflect those of JPMorgan Chase & Co., its subsidiaries >>>> and affiliates. >>>> >>>> This transmission may contain information that is privileged, >>>> confidential, legally privileged, and/or exempt from disclosure >>>> under applicable law. If you are not the intended recipient, you >>>> are hereby notified that any disclosure, copying, distribution, or >>>> use of the information contained herein (including any reliance >>>> thereon) is STRICTLY PROHIBITED. Although this transmission and any >>>> attachments are believed to be free of any virus or other defect >>>> that might affect any computer system into which it is received and >>>> opened, it is the responsibility of the recipient to ensure that it >>>> is virus free and no responsibility is accepted by JPMorgan Chase & >>>> Co., its subsidiaries and affiliates, as applicable, for any loss >>>> or damage arising in any way from its use. If you received this >>>> transmission in error, please immediately contact the sender and >>>> destroy the material in its entirety, whether in electronic or hard >>>> copy format. Thank you. >>>> >>>> Please refer to http://www.jpmorgan.com/pages/disclosures for >>>> disclosures relating to European legal entities. >>>> >>>> ______________________________________________ >>>> R-help@r-project.org mailing list >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide >>>> http://www.R-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>> >> > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.