Soma das variáveis ​​aleatórias truncadas normais


8

Suponha que eu tenha variáveis ​​aleatórias normais independentesn

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

e . Como caracterizaria a densidade de se a distribuição de cada é truncada para dentro ? Em outras palavras, estou amostrando distribuições normais independentes, descartando amostras fora de de cada média e somando-as. Y X i ( μ i - 2 σ i , μ i + 2 σ i ) n 2 σ iY=X1+X2++XnYXi(μi2σi,μi+2σi)n2σi

No momento, estou fazendo isso com o código R abaixo:

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)

Existe algum método para gerar a densidade de Y diretamente?


2
Sua pergunta implica que você conhece todos os . É esse realmente o caso ou você os está estimando ? Há uma enorme diferença! Por curiosidade, por que você está jogando fora esses dados? Dependendo dos seus objetivos, suspeito que existam (muito) melhores procedimentos. σi
whuber

Conheço todos os meios e SDs para meus dados, sim.
Devin

7
Eu acredito que você poderia caracterizá-lo como "uma bagunça". Este artigo, jstor.org/stable/2236545 , examina o assunto com mais rigor científico.
Alecos Papadopoulos

2
Fora da aproximação via CLT, isso é relativamente complicado. Eu acho que se for pequeno o suficiente, você pode tentar a convolução numérica. n
Glen_b -Reinstar Monica

2
@ Silverfish Dependendo da implementação, plataforma e quão fina é uma grade tolerável, centenas devem ficar bem (talvez mais); além da velocidade, porém, com termos suficientes, você precisa ter muito mais cuidado com os detalhes da implementação ou vários problemas numéricos podem começar a surgir.
Glen_b -Replica Monica

Respostas:


2

Você pode usar a aproximação pelos métodos de ponto de sela, para a soma das normais truncadas. Não vou dar os detalhes agora, você pode ver minha resposta à soma geral das distribuições Gamma para obter dicas. O que precisamos é encontrar a função geradora de momento para um normal truncado, o que é fácil. Farei isso aqui para um normal normal truncado às , que tem densidade que aqui são densidade e cdf para um normal padrão, respectivamente.f ( x ) = { 1±2

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

A função geradora de momento pode ser calculada como e, em seguida, podemos usar as aproximações do ponto de sela.

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

-3

Estou curioso por que, mas sim, existe uma maneira simples de gerar o pdf dessa soma de distribuições:

## 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")

Se eu li esse código corretamente, você parece estar implementando algo como uma mistura ao invés de um somatório. A plotagem que esse código produz é lamentavelmente incorreta. Nem sequer é uma função de densidade de probabilidade válida!
whuber

@ Whuber, obrigado pela captura. Normalizei o pdf e adicionei o cdf.
Bill Denney

3
Obrigado. No entanto, o erro básico persiste: você está computando uma distribuição de mistura em vez da soma.
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.