递归地使用输出作为函数的输入

时间:2011-12-12 00:40:09

标签: r

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

有谁知道用于递归调用的函数是什么?

让s =股票;

让c =现金;

让X_0 =初始财富;

让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中是否有一个函数将上一步的输入作为此步骤的输入?

do.call? lapply?召回?我无法理解!

提前致谢!

2 个答案:

答案 0 :(得分:6)

为高阶函数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),

答案 1 :(得分:0)

[编辑:] 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)。

<<-的含义是修改全局环境中的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“不是常数”时,你是说每次计算r时它都会改变吗?如同x_1等式中的rx_2等式中的x_n不同?在这种情况下,您必须使用for循环,而{{1}} 的简化等式不是有效。