通常の切り捨てられた確率変数の合計


8

私が持っていると仮定しの独立した正規確率変数n

X1N(μ1,σ12)X2N(μ2,σ22)XnN(μn,σn2)

および。各の分布がそれぞれ内に切り捨てられている場合、の密度をどのように特徴付けますか?つまり、独立した正規分布からサンプリングし、各平均の内にないサンプルを破棄して、それらを合計しています。 Y X Iμ I - 2 σ Iμ I + 2 σ IN 2 σ IY=X1+X2++XnYXi(μi2σi,μi+2σi)n2σi

現在、私は以下のRコードでこれを行っています:

x_mu <- c(12, 18, 7)
x_sd <- c(1.5, 2, 0.8)
a <- x_mu - 2 * x_sd
b <- x_mu + 2 * x_sd

samples <- sapply(1:3, function(i) {
  return(rtruncnorm(100000, a[i], b[i], x_mu[i], x_sd[i]))
})

y <- rowSums(samples)

の密度を直接生成する方法はありますか?Y


2
あなたの質問は、すべてのを知っていることを意味します。それは本当ですか、それともあなたはそれらを推定していますか?大きな違いがあります!好奇心から、なぜそのようなデータを捨てるのですか?あなたの目的にもよりますが、(はるかに)より良い手順が存在するのではないかと思います。σi
whuber

はい、データの平均とSDはすべて知っています。
Devin 2014

7
あなたはそれを「混乱」として特徴付けることができると思います。この論文jstor.org/stable/2236545は、より科学的な厳密さで問題を調査しています。
Alecos Papadopoulos 2014

2
CLTによる近似の外では、これは比較的トリッキーです。が十分に小さければ、数値のたたみ込みを試すことができます。n
Glen_b-モニカを復活させる

2
@Silverfish実装、プラットフォーム、およびグリッドの許容範囲に応じて、数百が(おそらくそれ以上)良好になります。ただし、速度のほかに、十分な用語を使用すると、実装の詳細についてより注意深くする必要があります。そうしないと、いくつかの数値的な問題が発生し始める可能性があります。
Glen_b-2015

回答:


2

打ち切られた法線の合計に対して、鞍点法による近似を使用できます。詳細についてはここでは触れませんが 、ヒントのガンマ分布の一般的な合計に対する私の答えを見ることができます 。必要なのは、打ち切られた法線のモーメント生成関数を見つけることです。これは簡単です。ここでは、密度がで 切り捨てられた標準法線に対してこれを行います whereここではそれぞれ標準法線の密度とcdfです。f x = { 1±2C=Φ2-Φ-2φXΦX

f(x)={1Cϕ(x),|x|20,|x|>2
C=Φ(2)Φ(2)ϕ(x),Φ(x)

モーメント生成関数は、として計算できます。 そして、鞍点近似を使用できます。

M(t)=EetX=1C22etxϕ(x)dx=1Ce12t2[Φ(2t)Φ(2t)]

-3

なぜか知りたいのですが、はい、この分布の合計のpdfを生成する簡単な方法があります。

## install.packages("truncnorm")
## install.packages("caTools")
library(truncnorm)

x.mu <- c(12, 18, 7)
x.sd <- c(1.5, 2, 0.8)
x.a <- x.mu - 2*x.sd
x.b <- x.mu + 2*x.sd

dmulti <- function(x, a, b, mu, sd)
  rowSums(
    sapply(1:length(mu),
           function(idx)
             dtruncnorm(x, a=a[idx], b=b[idx], mean=mu[idx], sd=sd[idx])))/length(mu)
pmulti <- function(q, a, b, mu, sd)
  rowSums(
    sapply(1:length(mu),
           function(idx)
             ptruncnorm(q, a=a[idx], b=b[idx], mean=mu[idx], sd=sd[idx])))/length(mu)

pointrange <- range(c(x.a, x.b))
pointseq <- seq(pointrange[1], pointrange[2], length.out=100)
## Plot the probability density function
plot(pointseq, dmulti(pointseq, x.a, x.b, x.mu, x.sd),
     type="l")

## Plot the cumulative distribution function
plot(pointseq, pmulti(pointseq, x.a, x.b, x.mu, x.sd),
     type="l")

このコードを正しく読んだ場合、合計ではなく混合のようなものを実装しているようです。このコードが生成するプロットは、ひどく不正確です。それは有効な確率密度関数でさえありません!
whuber

@whuber、捕まえてくれてありがとう。私はpdfを正規化し、cdfを追加しました。
Bill Denney、2014年

3
ありがとうございました。ただし、基本的なエラーが引き続き発生します。合計ではなく混合分布を計算しています。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.