67

のような関数を定義せずに積分を行うために、曲線の下の面積を計算したいと思います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)はボラティリティの笑顔を見るために計画しました。このプロットされた「曲線」を統合する方法はありますか?

4

7 に答える 7

49

AUC は、多くの台形図を見ることで非常に簡単に概算できます。各時間はx_ix_{i+1}y{i+1}およびy_i. Zoo パッケージの rollmean を使用すると、次のことができます。

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()。仮関数のプロットは、定義もできる場合にのみ可能です。

于 2011-02-10T09:07:10.940 に答える
37

以下をプログラムに追加するだけで、曲線の下の領域が得られます。

require(pracma)
AUC = trapz(strike,volatility)

から?trapz:

このアプローチは、台形則をベースポイント x で使用して関数を積分するための近似と正確に一致します。

于 2012-03-01T21:08:38.900 に答える
22

スプライン法を使用するものとシンプソンの法則を使用するものを含む、さらに 3 つのオプション...

# 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(シンプソンの法則を使用) を優先する必要があります。これらの DIY バージョン (および直交規則を使用した追加のアプローチ) はこちら: http://www.r-bloggers.com/one-dimensional-integrals/

于 2013-01-29T21:34:22.410 に答える
5

薬物動態 (PK) の世界では、さまざまなタイプの AUC を計算することが一般的で基本的なタスクです。などの薬物動態のためのさまざまな AUC 計算が多数あります。

  • AUC0-t = ゼロから時刻 t までの AUC
  • AUC0-last = ゼロから最後の時点までの AUC (上記と同じ場合があります)
  • AUC0-inf = ゼロから時間無限大までの AUC
  • AUCint = 時間間隔での AUC
  • AUCall = データが存在する全期間の AUC

これらの計算を実行する最適なパッケージの 1 つは、PKNCAファイザー社の比較的新しいパッケージです。見てみな。

于 2016-05-03T20:42:07.563 に答える
-5

ROCR パッケージを使用できます。次の行で AUC が得られます。

pred <- prediction(classifier.labels, actual.labs)
attributes(performance(pred, 'auc'))$y.values[[1]]
于 2012-10-26T08:26:16.067 に答える