Эффективное моделирование броуновского движения в R

#r

#r

Вопрос:

 data=data.frame(matrix(rnorm(1000*300,0,1),1000,300))
weiner.matrix=data.frame(cumsum(data))

mu=0
sigma=.15
dt=1/1000


 bmot=data.frame(matrix(NA,1000,300)
    bmot[1,]=100
    for (j in 1:ncol(data)){
    for (i in 2:nrow(data)){

      bmot[i,j]=bmot[i-1,j]*(1 mu*dt sigma*sqrt(dt)*(weiner.matrix[i,j]-weiner.matrix[i-1,j]))

    }
    }
  

Я пытаюсь смоделировать матрицу из 1000 строк и 300 столбцов, так что 300 переменных действительно геометрического броуновского движения. Начальное значение начинается со 100, а затем случайность начинается с периодов после t = 1 / row = 1.

Есть ли способ запустить это моделирование броуновского движения 300, не переходя по ячейкам, как у меня в цикле??

Комментарии:

1. Что такое weiner.matrix , mu , dt , sigma …? Пожалуйста, предоставьте воспроизводимый пример.

Ответ №1:

Вы можете использовать cumsum набор нормальных переменных для создания одной переменной броуновского движения.

 random <- rnorm(1000, 0, sqrt(0.15))
x <- 100   cumsum(random)
nsim <- 300
  

Вы можете использовать apply, но for цикл выполняется так же быстро:

 X <- matrix(rnorm(n = nsim * 1000, sd = sqrt(0.15)), nrow = 1000, ncol = 300)
for (i in 1:nsim) X[,i] <- cumsum(X[,i])