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
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)
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.