我想使用optim
函數找到內部收益率(IRR),基本上是使得我的NPV函數爲零的'利率'。使用優化計算內部收益率
我目前的NPV函數(工作)的代碼是:
npv <- function(rate, cf){
r_v <- rep (rate,length (cf))
t_v <- as.numeric (seq(1:length (cf)))
pv <- cf * exp (-t_v*r_v)
sum (pv)
}
我用下面optim
功能的嘗試:
InternalRateReturn <- optim(c(0,1), npv, cf = testcf2, gr = NULL, method = "L-BFGS-B", lower = -Inf, upper = Inf,control=list(), hessian = FALSE)
但它不具有正確回來回答爲InternalRateReturn$par
,而不是使用下面的uniroot
方法。
請問如何修改此代碼(重申,我只想優化npv
函數中的速率,使npv
函數等於零)?
使用uniroot
IRR函數是按如下:
irr1 <- function(cf) {
uniroot(npv, c(0, 1), cf=cf)$root
}
嗯,我可以看到一個問題,它可能不是唯一的問題:'optim'優化你的函數的第一個參數(例如,'rate',它是函數'npv'中的一個標量)。你提供的初始值是兩個元素的向量,所以'optim'會拋出一個錯誤。你可以使你的初始值成爲一個標量來解決這個問題,或者在'npv'中將'rate'和'values'打包成一個向量。然而,當我試圖複製這個問題時,我得到了一個不同於你的錯誤,所以也許嘗試修復和更新。 – tkmckenzie
@ tkmckenzie我明白你在做什麼。但是,我對這個網站(或者一般的編程)非常陌生,並且不確定如何將速率和值打包到npv中的矢量中。是否可以詳細闡述一下,或指引我參考相關鏈接?非常感謝你的幫助。 – dhhs91
對不起,它並沒有幫助我也遇到了字符限制(對不起,我想把它作爲答案,但我不確定這實際上是否解決了問題)。你想要做的是'npv < - function(x)',那麼函數的第一對行應該是'rate < - x [1]'和'values < - x [2]'。之後,你可以讓你的功能做它以前做的任何事情。希望這可以幫助,讓我知道,如果我可以進一步澄清。 – tkmckenzie