Questo è un problema difficile Ho pensato prima di usare (qualche approssimazione di) la funzione generatrice del momento della distribuzione lognormale. Non funziona, come spiegherò. Ma prima un po 'di notazione:
Sia la densità normale standard e Φ la corrispondente funzione di distribuzione cumulativa. Analizzeremo solo la distribuzione lognormale del caso l n N ( 0 , 1 ) , che ha la funzione di densità
f ( x ) = 1φΦl n N( 0 , 1 )
e funzione di distribuzione cumulativa
F(x)=Φ(lnx)
Supponiamo cheXeYsiano variabili casuali indipendenti con la distribuzione lognormale sopra. Siamo interessati alla distribuzione diD=X-Y, che è una distribuzione simmetrica con zero medio. LetM(t)=EetXla funzione generatrice dei momenti diX. È definito solo pert
f( x ) = 12 π--√Xe- 12( lnx )2
F( x ) = Φ ( lnx )
XYD = X- YM( t ) = Eet XX , quindi non definito in un intervallo aperto contenente zero. La funzione di generazione del momento per
D è
M D ( t ) = E e t ( X - Y ) = E e t X E e - t Y = M ( t ) M ( - t ) Quindi, la funzione di generazione del momento per
D è definita solo per
t = 0t ∈ ( - ∞ , 0 ]DMD( t ) = Eet ( X- Y)= Eet XEe- t Y= M( t ) M( - t )Dt = 0, quindi non molto utile.
Dt ≥ 0
P( D ≤ t )= P( X- Y≤ t )= ∫∞0P( X- y≤ t | Y= y) f( y)dy= ∫∞0P( X≤ t + y) f( y)dy= ∫∞0F( t + y) f( y)dy
t < 0P( D ≤ t ) = 1 - P( D ≤ | t | )
Questa espressione può essere utilizzata per l'integrazione numerica o come base per la simulazione. Prima un test:
integrate(function(y) plnorm(y)*dlnorm(y), lower=0, upper=+Inf)
0.5 with absolute error < 2.3e-06
che è chiaramente corretto. Cerchiamo di concludere questo in una funzione:
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)
che dà:
Quindi possiamo trovare la funzione di densità differenziando sotto il segno integrale, ottenendo
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)
}
che possiamo testare:
> integrate(dDIFF, lower=-Inf, upper=+Inf)
0.9999999 with absolute error < 1.3e-05
E tracciando la densità otteniamo:
plot(dDIFF, from=-5, to=5)
Ho anche cercato di ottenere un'approssimazione analitica, ma finora non ci sono riuscito, non è un problema facile. Ma l'integrazione numerica come sopra, programmata in R è molto veloce su hardware moderno, quindi è una buona alternativa che probabilmente dovrebbe essere usata molto di più.