Понимание взаимосвязи между нормальным и нормальным распределением с использованием scipy.stats и numpy - PullRequest
0 голосов
/ 04 мая 2020

Я был бы очень признателен, если бы кто-нибудь мог помочь мне понять, где я иду не так. У меня есть некоторые данные, описывающие распределения вероятностей. Данные предоставляют мне значения для P10, P50 и P90. Я также знаю, что распределение является логнормальным.

Я читал, что для случайной величины X, которая нормально распределена по журналам, тогда Y = ln (X) имеет нормальное распределение - например, Википедия ( https://en.wikipedia.org/wiki/Log-normal_distribution).

Однако, когда я пытаюсь понять это, используя scipystats и numpy, я не могу понять, что это правда. Поскольку я знаю, что это правда, и я знаю, что нет никаких проблем с простыми функциями, которые я использую в этих python библиотеках, я знаю, что где-то есть пробел в моем понимании. Я просто, по жизни, не вижу, что мне не хватает ...

Код, который я использую:

    # build a lognormal distribution with scipystats (ss):

    # set parameters (based on the standard normal distribution mu=0 and sigma=1:
    s, mu, sd, size = 0.5,0,1,100000

    # save the distribution:
    X = ss.lognorm.rvs(s,loc=mu,scale=sd,size=size)

    # convert to normal distribution (i.e. calc the natural log of X):
    Y = np.log(X)

    # Check if Y is normal using ratio between p90-p50 and p50-p10 - should be 1:
    p10,p50,p90 = np.percentile(Y,[10,50,90])
    (p90-p50)/(p50-p10)

Выше возвращается 0,9932 - или что-то еще довольно близко к 1. Пока все хорошо. Я могу варьировать s и масштабировать сколько угодно (или пробовал до сих пор), и нормальный тест всегда приближается к 1. Проблема возникает, если я меняю среднее (mu, lo c):

    # build a lognormal distribution with scipystats (ss):

    # set parameters (normal distribution mu=100 and sigma=10:
    s, mu, sd, size = 0.5,100,10,100000

    # save the distribution:
    X = ss.lognorm.rvs(s,loc=mu,scale=sd,size=size)

    # convert to normal distribution (i.e. calc the natural log of X):
    Y = np.log(X)

    # Check if Y is normal using ratio between p90-p50 and p50-p10 - should be 1:
    p10,p50,p90 = np.percentile(Y,[10,50,90])
    (p90-p50)/(p50-p10)

В этом случае ответ, который я получаю, составляет около 1,8 - то есть не нормальное распределение. Как я уже сказал, я явно что-то не так понимаю, но я не вижу, что это такое.

В итоге, если я использую ss.lognorm.rvs, чтобы вычислить серию логарифмически распределенных случайных величин со значением lo c чего-либо, кроме 0, и затем используйте np.log, чтобы получить натуральный логарифм случайных переменных, тогда это новое распределение обычно не распространяется, что, на первый взгляд, нарушает правило, описанное в верхней части статьи в Википедии. в верхней части этого вопроса!

Я очень благодарен за любую помощь, которую мне может дать любой человек - я просто хочу быть уверен, что понимаю, как связать логнормальные данные с нормальной кривой!

1 Ответ

0 голосов
/ 04 мая 2020

Посмотрите на эти методы, чтобы проверить, как все работает в scipy.stats:

In [95]: ss.lognorm(s=0.1).mean()                                                                                                                                                                                  
Out[95]: 1.005012520859401

In [96]: np.exp(0.1**2 / 2)                                                                                                                                                                                        
Out[96]: 1.005012520859401

In [97]: ss.lognorm(s=0.1).var()                                                                                                                                                                                   
Out[97]: 0.010151172942587642

In [98]: (np.exp(0.1**2) - 1) * np.exp(0.1 **2)                                                                                                                                                                    
Out[98]: 0.010151172942587642

Я нахожу соглашения scipy.stats немного запутанными, и каждый раз приходится проходить через go.

...