Este é um problema difícil. Pensei primeiro em usar (alguma aproximação) a função geradora de momento da distribuição lognormal. Isso não funciona, como explicarei. Mas primeiro alguma notação:
Deixe ser a densidade normal padrão e Φ a correspondente função de distribuição cumulativa. Nós só irá analisar a distribuição log-normal caso l n N ( 0 , 1 ) , que tem a função de densidade de
f ( x ) = 1ϕΦl n N( 0 , 1 )
e função de distribuição cumulativa
F(x)=Φ(lnx)
Suponha queXeYsejam variáveis aleatórias independentes com a distribuição lognormal acima. Estamos interessados na distribuição deD=X-Y, que é uma distribuição simétrica com média zero. VamosM(t)=Ede etXser a função geradora momento deX. É definido apenas parat
f( x ) = 12 π--√xe- 12(lnx)2
F(x)=Φ(lnx)
XYD=X−YM(t)=EetXX , portanto não definido em um intervalo aberto contendo zero. A função geradora de momentos para
D é
M D ( t ) = E e t ( X - Y ) = E e t X E e - t Y = M ( t ) M ( - t ) Portanto, a função geradora de momento para
D é definida apenas para
t = 0t ∈ ( - ∞ , 0 ]DMD( t ) = Eet ( X- Y)= Eet XEe- t Y= M( T ) H( - t )Dt = 0, então não é muito útil.
Dt ≥ 0
P( D ≤ t )= P( X- Y≤ t )= ∫∞0 0P( X- y≤ t | Y= y) f( y)dy= ∫∞0 0P( X≤ t + y) f( y)dy= ∫∞0 0F( t + y) f( y)dy
t < 0P( D ≤ t ) = 1 - P( D ≤ | t | )
Esta expressão pode ser usada para integração numérica ou como base para simulação. Primeiro um teste:
integrate(function(y) plnorm(y)*dlnorm(y), lower=0, upper=+Inf)
0.5 with absolute error < 2.3e-06
o que é claramente correto. Vamos encerrar isso dentro de uma função:
pDIFF <- function(t) {
d <- t
for (tt in seq(along=t)) {
if (t[tt] >= 0.0) d[tt] <- integrate(function(y) plnorm(y+t[tt])*dlnorm(y),
lower=0.0, upper=+Inf)$value else
d[tt] <- 1-integrate(function(y) plnorm(y+abs(t[tt]))*dlnorm(y),
lower=0.0, upper=+Inf)$value
}
return(d)
}
> plot(pDIFF, from=-5, to=5)
que dá:
Então podemos encontrar a função densidade, diferenciando-se sob o sinal integral, obtendo
dDIFF <- function(t) {
d <- t; t<- abs(t)
for (tt in seq(along=t)) {
d[tt] <- integrate(function(y) dlnorm(y+t[tt])*dlnorm(y),
lower=0.0, upper=+Inf)$value
}
return(d)
}
que podemos testar:
> integrate(dDIFF, lower=-Inf, upper=+Inf)
0.9999999 with absolute error < 1.3e-05
E plotando a densidade que obtemos:
plot(dDIFF, from=-5, to=5)
Também tentei obter alguma aproximação analítica, mas até agora não obtive sucesso, não é um problema fácil. Mas a integração numérica como acima, programada em R, é muito rápida no hardware moderno, por isso é uma boa alternativa que provavelmente deve ser usada muito mais.