Это сложная проблема. Сначала я подумал об использовании (некоторой аппроксимации) производящей момент функции логнормального распределения. Это не работает, как я объясню. Но сначала несколько обозначений:
Пусть - стандартная нормальная плотность, а Φ - соответствующая кумулятивная функция распределения. Мы будем только анализировать случай логнормального распределения l n N ( 0 , 1 ) , которое имеет функцию плотности
f ( x ) = 1ϕΦlnN(0,1)
и кумулятивная функция распределения
F(x)=Φ(lnx).
Предположим, чтоXиY- независимые случайные величины с приведенным выше логнормальным распределением. Нас интересует распределениеD=X-Y, которое является симметричным распределением со средним нулем. ПустьM(t)=Eet∈(-∞,0]
f(x)=12π−−√xe−12(lnx)2
F(x)=Φ(lnx)
XYD=X−Y функциягенерирующий момента
X. Определяется только для
тM(t)=EetXXt∈(−∞,0] , поэтому не определено в открытом интервале, содержащем ноль. Функция генерирования момента для
имеет вид
M D ( t ) = E e t ( X - Y ) = E e t X E e - t Y = M ( t ) M ( - t ) . Таким образом, производящая момент функция для
D определена только для
t = 0DMD(t)=Eet(X−Y)=EetXEe−tY=M(t)M(−t)Dt=0так что не очень полезно.
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
(and the case
t<0 is solved by symmetry, we get
P(D≤t)=1−P(D≤|t|)).
This expression can be used for numerical integration or as a basis for simulation. First a test:
integrate(function(y) plnorm(y)*dlnorm(y), lower=0, upper=+Inf)
0.5 with absolute error < 2.3e-06
which is clearly correct. Let us wrap this up inside a function:
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)
which gives:
Then we can find the density function by differentiating under the integral sign, obtaining
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)
}
which we can test:
> integrate(dDIFF, lower=-Inf, upper=+Inf)
0.9999999 with absolute error < 1.3e-05
And plotting the density we get:
plot(dDIFF, from=-5, to=5)
I did also try to get some analytic approximation, but so far didn't succeed, it is not an easy problem. But numerical integration as above, programmed in R is very fast on modern hardware, so is a good alternative which probably should be used much more.