การคำนวณ / การจัดเก็บ CDF เชิงประจักษ์ที่มีประสิทธิภาพ

ฉันกำลังพยายามคำนวณการแจกแจงของตัวแปรสุ่มหลายตัวล่วงหน้า โดยเฉพาะอย่างยิ่ง ตัวแปรสุ่มเหล่านี้เป็นผลลัพธ์ของฟังก์ชันที่ประเมิน ณ ตำแหน่งต่างๆ ในจีโนม ดังนั้นค่าแต่ละค่าจะเรียงลำดับกัน 10^8 หรือ 10^9 ค่า ฟังก์ชั่นค่อนข้างราบรื่น ดังนั้นฉันไม่คิดว่าฉันจะสูญเสียความแม่นยำไปมากนักโดยการประเมินแค่ทุกๆ 2/10/100 เท่านั้น? พื้นฐานหรือประมาณนั้น แต่ไม่ว่าจะมีตัวอย่างจำนวนมากก็ตาม แผนของฉันคือการคำนวณตารางควอนไทล์ล่วงหน้า (อาจเป็นเปอร์เซ็นต์ไทล์) สำหรับแต่ละฟังก์ชัน และอ้างอิงตารางเหล่านี้ในการดำเนินการของโปรแกรมหลักของฉัน เพื่อหลีกเลี่ยงการคำนวณสถิติการกระจายเหล่านี้ในทุกการรัน

แต่ฉันไม่เห็นจริงๆ ว่าจะทำสิ่งนี้ได้อย่างไร: การจัดเก็บ การเรียงลำดับ และลดอาร์เรย์ 10^9 โฟลตนั้นเป็นไปไม่ได้จริงๆ แต่ฉันไม่สามารถคิดถึงวิธีอื่นที่ไม่สูญเสียข้อมูลเกี่ยวกับ การกระจาย. มีวิธีวัดควอนไทล์ของการกระจายตัวอย่างที่ไม่จำเป็นต้องจัดเก็บสิ่งทั้งหมดไว้ในหน่วยความจำหรือไม่?


person bnaul    schedule 23.11.2010    source แหล่งที่มา
comment
ฉันคิดว่าคุณอาจมีโชคมากขึ้นใน stats.stackexchange.com...   -  person Katriel    schedule 24.11.2010
comment
มีตัวแปรกี่ตัว? ฟังก์ชั่นมีความราบรื่นแค่ไหน? คุณสามารถใช้พหุนามท้องถิ่นเพื่อการแก้ไขได้หรือไม่?   -  person Dr. belisarius    schedule 24.11.2010
comment
ฟังก์ชันนี้แสดงถึงการวัดความใกล้ชิดกับยีนประเภทต่างๆ ที่แตกต่างกัน ฉันต้องการลองใช้หน่วยวัดต่างๆ แต่ทั้งหมดสามารถต้มให้เหลือระยะทาง (บางประเภท) ไปยังยีนที่ใกล้ที่สุดของประเภท X ได้ ดังนั้นค่าอาจมีลักษณะดังนี้: i.imgur.com/hVyIO.png ซ้ำแล้วซ้ำอีก (ด้วยความสูงและความยาวต่างกัน) และฮิสโตแกรมอาจมีรูปร่างใดก็ได้ ขึ้นอยู่กับว่ายีนที่เกี่ยวข้องอยู่ห่างกันแค่ไหน ชัดเจนกว่านี้เล็กน้อยไหม? เมื่อใช้ CDF ฉันสามารถคำนวณคะแนนสำหรับตำแหน่งและความน่าจะเป็นที่จะได้คะแนนสูงขนาดนี้โดยบังเอิญ   -  person bnaul    schedule 24.11.2010


คำตอบ (1)


ฉันเห็นด้วยกับความคิดเห็นของ @katriealex: ถามคนที่มีพื้นฐานทางสถิติที่แข็งแกร่ง

คุณสามารถประเมินค่าเบี่ยงเบนต่ำสุด/สูงสุด/ค่าเฉลี่ย/มาตรฐานได้อย่างง่ายดาย โดยไม่จำเป็นต้องจัดเก็บหน่วยความจำจำนวนมาก (หมายเหตุสำหรับค่าเฉลี่ย + ส่วนเบี่ยงเบนมาตรฐาน: ใช้เทคนิคของ Knuth:

delta = x - m[n-1]
m[n] = m[n-1] +  1/n * delta
S[n] = S[n-1] + (x[n] - m[n])*delta
mean = m[n]
std dev = sqrt(S[n]/n)

สิ่งนี้จะป้องกันคุณจากปัญหาจุดลอยตัวล้น/อันเดอร์โฟลว์ที่พบในการคำนวณ std dev แบบไร้เดียงสา เช่น การรับ S1 = ผลรวมของ x[k] และ S2 = ผลรวมของ x[k ]^2 และพยายามคำนวณค่าเบี่ยงเบนมาตรฐาน = sqrt(S2/N - S1^2/N^2) ดูเพิ่มเติมที่ Wikipedia)

อาจมีอัลกอริธึมเชิงสตรีมอื่น ๆ สำหรับการคำนวณช่วงเวลาที่มีลักษณะเฉพาะสูงกว่าของการแจกแจง แต่ฉันไม่รู้ว่ามันคืออะไร

หรืออีกทางหนึ่ง คุณยังสามารถใช้เทคนิคการสร้างฮิสโตแกรม โดยมีช่องข้อมูลเพียงพอที่จะระบุลักษณะการกระจายตัว

person Jason S    schedule 23.11.2010
comment
ค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานไม่เพียงพอสำหรับสิ่งนี้ แต่ฉันคิดว่า binning จะได้ผลดี โดยเฉพาะอย่างยิ่งเมื่อฉันมีอิสระที่จะปรับฟังก์ชันการให้คะแนนให้เป็นมาตรฐาน เพื่อจะได้รู้ขีดจำกัดบนและล่าง ขอบคุณสำหรับข้อเสนอแนะ - person bnaul; 24.11.2010