[R] simple loop problemo (Geo brownian motion)
Duncan Murdoch
murdoch.duncan at gmail.com
Fri Nov 19 20:55:44 CET 2010
On 19/11/2010 1:09 PM, newbster wrote:
> I would like to plot multiple random walks onto the same graph. My p
> variable dictates how may random walks there will be.
>
>
> par(mfrow=c(1,1))
> p<- 100
> N<- 1000
> S0<- 10
> mu<- 0.03
> sigma<- 0.2
> nu<- mu-sigma^2/2
> x<- matrix(rep(0,(N+1)*p),nrow=(N+1))
> y<- matrix(rep(0,(N+1)*p),nrow=(N+1))
> t<- (c(0:N))/N
> for (j in 1:p)
> {
> z<- rnorm(N,0,1)
> x[1,j]<- 0
> y[1,j]<- S0
> for (i in 1:N)
> {
> x[i+1,j]<- (1/sqrt(N))*sum(z[1:i])
> y[i+1,j]<- y[1,j]*exp(nu*t[i+1]+sigma*x[i+1,j])
> }
>
> plot(t,y,type="l",xlab="time", ylab="Geometric Brownian motion")
>
> }
>
>
> Any help would be appreciated, thanks.
>
You can use the matplot function to plot multiple columns of a matrix at
once. So with your code as above, leave out the call to plot(), then
matplot(t, y) would give you approximately what you're looking for
(though the colour and symbol choices need some work).
You can get rid of the inner loop by using cumsum() and vectorized
calculations; then it will be reasonably fast.
Another way to do this is to create the plot before the loop, then use
lines() to add lines to it within the loop. Then you need to guess the
scale ahead of time, or do a little experimentation.
Duncan Murdoch
More information about the R-help
mailing list