【发布时间】:2021-09-24 15:11:44
【问题描述】:
我一直试图避免在 R 中使用 for 循环,以加快计算和简化,尽可能使用向量函数。到目前为止,我已经成功了,直到遇到某些摊销计算。我碰了壁,不得不求助于 for 循环,请参阅下面的 MWE 代码。它可以工作,很好,但我想用矢量或其他更有效的函数替换它。有人可以帮我用矢量函数替换下面的吗?
在提取此 MWE 的完整代码中,它使用 Shiny 是反应式的。周期和矢量速率,实际上是所有变量,都会根据用户输入发生巨大变化。简化了 MWE 示例输入变量。
无论如何,以下是一种非常尴尬的电锯方法,需要精简。但我不知道如何,从我最有经验的完整 XLS 思维方式处理这个问题。如果 for 循环是此类计算的唯一可行选择,我欢迎任何有关改进以下 MWE 的建议。
最底部是“矢量化”尝试的错误代码,但当矢量变量随时间变化时结果不准确。我在底部的图像中展示了这种矢量化方法的一个问题,即当从一个时期移动到下一个时期时,结束/开始余额不匹配(for-loop MWE 代码没有这些问题 - 它是功能性的,但超级笨拙)。
For-loop MWE 代码:
periods <- 10
beginBal <- 1000
yield_vector <- c(0.30,0.30,0.30,0.30,0.30,0.28,0.26,0.20,0.18,0.20)
npr_vector <- c(0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30,0.30)
mpr_vector <- c(0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20,0.20)
default_vector <- c(0.10,0.10,0.10,0.10,0.10,0.09,0.08,0.07,0.06,0.05)
amort <- data.frame(period=seq(1,periods,1),
beginBal=rep(NA,periods),
yield=rep(NA,periods,),
purchases=rep(NA,periods),
payments=rep(NA,periods),
defaults=rep(NA,periods),
endBal=rep(NA,periods))
# Completes first row of data frame
amort[1,2] <- beginBal
amort[1,3] <- beginBal * yield_vector[1]/12
amort[1,4] <- beginBal * npr_vector[1]
amort[1,5] <- beginBal * mpr_vector[1]
amort[1,6] <- beginBal * default_vector[1] / 12
amort[1,7] <- beginBal + amort[1,4] - amort[1,5] - amort[1,6]
# Completes remaining rows of data frame
for(i in 2:nrow(amort)){
amort[i,2] <- amort[i-1,7]
amort[i,3] <- amort[i,2] * yield_vector[i]/12
amort[i,4] <- amort[i,2] * npr_vector[i]
amort[i,5] <- amort[i,2] * mpr_vector[i]
amort[i,6] <- amort[i,2] * default_vector[i]/12
amort[i,7] <- amort[i,2] + amort[i,4] - amort[i,5] - amort[i,6]
}
amort
这是一个看起来圆滑但有缺陷的矢量化尝试,请在下图中查看其输出缺陷之一(在上述 for 循环 MWE 中不会出现这些问题):
amort <- data.frame(period=seq(1,periods,1))
amort$beginBal <- beginBal*(1-(mpr_vector[]+default_vector[]/12-npr_vector[]))^(amort$period-1)
amort$yield <- amort$beginBal*yield_vector[]/12
amort$purchases <- amort$beginBal*npr_vector[]
amort$payments <- amort$beginBal*mpr_vector[]
amort$defaults <- amort$beginBal*default_vector[]/12
amort$endBal <- amort$beginBal+amort$purchases-amort$payments-amort$defaults
amort <- cbind(amort,yield_vector,npr_vector,mpr_vector,default_vector)
amort
【问题讨论】:
-
那么您到底需要什么?你需要最终平衡吗?还是初始余额?还是两者之间的一切?
-
所有显示。 Period, beginBal, yield, purchase, payment, defaults, endBal。对于所有时期(行)
标签: r iteration vectorization rolling-computation accumulate