2016-10-17 9 views
0

Rのintegrate関数を使用して2つのプロット間の面積を計算しようとしています。"integrate"を使用して2行の間の面積を計算する際にエラーが発生しました

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次のとおりです。私は可視化のために、2つの曲線の間の領域でも、日陰を同じプロット上に置くとすることができるよ2つの予測曲線を持っています私のデータのためのコードは、2つの曲線の間にあります。例えばで述べたように、「(。RESPその絶対値)は、2つの曲線の間の領域は、これら二つの曲線間の差の積分と同じである」

f1 = approxfun(x1, y1-y2)  # piecewise linear function 
f2 = function(x) abs(f1(x)) # take the positive value 

integrate(f2, 1, 200) 

Iは、次のエラーを取得しかし:

Error in integrate(f2, 1, 200) : maximum number of subdivisions reached 

この問題を解消することができます。ありがとう!

+1

「サブディビジョン」の数を増やすことはできますが、丸め誤差が発生する可能性があります。代わりに近似なしで積分を計算することを提案します。幾何学を使うのはそれほど難しいことではありません。 – Roland

答えて

0

approxfun()は関数を返しますか?ファンクションとして保存されたf1f2の違いを持つ必要がありますが、ポイントの違いは設定されていません。関数は、コードの第2行を試みるように、例えば

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) 

f1f2を発現してみてください。

+0

お返事ありがとうございます。私がRのヘルプフォーラムから含まれていた例では、元のコードを取得した場所では、私が書いたとおり正確に実行され、データ自体は私のものとあまり変わっていません(x軸で使用されるseqは小さく、 y値は私のものと似ています)。そこで使用されているサンプルを実行するとき、私はまったく同じ答えを得るので、あなたが提案した変更を私がなぜ行う必要があるのか​​分かりません。 – Qaribbean

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 
+0

これは正解と思われる – BonStats

関連する問題