Suma de variables aleatorias truncadas normales

8

Supongamos que tengo variables aleatorias normales independientesnorte

X1norte(μ1,σ12)X2norte(μ2,σ22)Xnortenorte(μnorte,σnorte2)

e . ¿Cómo caracterizaría la densidad de si la distribución de cada X_i se trunca dentro de (\ mu_i - 2 \ sigma_i, \ mu_i + 2 \ sigma_i) ? En otras palabras, estoy tomando muestras de n distribuciones normales independientes, descartando muestras que no estén dentro de 2 \ sigma_i de cada media y sumando.Y=X1+X2++XnorteYXyo(μyo-2σyo,μyo+2σyo)norte2σyo

En este momento, estoy haciendo esto con el código R a continuación:

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)

¿Hay algún método para generar la densidad de directamente?Y

Devin
fuente
2
Su pregunta implica que conoce todos los . ¿Es ese realmente el caso o los estás estimando ? ¡Hay una gran diferencia! Por curiosidad, ¿por qué estás tirando esos datos? Dependiendo de sus objetivos, sospecho que existen (mucho) mejores procedimientos. σyo
whuber
Sí conozco todos los medios y SD para mis datos, sí.
Devin
77
Creo que podrías caracterizarlo como "un desastre". Este artículo, jstor.org/stable/2236545 , examina el asunto con más rigor científico.
Alecos Papadopoulos
2
Aproximación externa a través de CLT, esto es relativamente complicado. Supongo que si es lo suficientemente pequeño, podría intentar la convolución numérica. norte
Glen_b -Reinstate Monica
2
@Silverfish Dependiendo de la implementación, plataforma y cuán fina es tolerable una grilla, cientos deberían estar bien (quizás más); Además de la velocidad, sin embargo, con suficientes términos, debe ser mucho más cuidadoso con los detalles de implementación o pueden surgir una serie de problemas numéricos.
Glen_b -Reinstate Monica

Respuestas:

2

Puede usar la aproximación por métodos de punto de silla, para la suma de las normales truncadas. No daré los detalles ahora, puede ver mi respuesta a la suma general de distribuciones gamma para obtener pistas. Lo que necesitamos es encontrar la función generadora de momento para una normal truncada, lo cual es fácil. Lo haré aquí para un estándar normal truncado en , que tiene densidad donde aquí son densidad y cdf para una normal estándar, respectivamente.±2

F(X)={1Cϕ(X),El |XEl |20 0,El |XEl |>2
C=Φ(2)-Φ(-2)ϕ(X),Φ(X)

La función de generación de momentos se puede calcular como y luego podemos usar aproximaciones de punto de silla de montar.

METRO(t)=mimitX=1C-22mitXϕ(X)reX=1Cmi12t2[Φ(2-t)-Φ(-2-t)]
kjetil b halvorsen
fuente
-3

Tengo curiosidad por qué, pero sí, hay una manera simple de generar el pdf de esta suma de distribuciones:

## 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")
Bill Denney
fuente
Si leo este código correctamente, parece que estás implementando algo como una mezcla en lugar de una suma. La trama que produce este código es lamentablemente incorrecta. ¡Ni siquiera es una función de densidad de probabilidad válida!
whuber
@whuber, gracias por la captura. Normalicé el pdf y agregué el cdf.
Bill Denney
3
Gracias. Sin embargo, el error básico persiste: está calculando una distribución de mezcla en lugar de la suma.
whuber