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.
我试图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))
确保您订购了x值,否则您的结果将没有意义.如果沿y轴某处有负值,则必须弄清楚如何确定曲线下方的区域,并进行相应调整(例如使用abs())
关于你的后续行动:如果你没有正式的职能,你会如何策划它?因此,如果您只有值,那么您唯一可以近似的就是一个明确的积分.即使你有R中的函数,你也只能使用计算确定的积分integrate().只有在您也可以定义形式函数时,才可以绘制它.
小智 32
只需将以下内容添加到您的程序中,您将获得曲线下的区域:
require(pracma)
AUC = trapz(strike,volatility)
来自?trapz:
该方法完全匹配使用梯形规则与基点x对函数进行积分的近似.
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)
梯形方法不如样条方法准确,因此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
OP的解决方案如下:
sum(diff(strike) * (head(volatility,-1)+tail(volatility,-1)))/2
这通过取"左"和"右"y值的平均值,使用梯形方法有效地计算面积.
注意:正如@Joris已经指出的那样你可以使用,abs(y)如果这更有意义.
在药代动力学 (PK) 领域,计算不同类型的 AUC 是一项常见且基本的任务。药代动力学有很多不同的 AUC 计算,例如
进行这些计算的最好的软件包之一是PKNCA辉瑞公司人员提供的相对较新的软件包。一探究竟。
| 归档时间: | 
 | 
| 查看次数: | 74888 次 | 
| 最近记录: |