私は、多くの異なるアルファとベータのために、ベータ分布の特性関数をRで計算しようとしています。残念ながら私は数値的な問題にぶつかっています。ベータ分布の特性関数
まず以下の例を参照してください(私はパッケージCharFun
、ほとんどの場合のために正常に動作しているようだ機能cfX_Beta(t, alpha, beta)
を使用していたが、alpha=121.3618
とbeta=5041.483
ため例えば、それは完全に失敗し、Re(cfX_Beta(t, alpha, beta))
とIm(cfX_Beta(t, alpha, beta))
は常に[間隔にする必要があります-1,1])。
次に、統合によって特性関数を求めることにしました。この方法ではalpha=121.3618
とbeta=5041.483
の信憑性のある結果が得られますが、他の組み合わせの場合は統合が失敗します。 (エラー:「積分はおそらく発散している」)。積分のためにrel.tol
を増やしても助けにならなかった。逆に、他のアルファ値とベータ値については、「丸め誤差が検出されました」というエラーが表示されます。
質問: アルファとベータのすべての可能な組み合わせについて、ベータ版の特性関数の信頼できる結果を得る別の方法はありますか?
私は明らかな間違いをしていますか?
alpha=beta=1
両方の方法は、同じ結果を提供するためにあなたが見ることができるように
library(CharFun)
abc<-function(x,t,a,b) {
return(dbeta(x,a,b)*cos(t*x))
}
dfg<-function(x,t,a,b) {
return(dbeta(x,a,b)*sin(t*x))
}
hij<-function(t,a,b) {
intRe=rep(0,length(t))
intIm=rep(0,length(t))
i<-complex(1,0,1)
for (j in 1:length(t)) {
intRe[j]<-integrate(abc,lower=0,upper=1,t[j],a,b)$value
intIm[j]<-integrate(dfg,lower=0,upper=1,t[j],a,b)$value
}
return(intRe+intIm*i)
}
alpha<-1
beta<-1
t <- seq(-100, 100, length.out = 501)
par(mfrow=c(3,2))
alpha<-1
beta<-1
plotGraf(function(t)
hij(t, alpha, beta), t, title = "CF alpha=1
beta=1")
plotGraf(function(t)
cfX_Beta(t, alpha, beta), t, title = "CF Charfun alpha=1
beta=1")
alpha<-121.3618
beta<-5041.483
plotGraf(function(t)
hij(t, alpha, beta), t, title = "CF alpha=121.3618 beta=5041.483")
plotGraf(function(t)
cfX_Beta(t, alpha, beta), t, title = "CF Charfun alpha=121.3618 beta=5041.483")
alpha<-1
beta<-1/2
plotGraf(function(t)
hij(t, alpha, beta), t, title = "CF alpha=1
beta=1/2")
plotGraf(function(t)
cfX_Beta(t, alpha, beta), t, title = "CF Charfun alpha=1
beta=1/2")
、
cfX_Beta(t, alpha, beta)
は
alpha=121.3618
と
beta=5041.483
統合の結果はもっともらしく思えるのために野生行きます。
alpha=1
と
beta=1/2
の場合、統合は失敗します。
これは合理的な質問ですが、それは詳細を掘り下げるしばらく過ごすために回答が必要になりますので、答えを得るのは難しいかもしれません(Iドンしかし、より簡単な問題にそれを沸かす簡単な方法を参照してください...) –