我有一个大数据集(大约 20 万行),其中每一行都是一笔贷款。我有贷款金额,付款次数和贷款付款。我想知道贷款利率。R没有计算这个的函数(至少base R没有它,我找不到它)。编写 npv 和 irr 函数并不难
Npv <- function(i, cf, t=seq(from=0,by=1,along.with=cf)) sum(cf/(1+i)^t)
Irr <- function(cf) { uniroot(npv, c(0,100000), cf=cf)$root }
你可以这样做
rate = Irr(c(amt,rep(pmt,times=n)))
问题是当您尝试计算大量付款的费率时。因为 uniroot 没有向量化,并且 rep 花费了惊人的时间,所以最终计算速度很慢。如果您进行一些数学运算并确定您正在寻找以下等式的根,则可以使其更快
zerome <- function(r) amt/pmt-(1-1/(1+r)^n)/r
然后将其用作 uniroot 的输入。对于我的 200k 数据库,这在我的电脑中运行大约需要 20 秒。
问题是我正在尝试做一些优化,这是优化的一个步骤,所以我试图加快速度。
我已经尝试过矢量化,但是因为 uniroot 没有矢量化,所以我不能走得更远。是否有任何矢量化的求根方法?
谢谢