2015-02-24 12 views
7

Nie rozumiem podstaw tworzenia zmiennych logarytmicznych jako udokumentowane here.Log Normalne zmienne losowe z Scipy

The log normal distribution takes on mean and variance as parameters. Chciałbym utworzyć zamrożoną dystrybucję za pomocą tych parametrów, a następnie dostać CDF, pdf itp

Jednak w dokumentacji, dostają zamrożoną rozpowszechnianie za

from scipy.stats import lognorm 
s = 0.953682269606 
rv = lognorm(s) 

„s” wydaje się być standardem odchylenie. Próbowałem użyć parametrów "loc" i "scale" zamiast "s", ale to spowodowało błąd (s jest wymaganym parametrem). Jak wygenerować zamrożoną dystrybucję z wartościami parametru "m", "s" dla lokalizacji i skali?

Odpowiedz

12

Tajemnica rozwiązano (edycja 3)

  • μ odpowiada ln(scale) (!)
  • σ dopasowuje się do kształtu (s)
  • loc nie jest konieczna do ustawienia dowolnego σ i ľ

Uważam, że jest to poważny problem, który nie jest jasno udokumentowany. Sądzę, że wielu z nich popadło w tym, robiąc proste testy z lognormalną dystrybucją w SciPy.

Dlaczego tak jest?

Moduł statystyk traktuje loc i scale takie same dla wszystkich dystrybucji (nie jest to jawnie zapisane, ale można je wywnioskować podczas odczytu między wierszami). Podejrzewałem, że loc jest odejmowane od x, a wynik jest dzielony przez scale (a wynik traktowany jest jako nowy x). Przetestowałem to i okazało się, że tak właśnie jest.

Co to oznacza dla dystrybucji logarytmicznej? W kanonicznej definicji rozkładu logarytmicznego pojawia się termin ln(x). Oczywiście ten sam termin pojawia się w implementacji SciPy. Z rozważań powyżej, jest to jak loc i scale skończyć w logarytm:

ln((x-loc)/scale) 

Przez logarytmom rachunku, to jest taki sam jak

ln(x-loc) - ln(scale) 

w kanonicznych definicji rozkład logarytmicznie normalny termin po prostu jest ln(x) - μ. Porównanie podejścia SciPy i podejścia kanonicznego daje wtedy kluczowy wgląd: ln(scale) reprezentuje μ. loc, jednak nie ma żadnej zgodności w definicji kanonicznej i lepiej jest pozostawić na 0. Dalej poniżej argumentowałem, że kształt (s) to σ.

Dowód

>>> import math 
>>> from scipy.stats import lognorm 
>>> mu = 2 
>>> sigma = 2 
>>> l = lognorm(s=sigma, loc=0, scale=math.exp(mu)) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 54.59815 stddev: 399.71719 

użyć WolframAlpha jako odniesienie. Zapewnia analitycznie określone wartości dla średniej i standardowego odchylenia rozkładu logormalnego.

http://www.wolframalpha.com/input/?i=log-normal+distribution%2C+mean%3D2%2C+sd%3D2

enter image description here

Wartości mecz.

WolframAlpha oraz SciPy podają średnią i odchylenie standardowe, oceniając warunki: analitycznych. Załóżmy przeprowadzić empiryczne badanie, podejmując wiele próbek z rozkładu scipy, i obliczyć ich średnią i odchylenie standardowe „ręcznie” (z całego zestawu próbek):

>>> import numpy as np 
>>> samples = l.rvs(size=2*10**7) 
>>> print("mean: %.5f stddev: %.5f" % (np.mean(samples), np.std(samples))) 
mean: 54.52148 stddev: 380.14457 

to nadal nie idealnie konwergentnych, ale uważam, że jest wystarczającym dowodem na to, że próbki odpowiadają temu samemu rozkładowi, który zakładał WolframAlpha, biorąc pod uwagę μ = 2 i σ = 2.

I jeszcze mały edit: wygląda na to, właściwego korzystania z wyszukiwarki, by pomogły, nie byliśmy pierwszy zostanie uwięziony przez to:

https://stats.stackexchange.com/questions/33036/fitting-log-normal-distribution-in-r-vs-scipy http://nbviewer.ipython.org/url/xweb.geos.ed.ac.uk/~jsteven5/blog/lognormal_distributions.ipynb scipy, lognormal distribution - parameters

Kolejny edit: teraz że wiem, jak się zachowuje, zdaję sobie sprawę, że zachowanie jest zasadniczo udokumentowane. W the "notes" section możemy przeczytać:

z parametrem kształtu sigma i skali parametrów exp (mu)

To jest po prostu naprawdę nie jest oczywiste (oboje nie byli w stanie docenić znaczenie tej małej zdaniu) . Sądzę, że powodem, dla którego nie mogliśmy zrozumieć, co oznacza to zdanie, jest to, że wyrażenie analityczne pokazane w sekcji notatek nie ma znaczenia: , a nie obejmuje loc i scale. Wydaje mi się, że warto jest poprawić raport o błędzie/dokumentacji.

Oryginalny odpowiedź:

Rzeczywiście, temat parametr kształtu nie jest dobrze udokumentowane, gdy patrząc na stronie docs dla danej dystrybucji. Polecam zaglądając do głównej dokumentacji statystyki - nie jest przekrojem parametrów kształtu:

http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters

Wygląda na to, że powinny być właściwością lognorm.shapes, informujący o tym, co oznacza, że ​​parametr s konkretnie.

Edycja: jest tylko jeden parametr, rzeczywiście:

>>> lognorm.shapes 
's' 

Porównując ogólną definicję rozkład logarytmiczno-normalnego (z Wikipedia) enter image description here

i schematem podanym przez scipy docs:

lognorm.pdf(x, s) = 1/(s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 

staje się oczywiste, że s jest prawdziwe σ (sigma).

Jednak z dokumentacji nie jest oczywiste, w jaki sposób parametr loc jest powiązany z μ (mu).

może być, jak w ln(x-loc), co nie odpowiadają ľ w ogólnym wzorze, lub może to być ln(x)-loc, które zapewniają zgodność pomiędzy loc i μ. Wypróbuj to! :)

Edycja 2

dokonaniu porównań między tym, co WolframAlpha (WA) i scipy powiedzieć. WA jest całkiem jasne, że używa μ i σ w ogólnym rozumieniu (zgodnie z definicją w łączonym artykule w Wikipedii).

>>> l = lognorm(s=2, loc=0) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 7.38906 stddev: 54.09584 

To pasuje WA's output.

Teraz dla loc nie będąc zerem występuje niedopasowanie. Przykład:

>>> l = lognorm(s=2, loc=1) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 8.38906 stddev: 54.09584 

WA gives średnią z 20.08 oraz odchylenie standardowe 147. Nie masz go, loc robi nie odpowiadają ľ w klasycznej definicji rozkładu logarytmiczno-normalnego.