正态截断随机变量的总和

机器算法验证 r 正态分布 密度函数 截断 鞍点近似
2022-03-15 19:24:42

假设我有n独立正态随机变量

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

Y=X1+X2++Xn. 我将如何表征密度Y如果每个分布Xi每个都被截断到内(μi2σi,μi+2σi)? 换句话说,我从n独立正态分布,丢弃不在范围内的样本2σ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个回答

对于截断法线的总和,您可以使用鞍点方法的近似值。我现在不会给出详细信息,您可以查看我 对 Gamma 分布的一般总和的回答以 获取提示。我们需要的是找到截断法线的矩生成函数,这很容易。我将在这里为标准法线截断±2, 有密度

f(x)={1Cϕ(x),|x|20,|x|>2
在哪里C=Φ(2)Φ(2)这里ϕ(x),Φ(x)分别是标准法线的密度和 cdf。

矩生成函数可以计算为

M(t)=EetX=1C22etxϕ(x)dx=1Ce12t2[Φ(2t)Φ(2t)]
然后我们可以使用鞍点近似。

我很好奇为什么,但是是的,有一种简单的方法可以生成这个分布总和的 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")