【问题标题】:recursively using the output as an input for a function递归地使用输出作为函数的输入
【发布时间】:2011-12-12 00:40:09
【问题描述】:

编辑:这是一个不断重新平衡的投资组合问题。

有谁知道递归调用要用什么函数?

让 s= 库存;

让 c= 现金;

设 X_0= 初始财富;

let r = 是一个随机向量,看起来像 (1,-0.5,-0.5,1,-.5,1,1,1-0.5,...) #得到 1 或 0.5 的概率各为 50% .

X_0 = s+c

X_1 = 1/2*x_0*(1+r) + 1/2*x_0

X_2 = 1/2*x_1*(1+r) + 1/2*x_1 #在这个等式中x_0改为x_1,仅此而已

X_3 = 1/2*x_2*(1+r) + 1/2*x_2
…… 以此类推,

R 中是否有一个函数将上一步的输入作为这一步的输入?

打电话?应用?记起?我想不通!

提前致谢!

【问题讨论】:

  • 你确定你要的是递归吗?这看起来更像是一个 AR 过程。
  • 我不确定我是否有正确的术语,也许它被称为 AR?我一直认为这个术语是为时间序列保留的。

标签: r


【解决方案1】:

它是为高阶函数Reduce 量身定做的工作。这是代码

calc_wealth <- function(x, r){
  return(0.5*x*(1 + r) + 0.5*x)
}

x0 <- 10 
set.seed(1234) 
r  <- sample(c(-0.5, 1), size = 5, replace = TRUE, prob = c(0.5, 0.5))

wealth <- Reduce('calc_wealth', r, init = x0, accumulate = TRUE)

> r
[1]  1.0 -0.5 -0.5 -0.5 -0.5
> wealth
[1] 10.000000 15.000000 11.250000  8.437500  6.328125  4.746094

这是从帮助文件中提取的Reduce 的相应文档。

Reduce(f, x, init, right = FALSE, accumulate = FALSE)

Reduce 使用二元函数依次组合 一个给定的向量和一个可能给定的初始值。如果给出了 init, 减少逻辑将其添加到开头(从左到右进行时) 或 x 的结尾,分别。如果这个可能增广的向量 v 有 n > 1 个元素,Reduce 依次将 f 应用于 v 的元素 分别是从左到右或从右到左。即,左减少 计算 l_1 = f(v_1, v_2), l_2 = f(l_1, v_3) 等,并返回 l_{n-1} = f(l_{n-2}, v_n),

【讨论】:

  • 嘿,谢谢,Ramnath,这是一个非常简洁的功能。简短的代码,但似乎有很多东西(参数和算法)。仍在尝试咀嚼它。再次感谢。
  • 高阶函数有点难以理解,但为抽象概念提供了不可思议的力量。 github 现在似乎已经关闭,但 @hadley 有一个关于如何使用高阶函数的令人难以置信的 wiki 页面。将在github 重新启用后发布链接。
  • @Ramnath -- github 现已上线,链接为:github.com/hadley/devtools/wiki/First-class-functions。感谢您指出这一点。
  • 太好了,谢谢,我一直在使用他的 ggplot2() 包。是的,如果它被发布,请告诉我,我实际上不记得遇到过它。
  • @JoshO'Brien,谢谢,这会非常方便,肯定会收藏到我的书签中。 :)
【解决方案2】:

[编辑:] OP 澄清 r 会更改每个循环,他们希望避免使用 for 循环。

在这种情况下,您可以尝试以下方法:

# generate vector of .5s and 1s with 50% probability of each.
# length N.
rs <- ifelse(runif(N)<.5,.5,1) 
x0 <- ... # set x0
x  <- x0
# loop over rs, evaluation a new x each time. Note the '<<-'
vapply( rs, function(r) x <<- 1/2*x*(1+r)+1/2*x, -1 )
x # contains final value after N iterations.

记住vapply 需要第三个参数来给出函数的返回类型,这比sapply 等加快了一点速度(做?vapply)。

&lt;&lt;-的含义是在全局环境中修改x,而不是在vapply的函数范围内。

适用于在其他范围内搞乱的常见警告(即,请注意不要在某些您无意修改的环境中修改 x)。


您可以通过 for 循环实现此目的:

N = number of times to iterate the loop

x_0 <- s+c
x   <- x_0
for ( i in 1:N ) {
    # [calculate r here]
    # calculate x
    x <- 1/2*x*(1+r) + 1/2*x
}

但是,您的方程式看起来可以简化以避免这一切:

x_{i+1} = 1/2 * x_i * (1+r) + 1/2 * x_i
        = 1/2 * x_i * (1+r +1)    
        = 1/2 * x_i * (2+r)

在这种情况下,我们可以看到:

x_n = [1/2 * (2+r) ]^n * x_0

当您说r“不恒定”时,您的意思是每次计算x_i 时它都会发生变化?如x_1 等式中的rx_2 等式中的r 不同?在这种情况下,您必须使用 for 循环,而 x_n 的简化方程无效

【讨论】:

  • 是的,你是对的,r 每次都在变化。我将在上面的帖子中修改该部分。实际上,r=- 0.5 或 r=1,有 50% 的概率得到其中一个。
  • 然后您可以使用for 循环,这将起作用(使用为循环计算 r 的适当行)。
  • 是的,我实际上是想避免这种情况,因为 R 已经有诸如 lapply 或 tapply 之类的函数来编写 for 循环,但这种情况有点不同。
  • 是的,这是变量 r 的可重现代码,希望这能阐明我的意思。 r = sample(c(-0.5,1), size=50, replace=TRUE, prob=c(0.5,0.5))
  • Vapply + 全局修改 = 恐怖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2022-11-21
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多