- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可重现的示例:
v <- c(-400000.0,-200000.0, 660636.7)
d <- c("2021-10-27","2022-12-23","2023-01-04")
d1 <- as.Date(d, format="%Y-%m-%d")
tvm::xirr(v, d1) # gives the error below
Error in uniroot(xnpv, interval = interval, cf = cf, d = d, tau = tau, :
f.lower = f(lower) is NA
Excel XIRR 返回 0.125,这似乎是正确的。
uniroot documentation说“必须指定间隔或下限和上限”,我不确定 tvm::xirr 是否这样做。我想确实如此,因为它适用于许多其他数据集。
无论如何,在这种情况下,我可以通过提供下限和上限(现在我通过 Excel 知道答案)并进行一些试验和错误,使其正常工作,如下所示。但我不确定我的界限是否永远有效。
> tvm::xirr(v, d1, f.lower = -0.2, f.upper=0.5)
[1] 10
> tvm::xirr(v, d1, f.lower = -0.2, f.upper=5)
[1] -1
> tvm::xirr(v, d1, lower = -0.99, upper=0.99)
[1] 0.1244512
这是 tvm::xirr 的错误或限制还是我遗漏了什么?
最佳答案
让我们进入兔子洞吧。首先,让我们阅读tvm::xirr的源代码:
xirr = function (cf, d, tau = NULL, comp_freq = 1, interval = c(-1, 10), ...)
{
uniroot(xnpv, interval = interval, cf = cf, d = d, tau = tau,
comp_freq = comp_freq, extendInt = "yes", ...)$root
}
Xirr 调用 uniroot 来识别函数 xnpv 在区间 c(-1, 10) 中等于 0 的位置。默认参数值为 tau = NULL 和 comp_freq = 1。 其次,让我们看一下 xnpv 的源代码:
xnpv = function (i, cf, d, tau = NULL, comp_freq = 1)
{
if (is.null(tau))
tau <- as.integer(d - d[1])/365
delta <- if (comp_freq == 0) {
1/(1 + i * tau)
}
else if (comp_freq == Inf) {
exp(-tau * i)
}
else {
1/((1 + i/comp_freq)^(tau * comp_freq))
}
sum(cf * delta)
}
我们可以将 xnpv 及其根可视化如下:
library(tvm)
v = c(-400000.0,-200000.0, 660636.7)
d = c("2021-10-27","2022-12-23","2023-01-04")
d1 = as.Date(d, format="%Y-%m-%d")
x = seq(-0.8, 10, 0.01)
y = sapply(x, function(x) xnpv(i = x, cf = v, d = d1, tau = as.integer(d1 - d1[1])/365))
plot(x, y, type = 'l', ylab = "xnpv", xlab = "cf"); abline(h = 0, lty = 2); abline(v = 0.1244512, lty = 2)
如您所见,对于 comp_freq = 1,因子 1/(1 + i/comp_freq)(在 delta 的定义中)对于指数不同于 0 的情况在 i = -1 处有一个垂直渐近线 (0^0 = R 中的 1)。此外,对于 i < -1,该表达式在 R 中未定义(负数的十进制幂等于 R 中的 NaN)。
要解决此问题,假设 comp_freq 不同于 0 或 +Inf,您可以按如下方式调用 xirr:
offset = 0.001; comp_freq = 1
tvm::xirr(v, d1, lower = -comp_freq+offset, upper = 10, comp_freq = comp_freq, tol = 1e-7) # I also changed the numerical tolerance for increased accuracy.
这假设 cf <= 10。最后,鉴于 comp_freq = 1 是默认值,xirr 在默认设置下总是失败(因此:该函数尚未经过其开发人员的彻底测试)。
关于r - 在 R 中计算 XIRR 时出现 uniroot 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75024100/
我对 uniroot 命令有疑问。我无法以合乎逻辑的方式提出我的问题,因为我不知道为什么在下面示例的第二种情况下每次结果都不同。在第一种情况下,我的 f 函数的结果总是相同的: library(mvt
我查看了有关uniroot和optimize的描述,它们的描述有些不同,但是本书引用的书是相同的,我想知道是否有理由选择一个? 最佳答案 这两个功能的用途完全不同: optimize用于查找函数的最小
此函数根据管道的直径、流量和长度计算管道中的压力损失。 hazwil2 <- function(diam, flow, leng){ psi2=((1/(2.31*100))*1050*((flo
我想在 R 中使用 uniroot 找到 log(x) = x2 − 2 的根 f <- function(x) (log(x)+2-x^2) uniroot(f, lower=0, upper=1
在从 R 中调用的 C 程序中,我需要使用 R 的“uniroot”函数。一种方法是使用“call_R”函数从 C 中再次调用 R。我想知道是否有更好的方法? “Rmath.h”中是否有函数可以执行此
我想知道在R中由“ uniroot”输出的值列表中由“ optimize”输出的“ objective”是什么意思? 一个例子: uniroot(function(x) cos(x) - x, low
功能是: f1 = function(x) { -1.3 * (x-0.1)^2+0.5 * (x-0.1)^5 } 我试图找到区间 [-1, 1] 中的最大值。 优化函数返回正确的值: opti
可重现的示例: v tvm::xirr(v, d1, f.lower = -0.2, f.upper=0.5) [1] 10 > tvm::xirr(v, d1, f.lower = -0.2, f
可重现的示例: v tvm::xirr(v, d1, f.lower = -0.2, f.upper=0.5) [1] 10 > tvm::xirr(v, d1, f.lower = -0.2, f
我是一名优秀的程序员,十分优秀!