Как построить случайное блуждание с неотрицательными значениями?

#r

#r

Вопрос:

Я хотел бы построить случайное блуждание с определенным количеством инноваций (например, 10000) и неотрицательными значениями.

Я пытался:

 Value <- c(100) #initial Value 
n <- 10000      #number of innovations 

for(i in 1:(n-1)){
  Value[i 1] <- Value[i]   rnorm(1)
  
  if(Value[i 1] < 0){
  repeat{
    Value[i 1] <- Value[i]   rnorm(1)
  }
  if(Value[i 1] >0){
    break
  }
  }
}
  

К сожалению, это не сработает, если значение станет отрицательным. Как я могу это исправить?

Ответ №1:

Я думаю, что есть несколько вариантов. Одним из них является замена repeat цикла на while цикл. Вот так:

 Value <- c(100) #initial Value 
n <- 10000      #number of innovations 
for(i in 1:(n-1)){
  Value[i 1] <- Value[i]   rnorm(1)
  
  while(Value[i 1] < 0){
      Value[i 1] <- Value[i]   rnorm(1)
    }
}
  

Вы можете проверить, что ни одно значение Value не является отрицательным с помощью:

 any(Value < 0)
  

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

1. Менее подробное решение не выполняет то же самое, что и исходное намерение цикла.

2. Привет @Dason, не могли бы вы расширить свой комментарий? Я проверил, и единственное отличие состоит в том, что более подробный ответ выполняется rnorm до тех пор, пока не достигнет неотрицательного значения, в то время как менее подробное преобразование в положительное любой результат rnorm обоих приводит к случайной серии неотрицательных чисел.

3. Оригинал может увеличиваться, а затем уменьшаться. Менее подробная версия всегда будет увеличиваться, и ее невозможно будет уменьшить.

4. Спасибо @Dason за исправление. Я удалил менее подробное решение!

Ответ №2:

Вы можете либо попробовать это

 for(i in 1:(n-1)){
    Value[i 1] <- Value[i]   abs(rnorm(1))}
  

Или

 for(i in 1:(n-1)){
  a = rnorm(1)
  while(a<0){a = rnorm(1)}
  Value[i 1] <- Value[i]   a}