Henryが述べたように、あなたは正規分布を仮定しているので、データが正規分布に従う場合は完全に問題ありませんが、正規分布を仮定できない場合は正しくありません。以下では、データポイントとそれに伴う密度の推定値のみを与えられた未知の分布に使用できる2つの異なるアプローチについて説明します。x
px
最初に考慮すべきことは、間隔を使用して正確に要約するものです。たとえば、変位値を使用して取得された間隔に興味があるかもしれませんが、分布の最高密度領域(ここまたはを参照)にも興味があるかもしれません。これは、対称で単峰性の分布のような単純なケースでは(もしあれば)大した違いを生じないはずですが、これはより「複雑な」分布に対して違いを生じます。一般的に、分位数は約集中確率質量を含む区間あなたを与えるだろう、中央値(中間の最高密度の領域が周囲の領域である一方で、あなたのディストリビューションのを)モード100 α %分布の。下の図の2つのプロットを比較すると、これはより明確になります。分位点は分布を垂直に「カット」し、最高密度の領域は水平に「カット」します。
次に考慮すべきことは、分布に関する情報が不完全であるという事実に対処する方法です(連続分布について話していると仮定すると、関数ではなく多くのポイントしかありません)。それについてできることは、値を「そのまま」使用するか、何らかの補間またはスムージングを使用して「中間」値を取得することです。
1つのアプローチは、線形補間(?approxfun
Rを参照)、またはスプラインのようなより滑らかな補間(?splinefun
Rを参照)を使用することです。そのようなアプローチを選択する場合、補間アルゴリズムにはデータに関するドメイン知識がなく、ゼロ以下の値などの無効な結果を返す可能性があることを覚えておく必要があります。
# 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
以下のプロットでわかるように、単峰性の対称分布の場合、両方のメソッドは同じ間隔を返します。
100 α %Pr (X∈ μ ± ζ)≥ αζ