编辑:这是一个不断重新平衡的投资组合问题。
有谁知道用于递归调用的函数是什么?
让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?召回?我无法理解!
提前致谢!
答案 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
等式中的r
与x_2
等式中的x_n
不同?在这种情况下,您必须使用for循环,而{{1}} 的简化等式不是有效。