Как рассчитать логарифмически нормальную плотность (начиная с нормальной плотности) с помощью SymPy

from sympy import *
x, y, mu, sigma, density1, density2 = symbols('x y mu sigma density1 density2')
eq1 = Eq(density1, 1/(sqrt(2*pi)*sigma)
                         *exp(-(x-mu)**2/(2*sigma**2)))     # normal 
eq2 = Eq(y, exp(x))                                         # substitution
eq3 = Eq(density2, 1/(y*sqrt(2*pi)*sigma)
                         *exp(-(ln(y)-mu)**2/(2*sigma**2))) # lognormal
[eq1, eq2, eq3]

Вывод: вывод LaTeX

Как я могу заставить SymPy принять нормальную плотность (eq1), применить замену x на y ( eq2) и вывести логнормальную плотность (eq3)?

(Я не получил ответа на этот вопрос на https://stats.stackexchange.com/q/55353/14202. .)


person winerd    schedule 21.12.2017    source источник


Ответы (1)


Когда мы меняем переменную в функции плотности вероятности, также необходимо умножать плотность на производную функции, выполняющей замену. Вот как работает подстановка в интегралах, и плотность вероятности должна иметь интеграл 1, так что мы должны уважать это.

Назовем функцию, выполняющую подстановку, f (в вашем примере это log(y)). Вот как работает этот процесс, начиная с вашей настройки:

f = solve(eq2, x)[0]
new_density = eq1.rhs.subs(x, f) * f.diff()
# test it now
Eq(new_density, eq3.rhs)  #  True
person Community    schedule 22.12.2017