13

このprobパッケージは、ベース R 分布の特性関数を数値的に評価します。ほとんどすべてのディストリビューションには、既存の式があります。ただし、いくつかのケースでは、閉じた形式のソリューションは知られていません。適切な例: ワイブル分布 (ただし、以下を参照)。

ワイブル特性関数については、基本的に 2 つの積分を計算し、それらをまとめます。

fr <- function(x) cos(t * x) * dweibull(x, shape, scale)
fi <- function(x) sin(t * x) * dweibull(x, shape, scale)
Rp <- integrate(fr, lower = 0, upper = Inf)$value
Ip <- integrate(fi, lower = 0, upper = Inf)$value
Rp + (0+1i) * Ip

はい、不器用ですが、驚くほどうまく機能します。...ええと、ほとんどの場合。最近、あるユーザーから次のような問題が報告されました。

cfweibull(56, shape = 0.5, scale = 1)

Error in integrate(fr, lower = 0, upper = Inf) : 
  the integral is probably divergent

これで、積分が発散しないことがわかったので、数値の問題に違いありません。ちょっといじって、次のように動作させることができました:

fr <- function(x) cos(56 * x) * dweibull(x, 0.5, 1)

integrate(fr, lower = 0.00001, upper = Inf, subdivisions=1e7)$value
[1] 0.08024055

それは問題ありませんが、完全に正しくはありません。さらに、かなりの調整が必要で、うまくスケーリングできません。私はより良い解決策のためにこれを調査してきました。最近公開された特性関数の「閉じた形式」を見つけましたscale > 1(こちらを参照) が、R では (まだ) 実装されていないライトの一般化されたコンフルエントな超幾何関数が含まれています。アーカイブを調べてintegrate代替案を探したところ、あまりよく整理されていないように見えるものがたくさんあります。

その検索の一環として、逆正接を介して積分領域を有限区間に変換することが思い浮かびました。見てみな:

cfweibull3 <- function (t, shape, scale = 1){
  if (shape <= 0 || scale <= 0) 
    stop("shape and scale must be positive")
  fr <- function(x) cos(t * tan(x)) * dweibull(tan(x), shape, scale)/(cos(x))^2
  fi <- function(x) sin(t * tan(x)) * dweibull(tan(x), shape, scale)/(cos(x))^2
  Rp <- integrate(fr, lower = 0, upper = pi/2, stop.on.error = FALSE)$value
  Ip <- integrate(fi, lower = 0, upper = pi/2, stop.on.error = FALSE)$value
  Rp + (0+1i) * Ip
}

> cfweibull3(56, shape=0.5, scale = 1)
[1] 0.08297194+0.07528834i

質問:

  1. これよりうまくできますか?
  2. 数値積分ルーチンについて、そのようなことの専門家がここで何が起こっているかを明らかにできる何かがありますか? tコサインが急速に変動し、それが問題を引き起こしているのではないかとこっそり疑っています...?
  3. この種の問題により適した既存の R ルーチン/パッケージはありますか? また、登山を開始するのに適切な位置 (山の上) を教えてもらえますか?

コメント:

  1. はい、t関数の引数として使用するのは悪い習慣です。
  2. shape > 1公開された結果をメイプルで使い、brute-force-integrate-by-the-definition-with-Rメイプルのお尻を蹴って正確な答えを計算した。つまり、私は同じ答え (数値精度まで) を数分の 1 秒とさらにわずかな価格で得ることができます。

編集:

探している正確な積分を書き留めるつもりでしたが、この特定のサイトは MathJAX をサポートしていないようですので、代わりにリンクを提供します。合理的な入力(それが何を意味するにせよ)に対するワイブル分布の特性関数を数値的に評価しようとしています。値は複素数ですが、実数部分と虚数部分に分割できます。それが私が呼んでいたものです。tRpIp

最後に 1 つのコメント: ウィキペディアにはワイブル cf の式 (無限級数) がリストされており、その式は私が上で参照した論文で証明されたものと一致します、その級数は に対してのみ成り立つことが証明されていshape > 1ます。ケース0 < shape < 1はまだ未解決の問題です。詳細は論文を参照してください。

4

4 に答える 4

6

高度に振動する積分のさまざまな積分方法について説明しているこの論文をご覧になることに興味があるかもしれません。これは、本質的に計算しようとしているものです : 1.8.6944

また、別の可能なアドバイスは、無限の制限の代わりに、より小さな制限を指定することです。これは、必要な精度を指定すると、ワイブルの cdf に基づいて、できるテールの量を簡単に推定できるためです。切り捨てます。また、制限が固定されている場合は、細分化の数を正確に (またはほぼ) 指定できます (たとえば、期間ごとに少数 (4 ~ 8) のポイントを持つため)。

于 2012-09-20T02:15:45.767 に答える
2

私は Jay と同じ問題を抱えていました - Weibull 分布ではなく、関数の統合です。この質問へのコメントで、ジェイの質問 3に対する私の答えを見つけました。

Rの発散積分はWolframで解ける

R パッケージのpracmaには、積分を数値的に解くための関数がいくつか含まれています。パッケージには、特定の数学関数を統合するためのいくつかの R 関数があります。そして、より一般的な関数の積分があります。それは私の場合に役立ちました。コード例を以下に示します。

質問 2 へ:リンクされた質問 (上記) に対する最初の回答は、C ソース ファイルの完全なエラー メッセージが R によって出力されないことを示しています (関数の収束が遅すぎる可能性があります)。したがって、コサインの急激な変動が問題になる可能性があるというジェイの意見に同意します。私の場合と以下の例では、それが問題でした。

サンプルコード

# load Practical Numerical Math Functions package
library(pracma)

# define function
testfun <- function(r) cos(r*10^6)*exp(-r)

# Integrate it numerically with the basic 'integrate'.
out1 = integarte(testfun, 0, 100)
# "Error in integrate(testfun, 0, 100) : the integral is probably divergent"

# Integrate it numerically with 'integral' from 'pracma' package
# using 'Gauss-Kronrod' method and 10^-8 as relative tolerance. I
# did not try the other ones.
out2 = integral(testfun, 0, 100, method = 'Kronrod', reltol = 1e-8)

2つの備考

  1. 積分関数は、積分関数のように壊れることはありませんが、実行にかなり時間がかかる場合があります。ユーザーが反復回数を制限できるかどうかはわかりません (試しませんでした) (?)。
  2. 積分関数がエラーなしで終了したとしても、結果がどれほど正しいかわかりません。ゼロ付近で急速に変動する関数を数値的に積分することは、変動する関数の正確な値が計算される場所がわからないため、非常に注意が必要なようです(正の値は負の値の 2 倍です。正の値は極大値に近く、負の値は遠く離れています)。 . 私は数値積分の専門家ではありませんが、数値の講義でいくつかの基本的な固定ステップ積分法を知ることができました。したがって、統合的に使用される適応方法は、何らかの方法でこの問題に対処しているのかもしれません。
于 2015-02-26T23:55:20.083 に答える
0

私は質問 1 と 3 に答えようとしています。そうは言っても、私はオリジナルのコードに貢献していません。私はGoogle検索を行いましたが、これが役立つことを願っています. 幸運を!

ソース: http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf (p.6)

#Script

library(ggplot2)

## sampling from a Weibull distribution with parameters shape=2.1 and scale=1.1
x.wei<-rweibull(n=200,shape=2.1,scale=1.1) 

#Weibull population with known paramters shape=2 e scale=1
x.teo<-rweibull(n=200,shape=2, scale=1) ## theorical quantiles from a

#Figure
qqplot(x.teo,x.wei,main="QQ-plot distr. Weibull") ## QQ-plot
abline(0,1) ## a 45-degree reference line is plotted
于 2012-09-17T02:28:23.997 に答える
0

これは役に立ちますか?

http://www.sciencedirect.com/science/article/pii/S0378383907000452

Muraleedharana et al (2007) 最大波高と有義波高のシミュレーションと予測のための修正ワイブル分布、Coastal Engineering、第 54 巻、第 8 号、2007 年 8 月、630 ~ 638 ページ

アブストラクトより:「ワイブル分布の特性関数を導き出す」

于 2012-09-17T03:08:00.237 に答える