【问题标题】:R: Writing a recursive function for a Random Walk (initial values)R:为随机游走(初始值)编写递归函数
【发布时间】:2016-01-17 22:57:35
【问题描述】:

我是 R 的新用户,我正在尝试创建一个模拟随机游走的函数。我的问题是试图顺利整合一些初始值。假设我有这个基本功能。

y(t) = y(t-2) + eps(t)

Epsilon(或 eps(t))将是随机因子。我想定义 y(-1)=0,并且 y(0)=0。

这是我的代码:

ran.walk=function(n){       # 'n' steps will be the input
    eps=rnorm(n)            # creates a vector taking random values from N(0,1)
    y= c(eps[1], eps[2])    # this will set up my initial vector
    for (i in 3:n){
        ytemp = y[i-2] + eps[i] ## !!! problem is here. Details below !!!
        y= c(y, ytemp)
    }
    return(y)
}

我正试图让这个开始添加 y3、y4、y5 等,但我认为这个设计存在缺陷......我不确定我是否应该只设置两条单独的线,用if 语句:测试 n 是偶数还是奇数,可能带有:

if i%%2 == 1   #using modulus

因为,

y1= eps1,
y2= eps2,
y3= y1 + eps3,
y4= y2 + eps4,
y5= y3 + eps5  and so on...

目前,我在代码中看到了错误。 我有 y1 和 y2 连接,但我认为它不知道如何合并 y[1] 我可以事先以某种方式定义 y[-1]=0, 和 y[0]=0 吗?我也试过了,但出错了。

提前感谢您的任何帮助。这是第一次尝试使用递归的 for 循环。

-N(对于任何格式问题,我很抱歉,我在解决这个问题时遇到了很多问题)

【问题讨论】:

  • 我认为y= c(err[1], eps[2]) 应该是y= c(eps[1], eps[2])
  • 抱歉,我将“error”和“epsilon”互换使用作为回归的习惯。作为旁注,我相信用 if 语句拆分 for 循环可以解决问题(也许不是最优雅的)。即: if (i%%2==1) #then 使用 eps[1] 作为初始值 else # 对于偶数,使用 eps[2] 作为初始值,向量连接起来是一样的。

标签: r for-loop recursion


【解决方案1】:

我发现你的奇数和偶数系列是相互独立的。假设是这种情况,我只是将问题分成两列并使用cumsum 来获得随机游走。最终的数据帧包括随机数和随机游走,因此您可以比较它是否正常工作。 希望对你有帮助

ran.walk=function(n) {
  eps=rnorm(ceiling(n / 2)*2)
  dim(eps) <- c(2,ceiling(n/2))
  # since each series is independent, we can tally each one in its own
  eps2 <- apply(eps, 1, cumsum)
  # and just reorganize it
  eps2 <- as.numeric(t(eps2))
  rndwlk <- data.frame(rnd=as.numeric(eps), walk=eps2)
  # remove the extra value if needed
  rndwlk <- rndwlk[1:n,]
  return(rndwlk)
}
ran.walk(13)

【讨论】:

  • 感谢您的回复,看到替代方法总是很高兴。我会将此作为最佳答案作为我的感谢(不能放弃投票,但我想阻止创建备用帐户)。
【解决方案2】:

在我的钢琴休息后,它来了。有趣的是,一旦你发现答案就会变得多么简单……几乎是微不足道的。

设置初值为向量,即:

[y(1) = y(-1) + eps(1), y(2)= y(0) + eps(2)]

一切正常。偶数和赔率之间没有相互作用仍然是事实,但没有理由指定其中任何一个。

用模数分割迭代,然后将其连接回主向量的方法也可以,但没有必要且更复杂。对于用户和计算机来说,越短越好。正如爱因斯坦所说,让它尽可能简单,但不要更简单。

【讨论】:

  • 很高兴您找到了解决方案!请记住,R 的优势在于管理向量。在小型应用程序中您不会看到任何差异,但尽可能尝试使用向量(例如使用cumsum)仍然很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2014-03-26
相关资源
最近更新 更多