各行がローンであるビッグデータセット(約20万行)があります。ローンの金額、支払い回数、ローンの支払いがあります。ローンの利率を取得しようとしています。Rにはこれを計算する関数がありません(少なくともベース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の入力として使用します。これは、私のPCでは、200kデータベースで実行するのに約20秒かかります。
問題は、私がいくつかの最適化を行おうとしていることです。これは最適化のステップであるため、さらに高速化しようとしています。
ベクトル化を試みましたが、unirootがベクトル化されていないため、それ以上進むことはできません。ベクトル化された求根法はありますか?
ありがとう