[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