R対SciPyでの対数正規分布の近似


10

Rを使用して、データのセットで対数正規モデルを近似しました。結果のパラメーターは次のとおりです。

meanlog = 4.2991610 
sdlog = 0.5511349

このモデルを、これまで使用したことがないScipyに転送したいと思います。Scipyを使用して、1と3.1626716539637488e + 90という非常に異なる数の形状とスケールを取得することができました。また、meanlogとsdlogのexpを使用しようとしましたが、奇妙なグラフが引き続き表示されます。

私はscipyでできるすべてのドキュメントを読みましたが、この場合の形状とスケールのパラメーターの意味についてまだ混乱しています。関数を自分でコーディングするのは理にかなっていますか?私はscipyが初めてなので、エラーが発生しやすいようです。

SCIPYログノーマル(青)対Rログノーマル(赤): Scipy Lognormal(BLUE)とR Lognormal(RED)

どの方向に進むかについての考えはありますか?ちなみに、データはRモデルと非常によく適合しているので、Pythonで他のように見える場合は、自由に共有してください。

ありがとうございました!

更新:

私はScipy 0.11を実行しています

これがデータのサブセットです。実際のサンプルは38k +で、平均は81.53627です。

サブセット:

x
[60、170、137、138、81、140、78、46、1、168、138、148、145、35、82、126、66、147、88、106、80、54、83、13
102、54、134、34 ] numpy.mean(x)
99.071428571428569

または:

私はpdfを取り込む機能に取り組んでいます:

def lognoral(x, mu, sigma):
    a = 1 / (x * sigma * numpy.sqrt(2 * numpy.pi) )
    b = - (numpy.log(x) - mu) ^ 2 / (2 * sigma ^ 2)
    p = a * numpy.exp(b)
    return p

ただし、これにより次の数値が得られます(sdlogとmeanlogの意味が混同されている場合に備えて、いくつか試しました)。

>>> lognormal(54,4.2991610, 0.5511349)
0.6994656085799437
 >>> lognormal(54,numpy.exp(4.2991610), 0.5511349)
0.9846125119455129
>>> lognormal(54,numpy.exp(4.2991610), numpy.exp(0.5511349))
0.9302407837304372

何かご意見は?

更新:

「UPQuark's」の提案で再実行:

形状、場所、スケール(1.0、50.03445923295007、19.074457156766517)

グラフの形状は非常によく似ていますが、ピークは21前後で発生しています。


この質問と回答は役立つことがあります。stackoverflow.com/questions/8747761/...
jbowman

ありがとう、私はそれを見つけ、対数正規の「フィッティング」を学びました。しかし、私の質問は、なぜそのような異なるディストリビューションを入手するのですか?
リリアンミラグロスカラスキロ

SciPy 0.9を使用していますか?また、データまたはそのサブセットを投稿できますか?
jbowman

更新しました!ちなみにScipy 0.11です。だから私が読んだバグは関係ないはずです;)
リリアン・ミラグロス・カラスキロ

回答:


11

私は、scipy lognormalルーチンの次の解釈にたどり着くために、ソースコードをたどりました。

xlocscaleLognormal(σ)

σ

scipyパラメータとRパラメータの等価性は次のとおりです。

loc-同等のものはありません。これはデータから差し引かれ、0はデータの範囲の最小値になります。

expμμ

形状-変量の対数の標準偏差。

lognorm.pdf(x, 0.55, 0, numpy.exp(4.29))引数が(x、shape、loc、scale)である場所をそれぞれ呼び出し、次の値を生成しました。

x pdf

10 0.000106

20 0.002275

30 0.006552

40 0.009979

50 0.114557

60 0.113479

70 0.103327

80 0.008941

90 0.007494

100 0.006155

Rカーブとかなり一致しているようです。


ありがとう、@ JBowman、それはまさに私が必要とした説明であり、出力はまさに私の分布です。
リリアンミラグロスカラスキロ

8

SciPyの対数正規分布は、SciPyのすべての分布の一般的なフレームワークに適合します。それらはすべて、scaleおよびlocationキーワードを持っています(明示的に指定されていない場合、デフォルトで0および1になります)。これにより、すべての分布を正規化された仕様からシフトおよびスケーリングして、分布の統計に明確な影響を与えることができます。分布には通常、1つ以上の「形状」パラメーターもあります(ただし、正規分布のように、追加のパラメーターを必要としないものもあります)。

この一般的なアプローチはすべての分布をうまく統合しますが、lognormalの場合、他のパッケージがパラメーターを定義する方法が原因で、混乱が生じる可能性があります。それでも、meanlog(基礎となる分布の平均)とsdlog(基礎となる分布の標準偏差)であれば、対数正規分布を一致させるのは非常に簡単です。

まず、locationパラメータを0に設定していることを確認してください。次に、shapeパラメータをsdlogの値に設定します。最後に、scaleパラメータをmath.exp(meanlog)に設定します。したがって、rv = scipy.stats.lognorm(0.5511349、scale = math.exp(4.2991610))は、pdfがR生成曲線と正確に一致する分布オブジェクトを作成します。x = numpy.linspace(0,180,1000); plot(x、rv.pdf(x))が検証します。

基本的に、SciPyの対数正規分布は、標準の対数正規分布を一般化したものであり、locationパラメーターを0に設定した場合に標準に正確に一致します。

.fitメソッドを使用してデータを近似する場合、キーワードf0..fn、floc、およびfshapeを使用して、形状、位置、スケールパラメーターのいずれかを固定し、他の変数のみに適合させることもできます。対数正規分布の場合、これは非常に役立ちます。通常、場所パラメーターは0に固定する必要があることがわかっています。したがって、scipy.stats.lognorm.fit(dataset、floc = 0)は常に場所パラメーターを0として返し、その他のみを変更します形状とスケールのパラメータ。


3

Scipyの対数正規フィットは、形状、場所、スケールを返します。サンプルの価格データの配列に対して、以下を実行しました。

shape, loc, scale = st.lognorm.fit(d_in["price"])

これにより、1.0、0.09、0.86の妥当な見積もりが得られます。プロットするときは、3つのパラメーターすべてを考慮する必要があります。

形状パラメーターは、基礎となる正規分布の標準偏差であり、スケールは、正規分布の平均の指数です。

お役に立てれば。


返信ありがとうございます!これらの値(loc、scale、shape)を取得したら、気になるxごとにpdf(x)を見つけようとします(ここでは、0から180までの値です)。scipy.stats.lognorm.pdf(i、loc、scale、shape)ただし、これらをプロットすると、上記のプロットが得られます。
リリアンミラグロスカラスキロ

わかりました、形状とスケールのみについて言及しているのを見ました。そのため、fit()からデフォルトで返される3つのパラメーターがあると述べました。また、形状とスケールのパラメーターの意味について混乱しているとのことですが、私はそれに対処しようとしました。あなたの場合のように対数正規フィットが不合理な値を返すことはありませんでしたが、場所パラメーターとは何ですか?
アップクォーク2012

それを答えるために質問を更新しました。これについて考えてくれてありがとう。
リリアンミラグロスカラスキロ

scipy.stats.lognorm.pdf(i、loc、scale、shape)の代わりにscipy.stats.lognorm.pdf(x、shape、loc、scale)を呼び出します。
アップクォーク

おかげで、アップクォーク、私も同様の結果でそれを行いました。グラフの全体的な形は、Rで得られる期待される結果とはかなり異なっています。実際、Rの分布とはまったく異なる分布のように見えます。
リリアンミラグロスカラスキロ

1

対数正規のScipyでの分布はRでの分布と同じではないようですが、一般的には、私がよく知っている分布とは異なります。John D Cookがこれに触れました:http : //www.johndcook.com/blog/2010/02/03/statistical-distributions-in-scipy/ http://www.johndcook.com/distributions_scipy.html

ただし、Pythonで対数正規密度関数を使用する方法について決定的なものは見つかりませんでした。これに追加したい人がいたら、お気軽にどうぞ。

これまでの私の解決策は、0〜180(排他的)で評価され、Pythonスクリプトで辞書として使用されるlognormal pdfを使用することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.