我尝试使用R&#39 {s} integrate
函数计算两个图之间的区域。我有两条预测曲线,我可以放在同一块地块上,也可以在两条曲线之间的区域遮阴,以便可视化:
x1 = seq(1,200,1)
y1 = # 200 numbers from 0.02 - 1.000
y2 = # 200 numbers from 0.00 - 0.95
plot(x1,y1,type="l",bty="L",xlab="Forecast Days",ylab="Curve Actuals")
points(x1,y2,type="l",col="red")
polygon(c(x1,rev(x1)),c(y2,rev(y1)),col="skyblue")
按照此处的示例https://stat.ethz.ch/pipermail/r-help/2010-September/251756.html,我尝试为我的数据执行相同的代码,以计算两条曲线之间的差异。如示例中所述"两条曲线之间的区域与这两条曲线之间的差值的积分相同(相应的是它的绝对值)" :
f1 = approxfun(x1, y1-y2) # piecewise linear function
f2 = function(x) abs(f1(x)) # take the positive value
integrate(f2, 1, 200)
但是我收到以下错误:
Error in integrate(f2, 1, 200) : maximum number of subdivisions reached
欣赏可以澄清的任何清晰度。谢谢!
答案 0 :(得分:1)
正如@Roland早期评论中所建议的那样,增加细分数量可以正确执行。它确实会产生绝对误差,但非常微小。
f1 = approxfun(x1, y1-y2) # piecewise linear function
f2 = function(x) abs(f1(x)) # take the positive value
area1 = integrate(f2, 1, 200, subdivisions = 300)
> area1
9.327692 with absolute error < 8.1e-05
答案 1 :(得分:0)
approxfun()
是否返回了一个函数?您需要将[{1}}和f1
的差异保存为函数,而不是设置点差异。例如
f2
尝试将f1 <- function(x) { 2 * x - 1}
f2 <- function(x) { x^2 - 3 * x}
abs_dif <- function(x) { abs( f1(x) - f2(x) ) }
integrate(abs_dif, -1, 1)
和f1
表示为函数,然后尝试后两行代码。