[R] do.call or something instead of for

Rolf Turner rolf.turner at xtra.co.nz
Tue Jun 26 05:09:31 CEST 2012


On 26/06/12 00:39, Kathie wrote:
> Dear R users,
>
> I'd like to compute  X like below.
>
> X_{i,t} = 0.1*t + 2*X_{i,t-1} + W_{i,t}
>
> where W_{i,t}  are from Uniform(0,2) and X_{i,0} = 1+5*W_{i,0}
>
> Of course, I can do this with "for" statement, but I don't think it's good
> idea because "i" and "t" are too big.
>
> So, my question is that
>
> Is there any better idea to avoid "for" statement for this problem?
>
> Thank you in advance.

You could use "filter()", as follows:

foo <- function (n) {
     w0 <- 1+5*runif(1,0,2)
     w  <- c(w0,runif(n-1,0,2))
     y  <- filter(w,filter=2,method="recursive")
     mu <- sapply(0:(n-1),function(k){if(k==0) 
return(0);sum((1:k)*2^((k-1):0))*0.1})
     mu + y
}

(This of course just does univariate time series and ignores the 
subscript i.
To get multivariate time series, just use "foo()" to generate as many
components as you want; they are independent.)

Check:

set.seed(42)
x <- foo(10)
x
Time Series:
Start = 1
End = 10
Frequency = 1
  [1]   10.14806   22.27027   45.31282   92.58654  186.85657 375.25133
  [7]  752.57585 1506.12103 3014.35603 6031.02220

set.seed(42)
w0 <- 1+5*runif(1,0,1)
w   <- c(w0,runif(9,0,2)
0.1+2*x[1]+w[2]
[1] 22.27027                    # Bingo.
0.2+2*x[2]+w[3]
[1] 45.31282                    # Bingo.

etc.

Notice that the generated series explodes rather rapidly.

     cheers,

         Rolf Turner



More information about the R-help mailing list