CDFの既知のポイントに一致するように分布を近似する


6

最近、ある分布の裾にいくつかの確率ポイントがあり、これらの尾を通る分布に「適合」させたい状況に遭遇しました。これは乱雑で過度に正確ではなく、概念的な問題に悩まされていることを理解しています。しかし、私が本当にこれをやりたいと思っていることを信じてください。

つまりx、値でありy、その値の確率以下であるCDFの末尾のいくつかの点を効果的に知っています。これが私のデータを説明するRコードです:

x <- c(0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85)
y <- c(0.0666666666666667, 0.0625, 0.0659340659340659, 0.0563106796116505, 
       0.0305676855895196, 0.0436953807740325, 0.0267459138187221)

次に、を使用して、データとベータ分布CDFの間のエラーを最小限に抑える関数を作成しますpbeta。SSEをフィット指標として使用し、それをで最小化し-sumます。私はに最初のパラメータとして初期推測で投げるoptim(9, .8)私は別の推測でこれを試してみたが、私はいつも同じ結果を得ます。私が使用する出発点の推測は、手動で近くにあるように見えるパラメーターを手動で調理することから来ています。

# function to optomize with optim
beta_func <- function(par, x) -sum( (pbeta( x, par[1], par[2]) - y)**2 ) 
out <- optim(c(9,.8), beta_func, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)

out <- out$par
print(out)
#> [1]  0.90000 23.40294

以下では、「最適化された」ベータ分布を赤で、実際のデータを青で、手作業で調整したベータパラメータの最初の推測を黒でグラフ化しています。

plot(function(x) pbeta(x, shape1=out[1], shape2=out[2] ), 0, 1.5, col='red')
plot(function(x) pbeta(x, 9,.8), 0, 1.5, col='black', add=TRUE)
lines(x,y, col='blue')

ここに画像の説明を入力してください

私はoptim私の最初の推測よりも悪い解決策を与えるために何が起こっているのかを理解することができません。私は最初の推測optimと解決策のSSEを計算しましたが、私の推測にははるかに大きな-SSEがあるようです:

# my guess
-sum( (pbeta( x, 9, .8) - y)**2)
#> [1] -0.03493344

# optim's output
-sum( (pbeta( x, .9, 23) - y)**2)
#> [1] -6.314587

過去の履歴をベイジアンの以前のものとして使用しているので、私は誤解している、optimまたは不適切な入力を与えていると思います。しかし、私は何が起こっているのかわからない。任意のヒントをいただければ幸いです。

私はCG最適化方法を試してみましたが、結果に意味のある違いはなく、それでも私の最初の推測ほどよく見えません。

out <- optim(c(9,.8), beta_func, method="CG", x=x)
out <- out$par
print(out)
#> [1]  2.287611 11.124736

1
これらの点はCDFで「既知」でありながら、値の増加に伴って減少する傾向があるのはなぜですか。バツ
JimB

1
これらは、ホイールを再発明する代わりに、標準的な統計ツールを使用してこれらの量を推定する場合に消える問題だと思います。
Sycoraxは、モニカを復活

@JimB下り勾配のソースは2倍です。各ポイントの推定値は異なるサンプリングプロセスから取得されるため、次の2つのことが起こります。1)サンプルノイズ2)各基礎となるものに関するiid仮定の違反。私は、ここでの統計の問題についてはあまり気にしておらずoptim、入札を行うようにしています。
JDロング

@Sycoraxの提案は、標準的な統計ツールが私の状況で機能することを前提としています。それは誤った仮定です。
JDロング、

回答:


5

誤って二乗誤差を最大化しようとしていると思います。optim()のデフォルトは関数を最小化することです。そのため、beta_func()の負の符号は最大値を検索します。

のように関数を変更すると、推測に近い値が得られます。

beta_func2 <- function(par, x) sum( (pbeta( x, par[1], par[2]) - y)**2 ) 
out2 <- optim(c(9,.8), beta_func2, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)
out2 <- out2$par
print(out2)
[1] 11.04296  0.50000

観測値に対して新しい関数を確認できます(ここで、xとyは例のように定義されています)。

plot(x,(pbeta(x,out[1],out[2])), ylim=c(-.1,1), col="red", type="l")
points(x, (pbeta(x,9,0.8)), col="black", type="l")
points(x,(pbeta(x,out2[1],out2[2])), col="orange", type="l")
lines(x,y, col='blue')
title(main="Blue observed CDF, black guesstimate, gold optimized")

ここに画像の説明を入力してください


1
うん、それは明らかに私の間違いでした。私は気まぐれでサインを変えようとしたと思ったが、明らかにそうではなかった。私はのデフォルトの動作がoptim最大化するという考えにかなり固定されていました。ありがとう!
JDロング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.