计算曲线下的面积

Dan*_*ani 57 r numerical-integration

我想计算曲线下面积来进行积分而不定义像in这样的函数integrate().

我的数据看起来像这样:

Date          Strike     Volatility
2003-01-01    20         0.2
2003-01-01    30         0.3
2003-01-01    40         0.4
etc.
Run Code Online (Sandbox Code Playgroud)

我试图plot(strike, volatility)看看波动性微笑.有没有办法整合这个绘制的"曲线"?

Jor*_*eys 41

通过查看大量的梯形图,每次都在,和之间x_i,AUC非常容易接近.使用zoo包的rollmean,您可以:x_{i+1}y{i+1}y_i

library(zoo)

x <- 1:10
y <- 3*x+25
id <- order(x)

AUC <- sum(diff(x[id])*rollmean(y[id],2))
Run Code Online (Sandbox Code Playgroud)

确保您订购了x值,否则您的结果将没有意义.如果沿y轴某处有负值,则必须弄清楚如何确定曲线下方的区域,并进行相应调整(例如使用abs())

关于你的后续行动:如果你没有正式的职能,你会如何策划它?因此,如果您只有值,那么您唯一可以近似的就是一个明确的积分.即使你有R中的函数,你也只能使用计算确定的积分integrate().只有在您也可以定义形式函数时,才可以绘制它.


小智 32

只需将以下内容添加到您的程序中,您将获得曲线下的区域:

require(pracma)
AUC = trapz(strike,volatility)
Run Code Online (Sandbox Code Playgroud)

来自?trapz:

该方法完全匹配使用梯形规则与基点x对函数进行积分的近似.

  • 我们随时欢迎您提供详细信息,特别是在已经接受答案时. (2认同)

Ben*_*Ben 21

还有三个选项,包括一个使用样条方法和一个使用Simpson规则...

# get data
n <- 100
mean <- 50
sd <- 50

x <- seq(20, 80, length=n)
y <- dnorm(x, mean, sd) *100

# using sintegral in Bolstad2
require(Bolstad2)
sintegral(x,y)$int

# using auc in MESS
require(MESS)
auc(x,y, type = 'spline')

# using integrate.xy in sfsmisc
require(sfsmisc)
integrate.xy(x,y)
Run Code Online (Sandbox Code Playgroud)

梯形方法不如样条方法准确,因此MESS::auc(使用样条方法)或Bolstad2::sintegral(使用Simpson规则)应该是首选.这些的DIY版本(以及使用正交规则的其他方法)在这里:http://www.r-bloggers.com/one-dimensional-integrals/


Vic*_*los 15

好的,所以我在聚会上迟到了一点但是回答了问题的一个简单的R解决方案.这里简单而干净:

sum(diff(x) * (head(y,-1)+tail(y,-1)))/2
Run Code Online (Sandbox Code Playgroud)

OP的解决方案如下:

sum(diff(strike) * (head(volatility,-1)+tail(volatility,-1)))/2
Run Code Online (Sandbox Code Playgroud)

这通过取"左"和"右"y值的平均值,使用梯形方法有效地计算面积.

注意:正如@Joris已经指出的那样你可以使用,abs(y)如果这更有意义.


hac*_*ckR 5

在药代动力学 (PK) 领域,计算不同类型的 AUC 是一项常见且基本的任务。药代动力学有很多不同的 AUC 计算,例如

  • AUC0-t = 从零到时间 t 的 AUC
  • AUC0-last = 从零到最后一个时间点的 AUC(可能与上面相同)
  • AUC0-inf = 从零到时间无穷大的 AUC
  • AUCint = 一段时间内的 AUC
  • AUCall = 数据存在的整个时间段内的 AUC

进行这些计算的最好的软件包之一是PKNCA辉瑞公司人员提供的相对较新的软件包。一探究竟。