การกระจายการบันทึกปกติที่เหมาะสมใน R กับ SciPy


10

ฉันติดตั้งโมเดล lognormal โดยใช้ R พร้อมชุดข้อมูล พารามิเตอร์ผลลัพธ์คือ:

meanlog = 4.2991610 
sdlog = 0.5511349

ฉันต้องการถ่ายโอนโมเดลนี้ไปยัง Scipy ซึ่งฉันไม่เคยใช้มาก่อน เมื่อใช้ Scipy ฉันสามารถรับรูปร่างและมาตราส่วน 1 และ 3.1626716539637488e + 90 - ตัวเลขที่แตกต่างกันมาก ฉันยังพยายามใช้ exp ของ meanlog และ sdlog แต่ยังคงได้กราฟที่แปลกประหลาด

ฉันได้อ่านเอกสารทุกฉบับที่ฉันสามารถทำได้ใน scipy และฉันยังสับสนเกี่ยวกับความหมายของพารามิเตอร์รูปร่างและขนาดในกรณีนี้ มันจะสมเหตุสมผลหรือไม่ที่จะเขียนโค้ดฟังก์ชันเอง ที่ดูเหมือนว่าจะเกิดข้อผิดพลาดในขณะที่ฉันใหม่เพื่อ scipy

SCIPY Lognormal (BLUE) กับ R Lognormal (RED): 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":

รูปร่าง, loc, สเกล (1.0, 50.03445923295007, 19.074457156766517)

รูปร่างของกราฟนั้นคล้ายกันมาก แต่มีจุดสูงสุดเกิดขึ้นประมาณ 21


คำถามและคำตอบนี้อาจช่วยได้: stackoverflow.com/questions/8747761/…
jbowman

ขอบคุณฉันพบว่าและเรียนรู้ "เหมาะสม" กับ lognormal อย่างไรก็ตามคำถามของฉันคือทำไมฉันจะได้รับการแจกแจงที่แตกต่างกันเช่นนี้?
Lillian Milagros Carrasquillo

คุณใช้ SciPy 0.9 หรือไม่ นอกจากนี้คุณสามารถโพสต์ข้อมูลของคุณหรือส่วนย่อยได้หรือไม่
jbowman

Updated! มันคือ Scipy 0.11 ดังนั้นข้อบกพร่องที่ฉันได้อ่านเกี่ยวกับการไม่ควรจะเกี่ยวข้อง;)
ลิเลียน Milagros Carrasquillo

คำตอบ:


11

ฉันต่อสู้ทางของฉันผ่านซอร์สโค้ดเพื่อมาถึงการตีความรูทีน scipy lognormal ต่อไปนี้

xlocscaleLognormal(σ)

โดยที่เป็นพารามิเตอร์ "รูปร่าง" σ

ความเท่าเทียมกันระหว่างพารามิเตอร์ scipy และพารามิเตอร์ R มีดังนี้:

loc - ไม่เท่ากันสิ่งนี้จะถูกลบออกจากข้อมูลของคุณเพื่อให้ 0 กลายเป็นค่าต่ำสุดของช่วงของข้อมูล

สเกล - , โดยที่คือค่าเฉลี่ยของบันทึกของตัวแปร (เมื่อทำการติดตั้งโดยทั่วไปคุณจะต้องใช้ค่าเฉลี่ยตัวอย่างของบันทึกข้อมูล) μexpμμ

รูปร่าง - ค่าเบี่ยงเบนมาตรฐานของบันทึกของการเปลี่ยนแปลง

ฉันเรียกว่าlognorm.pdf(x, 0.55, 0, numpy.exp(4.29))อาร์กิวเมนต์คือ (x, รูปร่าง, 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 นั่นเป็นคำอธิบายที่ฉันต้องการอย่างแน่นอนและผลลัพธ์คือการกระจายตัวของฉันอย่างแม่นยำ
Lillian Milagros Carrasquillo

8

การกระจาย lognormal ใน SciPy เหมาะสมกับกรอบทั่วไปสำหรับการแจกแจงทั้งหมดใน SciPy พวกเขาทั้งหมดมีขนาดและคำหลักที่ตั้ง (ซึ่งเริ่มต้นที่ 0 และ 1 หากไม่ได้ระบุไว้อย่างชัดเจน) สิ่งนี้ช่วยให้การกระจายทั้งหมดถูกเลื่อนและปรับขนาดจากสเปคที่ได้รับการทำให้เป็นมาตรฐานด้วยความหมายที่ชัดเจนต่อสถิติของการแจกแจง การแจกแจงมักจะมีพารามิเตอร์ "รูปร่าง" อย่างน้อยหนึ่งพารามิเตอร์เช่นกัน (แม้ว่าบางพารามิเตอร์เช่นการแจกแจงแบบปกติจะไม่ต้องการพารามิเตอร์เพิ่มเติมใด ๆ )

ในขณะที่วิธีการทั่วไปนี้รวบรวมการแจกแจงทั้งหมดไว้เป็นอย่างดีสำหรับ lognormal มันสามารถสร้างความสับสนได้เนื่องจากวิธีที่แพ็คเกจอื่นกำหนดพารามิเตอร์ ยังคงเป็นเรื่องง่ายมากที่จะจับคู่การแจกแจงล็อกนอปกติใด ๆ ถ้าคุณหมายถึง (ค่าเฉลี่ยของการแจกแจงต้นแบบ) และ sdlog (ค่าเบี่ยงเบนมาตรฐานของการแจกแจงต้นแบบ)

ขั้นแรกตรวจสอบให้แน่ใจว่าคุณตั้งค่าพารามิเตอร์ที่ตั้งเป็น 0 จากนั้นตั้งค่าพารามิเตอร์รูปร่างเป็นค่าของ sdlog สุดท้ายให้ตั้งค่าพารามิเตอร์สเกลเป็น math.exp (meanlog) ดังนั้น rv = scipy.stats.lognorm (0.5511349, scale = math.exp (4.2991610)) จะสร้างออบเจ็กต์การกระจายที่มี pdf ตรงกับเส้นโค้งที่สร้างขึ้น R ของคุณทุกประการ ในฐานะ x = numpy.linspace (0,180,1000); พล็อต (x, rv.pdf (x)) จะทำการตรวจสอบ

โดยทั่วไปการกระจาย SciPy lognormal เป็นลักษณะทั่วไปของการแจกแจงแบบปกติมาตรฐานซึ่งตรงกับมาตรฐานเมื่อตั้งค่าพารามิเตอร์ตำแหน่งเป็น 0

เมื่อทำการปรับข้อมูลให้เหมาะสมด้วยเมธอด. fit คุณยังสามารถใช้คีย์เวิร์ด, f0 ..fn, floc และ fshape เพื่อแก้ไขพารามิเตอร์รูปร่างตำแหน่งและ / หรือสเกลใด ๆ และพอดีกับตัวแปรอื่น ๆ สำหรับการแจกแจงแบบปกตินี้มีประโยชน์มากโดยปกติคุณจะรู้ว่าพารามิเตอร์ตำแหน่งควรได้รับการแก้ไขเป็น 0 ดังนั้น scipy.stats.lognorm.fit (ชุดข้อมูล, floc = 0) จะส่งกลับพารามิเตอร์ตำแหน่งเป็น 0 เสมอ พารามิเตอร์รูปร่างและขนาด


3

Fit Scipy lognormal คืนค่ารูปร่างตำแหน่งและสเกล ฉันวิ่งต่อไปนี้ในอาร์เรย์ของข้อมูลราคาตัวอย่าง:

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

สิ่งนี้ให้การประมาณการที่สมเหตุสมผล 1.0, 0.09, 0.86 และเมื่อคุณพล็อตคุณควรคำนึงถึงพารามิเตอร์ทั้งสาม

พารามิเตอร์รูปร่างคือการเบี่ยงเบนมาตรฐานของการแจกแจงปกติพื้นฐานและมาตราส่วนคือเลขชี้กำลังของค่าเฉลี่ยของค่าปกติ

หวังว่านี่จะช่วยได้


ขอบคุณสำหรับการตอบกลับ! เมื่อฉันมีค่าเหล่านี้ (loc, scale, shape) ฉันพยายามค้นหา pdf (x) สำหรับแต่ละ x ที่ฉันสนใจ (นี่คือค่าตั้งแต่ 0 ถึง 180, พิเศษ) scipy.stats.lognorm.pdf (i, loc, scale, shape) อย่างไรก็ตามการวางแผนสิ่งเหล่านี้ฉันได้พล็อตด้านบน
Lillian Milagros Carrasquillo

ตกลงฉันเห็นคุณพูดถึงรูปร่างและสเกลเท่านั้นนั่นคือสาเหตุที่ฉันพูดถึงว่ามีสามพารามิเตอร์ที่ส่งคืนโดยค่าเริ่มต้นจากพอดี () คุณยังบอกด้วยว่าคุณสับสนเกี่ยวกับความหมายของรูปร่างและขนาดของสเกลและฉันพยายามระบุว่า ฉันไม่เคยมี lognormal fit คืนค่าไร้สาระเหมือนในกรณีของคุณแม้ว่าพารามิเตอร์ตำแหน่งคืออะไร
upquark

เพิ่งอัพเดตคำถามเพื่อตอบคำถามนั้น ขอบคุณที่คิดถึงเรื่องนี้
Lillian Milagros Carrasquillo

โทร scipy.stats.lognorm.pdf (x, รูปร่าง, loc, scale) แทน scipy.stats.lognorm.pdf (i, loc, scale, รูปร่าง)
upquark

ขอบคุณ upquark ฉันทำเช่นนั้นด้วยผลลัพธ์ที่คล้ายกัน รูปร่างทั้งหมดของกราฟยังคงแตกต่างอย่างมากจากผลลัพธ์ที่คาดว่าจะให้ใน R. ดูเหมือนว่าการกระจายที่แตกต่างกันโดยสิ้นเชิงกว่ากราฟใน R จริงๆแล้ว
Lillian Milagros Carrasquillo

1

ดูเหมือนว่าการกระจายใน Scipy สำหรับ lognormal ไม่เหมือนกับใน R หรือโดยทั่วไปไม่เหมือนกับการแจกแจงที่ฉันคุ้นเคย John D Cook ได้สัมผัสกับสิ่งนี้: http://www.johndcook.com/blog/2010/02/03/statistical-distribution-in-scipy/ http://www.johndcook.com/distribution_scipy.html

อย่างไรก็ตามฉันไม่พบข้อสรุปเกี่ยวกับวิธีใช้ฟังก์ชันความหนาแน่น lognormal ใน Python หากใครต้องการที่จะเพิ่มไปนี้โปรดอย่าลังเล

วิธีแก้ปัญหาของฉันคือการใช้ lognormal pdf ประเมินที่ 0 ถึง 180 (พิเศษ) และใช้เป็นพจนานุกรมในสคริปต์หลาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.