95%の信頼できる間隔を見つける方法


13

次の事後分布の95%の信頼できる間隔を計算しようとしています。Rの関数を見つけることができませんでしたが、以下のアプローチは正しいですか?

x <- seq(0.4,12,0.4)
px <-  c(0,0, 0, 0, 0, 0, 0.0002, 0.0037, 0.018, 0.06, 0.22 ,0.43, 0.64,0.7579, 0.7870, 0.72, 0.555, 0.37, 0.24, 0.11, 0.07, 0.02, 0.009, 0.005, 0.0001, 0,0.0002, 0, 0, 0)
plot(x,px, type="l")
mm <- sum(x*px)/sum(px)
var <- (sum((x)^2*px)/sum(px)) - (mm^2)
cat("95% credible interval: ", round(mm -1.96*sqrt(var),3), "-", round(mm + 1.96*sqrt(var),3),"\n")

1
そうではありません-あなたは正規分布と平均について等しい間隔を仮定しましたが、どちらもこの文脈では特に正当化できません。実際、これが離散分布であると仮定すると、確率の約をキャプチャし、95 を取得するには間隔をわずかに広げる必要があります。ベターは、最高濃度域取るかもしれない[ 4.4 8.0 ]これは離散分布である場合。あるいは、間隔を空けて、その下にある確率が2.5 以下であり、その上にある確率が2.5 以下であることも、 [ 4.4 9495[4.48.0]2.52.5こちら。[4.48.0]
ヘンリー

回答:


23

Henryが述べたように、あなたは正規分布を仮定しているので、データが正規分布に従う場合は完全に問題ありませんが、正規分布を仮定できない場合は正しくありません。以下では、データポイントとそれに伴う密度の推定値のみを与えられた未知の分布に使用できる2つの異なるアプローチについて説明します。xpx

最初に考慮すべきことは、間隔を使用して正確に要約するものです。たとえば、変位値を使用して取得された間隔に興味があるかもしれませんが、分布の最高密度領域(ここまたはを参照)にも興味があるかもしれません。これは、対称で単峰性の分布のような単純なケースでは(もしあれば)大した違いを生じないはずですが、これはより「複雑な」分布に対して違いを生じます。一般的に、分位数は約集中確率質量を含む区間あなたを与えるだろう、中央値(中間の最高密度の領域が周囲の領域である一方で、あなたのディストリビューションのを)モード100α分布の。下の図の2つのプロットを比較すると、これはより明確になります。分位点は分布を垂直に「カット」し、最高密度の領域は水平に「カット」します。

分位数vs HDR間隔

次に考慮すべきことは、分布に関する情報が不完全であるという事実に対処する方法です(連続分布について話していると仮定すると、関数ではなく多くのポイントしかありません)。それについてできることは、値を「そのまま」使用するか、何らかの補間またはスムージングを使用して「中間」値を取得することです。

1つのアプローチは、線形補間(?approxfunRを参照)、またはスプラインのようなより滑らかな補間(?splinefunRを参照)を使用することです。そのようなアプローチを選択する場合、補間アルゴリズムにはデータに関するドメイン知識がなく、ゼロ以下の値などの無効な結果を返す可能性があることを覚えておく必要があります。

# grid of points
xx <- seq(min(x), max(x), by = 0.001)

# interpolate function from the sample
fx <- splinefun(x, px) # interpolating function
pxx <- pmax(0, fx(xx)) # normalize so prob >0

考えられる2番目のアプローチは、カーネル密度/混合分布を使用して、所有するデータを使用して分布を近似することです。ここで難しいのは、最適な帯域幅を決定することです。

# density of kernel density/mixture distribution
dmix <- function(x, m, s, w) {
  k <- length(m)
  rowSums(vapply(1:k, function(j) w[j]*dnorm(x, m[j], s[j]), numeric(length(x))))
}

# approximate function using kernel density/mixture distribution
pxx <- dmix(xx, x, rep(0.4, length.out = length(x)), px) # bandwidth 0.4 chosen arbitrary

次に、関心のある間隔を見つけます。数値で進めるか、シミュレーションで進めることができます。

1a)分位間隔を取得するためのサンプリング

# sample from the "empirical" distribution
samp <- sample(xx, 1e5, replace = TRUE, prob = pxx)

# or sample from kernel density
idx <- sample.int(length(x), 1e5, replace = TRUE, prob = px)
samp <- rnorm(1e5, x[idx], 0.4) # this is arbitrary sd

# and take sample quantiles
quantile(samp, c(0.05, 0.975)) 

1b)最高密度領域を取得するためのサンプリング

samp <- sample(pxx, 1e5, replace = TRUE, prob = pxx) # sample probabilities
crit <- quantile(samp, 0.05) # boundary for the lower 5% of probability mass

# values from the 95% highest density region
xx[pxx >= crit]

2a)分位数を数値で見つける

cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]]   # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary

2b)数値的に最高密度の領域を見つける

const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const

以下のプロットでわかるように、単峰性の対称分布の場合、両方のメソッドは同じ間隔を返します。

2種類の間隔

100αPrバツμ±ζαζ


(どちらかの方法を使用して)与えられた情報から直接変位値を計算できるのに、なぜサンプリングするのですか?
whuber

1
@whuberは安価で簡単ですが、明日、非シミュレーション計算を説明するために編集します。
ティム

こんにちはティム、これは非常に役立ちます。分布から分位点を取得するだけでも正しくありませんか。(下位<-x [which(as.logical(diff(cumsum(px)/ sum(px)> 0.025))))))(上位<-x [which(as.logical(diff(cumsum(px)/ sum (px)<0.975))))))
user19758

@ user19758私の編集を確認してください。
ティム

+1追加の説明、イラスト、およびコードは、このサイトでの回答の高い基準を設定します。ありがとうございました!
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.