การหาฟังก์ชั่นความหนาแน่นในท้องถิ่นโดยใช้เส้นโค้ง


15

ฉันพยายามหาค่าสูงสุดในพื้นที่สำหรับฟังก์ชันความหนาแน่นของความน่าจะเป็น (พบได้โดยใช้densityวิธีของ R ) ฉันไม่สามารถใช้วิธี "ดูรอบ ๆ เพื่อนบ้าน" แบบง่าย ๆ (ที่จุดหนึ่งมองไปรอบ ๆ เพื่อดูว่าเป็นระดับสูงสุดในพื้นที่ที่เกี่ยวกับเพื่อนบ้าน) หรือไม่เนื่องจากมีข้อมูลจำนวนมาก นอกจากนี้ดูเหมือนว่ามีประสิทธิภาพและทั่วไปมากกว่าที่จะใช้การแก้ไข Spline แล้วค้นหารากของอนุพันธ์อันดับ 1 เมื่อเทียบกับการสร้าง "มองไปรอบ ๆ เพื่อนบ้าน" ด้วยการยอมรับข้อบกพร่องและพารามิเตอร์อื่น ๆ

ดังนั้นคำถามของฉัน:

  1. เมื่อพิจารณาจากฟังก์ชันsplinefunจะหาค่าสูงสุดในท้องถิ่นได้อย่างไร
  2. มีวิธีง่าย ๆ / เป็นมาตรฐานในการค้นหาอนุพันธ์ของฟังก์ชันที่ส่งคืนโดยใช้ splinefunหรือไม่?
  3. มีวิธีที่ดีกว่า / มาตรฐานในการหาค่าสูงสุดในท้องถิ่นของฟังก์ชันความหนาแน่นของความน่าจะเป็นหรือไม่?

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

ขอบคุณสำหรับความช่วยเหลือของคุณ!!


ฉันไม่ชัดเจนว่าทำไมข้อมูลจำนวนมากเป็นปัญหาสำหรับวิธีการ 'ดูรอบ ๆ เพื่อนบ้าน' density()ไม่ได้ประเมินความหนาแน่นสำหรับทุกตัวเลขมันประมาณความหนาแน่นที่nค่าโดยที่nเป็นพารามิเตอร์ที่ผู้ใช้ระบุด้วยค่าเริ่มต้นn = 512
onestop

ของฉันสำหรับนี่คือ 2 ^ 15 และดูเหมือนว่าข้อมูลมีความแปรปรวนจำนวนมากในระดับจุดต่อจุด ฉันพยายามเขียนตัวค้นหาสูงสุด / นาทีโดยใช้บางสิ่งที่คล้ายกับวิธีการละแวกใกล้เคียง (ผ่านmsExtrema {msProcess}) และสามารถระบุจำนวนสูงสุดได้เพียงไม่กี่อย่างเท่านั้นโดยไม่เล่นเลยด้วยการตั้งค่าความอดทน
aaronlevin

2
ดูรหัสสำหรับmsExtremaมันเป็นเสื้อคลุมง่าย ๆpeaksจากsplus2Rแพคเกจซึ่งคุณจะดีกว่าการใช้โดยตรงหากคุณต้องการ maxima ท้องถิ่นและไม่ใช่ minima ท้องถิ่น ฉันไม่เห็นสาเหตุที่ใช้ค่าเริ่มต้นspan=3จะไม่พบ maxima ท้องถิ่นทั้งหมด และ 2 ^ 15 = 32768 ไม่ควรใหญ่พอสำหรับประสิทธิภาพที่จะต้องกังวลมาก
onestop

ฟังก์ชันที่ส่งคืนโดย splinefun มีอาร์กิวเมนต์ "อนุพันธ์" ที่เป็น 0 โดยค่าเริ่มต้น ชุดอนุพันธ์ = 1 สำหรับอนุพันธ์แรก
Cyan

1
อืมpeaksดูเหมือนจะเป็นบั๊กกี้: มันเรียกmax.colด้วยการตั้งค่าเริ่มต้นties.method = "random"ซึ่งไม่เพียง แต่ทำลายความสัมพันธ์ที่สุ่ม แต่ยังตั้งค่าความอดทนสัมพัทธ์ของ 1e-5 สำหรับการประกาศเสมอ อดีตกำลังสับสนอย่างหลังไม่ใช่สิ่งที่คุณต้องการที่นี่ peaks()ยังใช้strictพารามิเตอร์ที่มีเอกสารไม่ดีและเมื่อดูที่รหัสของฟังก์ชั่นก็ไม่ทำอะไรเลย อ๊ะความสุขของห้องสมุดซอฟต์แวร์ที่ผู้ใช้มอบให้! คุณอาจสามารถแก้ไขได้อย่างที่คุณบอกว่าคุณไม่ใหม่กับการเขียนโปรแกรม
onestop

คำตอบ:


14

สิ่งที่คุณต้องการทำเรียกว่าการตรวจจับขั้นสูงสุดในเคมี มีวิธีการต่าง ๆ ที่คุณสามารถใช้ได้ ฉันสาธิตวิธีการง่ายๆที่นี่

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

จากการแก้ปัญหาทั้งหมดนี้ได้ผลดีที่สุด 1. คำถามติดตามผล: มีวิธีที่จะเปลี่ยนความอดทนกับจุดเปลี่ยนหรือไม่? พบ Peaks และหุบเขาจำนวนมากในส่วนหางยาวของฟังก์ชัน Density 2. คำถามติดตาม # 2: วิธีที่ดีในการพิจารณาความอดทนคืออะไร
aaronlevin

โฆษณา 1. ฉันไม่คิดอย่างนั้น มันมีไว้สำหรับการทดสอบแบบแผนของอนุกรมเวลาดังนั้นฟังก์ชั่นไม่ต้องการ คุณสามารถลองทดสอบความเกี่ยวข้อง / ความสำคัญของตัวเองสูงสุด ตัวอย่างเช่นคุณสามารถทำการทดสอบกับเพื่อนบ้าน (ที่คุณสามารถตัดสินใจได้ว่าเพื่อนบ้านควรใหญ่ขนาดไหน) หรือคุณสามารถมองหาฟังก์ชั่นที่ซับซ้อนยิ่งขึ้นในแพ็คเกจ R สำหรับการประเมินข้อมูลจากสเปคโตรมิเตอร์ (มวล) หรือวิธีเคมีวิเคราะห์อื่น ๆ
Roland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.