SciPy ile R arasındaki log-normal dağılımının belirlenmesi


10

Bir veri kümesi ile R kullanarak lognormal bir model taktım. Ortaya çıkan parametreler:

meanlog = 4.2991610 
sdlog = 0.5511349

Bu modeli daha önce hiç kullanmadığım Scipy'ye aktarmak istiyorum. Scipy kullanarak, 1 ve 3.1626716539637488e + 90 - çok farklı sayıların bir şekil ve ölçeğini elde edebildim. Ayrıca meanlog ve sdlog exp kullanmaya çalıştım ama tuhaf grafik almaya devam.

Scipy'de yapabileceğim her dokümanı okudum ve hala bu örnekte şekil ve ölçek parametrelerinin ne anlama geldiği konusunda kafam karıştı. Fonksiyonu kendim kodlamak mantıklı olur mu? Scipy için yeni olduğum için bu hatalara eğilimli görünüyor.

SCIPY Lognormal (MAVİ) ve R Lognormal (KIRMIZI): Scipy Lognormal (MAVİ) ve R Lognormal (KIRMIZI)

Hangi yöne gideceğiniz konusunda düşünceleriniz var mı? Veriler R modeline çok iyi uyuyor, bu nedenle Python'da başka bir şeye benziyorsa paylaşmaktan çekinmeyin.

Teşekkür ederim!

Güncelleme:

Scipy 0.11 kullanıyorum

İşte verilerin bir alt kümesi. Gerçek örnek 38k +, ortalama 81.53627'dir:

subsetine:

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. Ortalama (x)
99.071428571428569

Alternatif:

Ben pdf yakalamak için bir işlev üzerinde çalışıyorum:

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

Ancak, bu bana aşağıdaki numaraları vermek (sdlog ve meanlog karışık anlamını alıyorum durumunda birkaç denedim):

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

Düşüncesi olan var mı?

Güncelleme:

"UPQuark's" önerisiyle tekrar yayınlamak:

şekil, loc, ölçek (1.0, 50.03445923295007, 19.074457156766517)

Bununla birlikte, grafiğin şekli çok benzer, tepe noktası 21 civarındadır.


Bu soru ve cevap yardımcı olabilir: stackoverflow.com/questions/8747761/…
jbowman

Teşekkür ederim, buldum ve lognormal ile "uydurma" öğrendim. Ancak, sorularım neden bu kadar farklı dağılımlar elde edeyim?
Lillian Milagros Carrasquillo

SciPy 0.9 kullanıyor musunuz? Ayrıca, verilerinizi veya bir alt kümesini gönderebilir misiniz?
jbowman

Güncellenmiş! Bu arada Scipy 0.11. Bu yüzden okuduğum hatalar alakalı olmamalı;)
Lillian Milagros Carrasquillo

Yanıtlar:


11

Scipy lognormal rutinin aşağıdaki yorumuna ulaşmak için kaynak kodunu kullanarak savaştım.

xlocscaleLognormal(σ)

burada "şekil" parametresidir. σ

Scipy parametreleri ile R parametresi arasındaki eşdeğerlik aşağıdaki gibidir:

loc - Eşdeğeri yok, bu verilerinizden çıkarılır, böylece 0, veri aralığının en üst düzeyine ulaşır.

scale - ; burada değişkenin günlüğünün ortalamasıdır. (Takarken, genellikle verilerin günlüğünün örnek ortalamasını kullanırsınız.) μexpμμ

şekil - varyant günlüğünün standart sapması.

lognorm.pdf(x, 0.55, 0, numpy.exp(4.29))Bağımsız değişkenler nerede olduğunu (x, şekil, loc, ölçek) aradım ve aşağıdaki değerleri üretti:

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 eğrinizle oldukça iyi uyuşuyor gibi görünüyor.


Teşekkürler @JBowman, tam olarak ihtiyacım olan açıklama bu ve çıktı tam olarak benim dağıtımım.
Lillian Milagros Carrasquillo

8

SciPy'deki lognormal dağılım, SciPy'deki tüm dağıtımlar için genel çerçeveye uyar . Hepsinin bir ölçek ve konum anahtar kelimesi vardır (açıkça belirtilmemişse varsayılan 0 ve 1'dir). Bu, tüm dağılımların normalleştirilmiş spesifikasyonlarından, dağılım istatistiklerine net etkileri olacak şekilde kaydırılmasına ve ölçeklendirilmesine olanak tanır. Dağılımlar tipik olarak bir veya daha fazla "şekil" parametresine de sahiptir (normal dağılım gibi bazıları için ek parametreye gerek yoktur).

Bu genel yaklaşım tüm dağılımları güzel bir şekilde birleştirirken , lognormal için diğer paketlerin parametreleri tanımlama şekli nedeniyle biraz karışıklık yaratabilir. Yine de, eğer log (altta yatan dağılımın ortalaması) ve sdlog (altta yatan dağılımın standart sapması) anlamına gelirse, herhangi bir lognormal dağılımı eşleştirmek çok basittir.

İlk olarak, location parametresini 0 olarak ayarladığınızdan emin olun. Daha sonra shape parametresini sdlog değerine ayarlayın. Son olarak, scale parametresini math.exp (meanlog) olarak ayarlayın. Böylece, rv = scipy.stats.lognorm (0.5511349, scale = math.exp (4.2991610)), pdf'si R ile oluşturulan eğrinizle tam olarak eşleşen bir dağıtım nesnesi oluşturur. X = numpy. Boşluk (0,180,1000); çizim (x, rv.pdf (x)) doğrulayacaktır.

Temel olarak, SciPy lognormal dağılımı, location parametresini 0 olarak ayarlarken standartla tam olarak eşleşen standart lognormal dağılımın genelleştirilmesidir.

Verileri .fit yöntemiyle sığdırırken, şekil, konum ve / veya ölçek parametrelerinden herhangi birini sabit tutmak ve yalnızca diğer değişkenlere uymak için f0..fn, floc ve fshape anahtar sözcüklerini de kullanabilirsiniz. Lognormal dağılım için bu genellikle location parametresinin 0 olarak sabitlenmesi gerektiğini bildiğiniz için çok kullanışlıdır. Bu nedenle scipy.stats.lognorm.fit (veri kümesi, floc = 0) her zaman location parametresini 0 olarak döndürür ve yalnızca şekil ve ölçek parametreleri.


3

Scipy lognormal fit şekil, konum ve ölçek döndürür. Ben sadece örnek fiyat verileri bir dizi üzerinde koştu:

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

Bu bana 1.0, 0.09, 0.86 makul tahminler verir ve onu çizdiğinizde, üç parametreyi de dikkate almalısınız.

Shape parametresi, alttaki normal dağılımın standart sapmasıdır ve ölçek normalin ortalamasının üstelidir.

Bu yardımcı olur umarım.


Yanıtladığınız için teşekkürler! Bir kez bu değerleri (loc, ölçek, şekil) var, ben umurumda her x için pdf (x) bulmaya çalışıyorum (burada 0 ila 180, özel değerler). scipy.stats.lognorm.pdf (i, loc, ölçek, şekil) Ancak, bunları çizerken yukarıdaki grafiği elde ederim.
Lillian Milagros Carrasquillo

Tamam sadece şekil ve ölçek bahsettiğini gördüm, bu yüzden fit () varsayılan olarak döndürülen üç parametre olduğunu belirtti. Ayrıca şekil ve ölçek parametrelerinin ne anlama geldiği konusunda kafanızın karıştığını söylediniz ve ben bunu ele almaya çalıştım. Durumunuzda olduğu gibi lognormal fit dönüş absurd değerlerini hiç yaşamadım, konum parametresi nedir?
upquark

Soruyu cevaplamak için soruyu güncelledik. Bunu düşündüğün için teşekkürler.
Lillian Milagros Carrasquillo

Scipy.stats.lognorm.pdf (i, loc, ölçek, şekil) yerine scipy.stats.lognorm.pdf (x, şekil, loc, ölçek) öğesini arayın.
upquark

Teşekkürler, upquark, ben de benzer sonuçlarla yaptım. Grafiğin tüm şekli R'de verilen beklenen sonuçlardan çok farklı olmaya devam ediyor. Aslında R'dekikinden tamamen farklı bir dağılım gibi görünüyor.
Lillian Milagros Carrasquillo

1

Scipy'deki lognormal için dağılım R ile aynı değildir veya genel olarak, tanıdığım dağıtımla aynı değildir. John D Cook buna değindi: http://www.johndcook.com/blog/2010/02/03/statistic-distributions-in-scipy/ http://www.johndcook.com/distributions_scipy.html

Ancak, Python'da lognormal yoğunluk fonksiyonunun nasıl kullanılacağı konusunda kesin bir şey bulamadım. Birisi buna eklemek isterse, lütfen çekinmeyin.

Şimdiye kadar benim çözümüm 0 ile 180 (özel) olarak değerlendirilen ve python betiğinde sözlük olarak kullanılan lognormal pdf kullanmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.