วิธีการมองหาหุบเขาในกราฟ?


10

ฉันกำลังตรวจสอบข้อมูลความครอบคลุมจีโนมซึ่งโดยทั่วไปเป็นจำนวนเต็ม (ไม่กี่ล้านค่า) ของจำนวนเต็มแต่ละคนบอกว่าตำแหน่งนี้ในจีโนมดีแค่ไหน (หรือ "ลึก")

ฉันต้องการค้นหา "หุบเขา" ในข้อมูลนี้นั่นคือภูมิภาคที่ "ต่ำ" อย่างมีนัยสำคัญมากกว่าสภาพแวดล้อมโดยรอบ

โปรดทราบว่าขนาดของหุบเขาที่ฉันกำลังมองหาอาจมีตั้งแต่ 50 ฐานไปจนถึงสองสามพันแห่ง

คุณอยากจะแนะนำกระบวนทัศน์ประเภทใดในการค้นหาหุบเขาเหล่านั้น

UPDATE

ตัวอย่างกราฟิกสำหรับข้อมูล: ข้อความแสดงแทน ข้อความแสดงแทน

อัพเดท 2

การกำหนดว่าหุบเขาคืออะไรแน่นอนว่าเป็นหนึ่งในคำถามที่ฉันต้องดิ้นรน นี่คือสิ่งที่ชัดเจนสำหรับฉัน: ข้อความแสดงแทน ข้อความแสดงแทน

แต่มีบางสถานการณ์ที่ซับซ้อนมากขึ้น โดยทั่วไปมีหลักเกณฑ์ 3 ข้อที่ฉันพิจารณา: 1. ความครอบคลุม (โดยเฉลี่ย? สูงสุด) ในหน้าต่างที่เกี่ยวข้องกับค่าเฉลี่ยทั่วโลก 2. ความครอบคลุม (... ) ในหน้าต่างที่เกี่ยวกับบริเวณโดยรอบ 3. วิธีการที่มีขนาดใหญ่เป็นหน้าต่าง: หากฉันเห็นความคุ้มครองที่ต่ำมากสำหรับช่วงสั้น ๆ เป็นที่น่าสนใจถ้าฉันเห็นความคุ้มครองที่ต่ำมากสำหรับช่วงยาวก็ยังน่าสนใจถ้าฉันเห็นความคุ้มครองต่ำอย่างอ่อนโยนสำหรับช่วงสั้นก็ไม่น่าสนใจจริงๆ แต่ถ้าฉันเห็นการครอบคลุมที่ต่ำอย่างอ่อนโยนเป็นเวลานาน - มันคือ .. ดังนั้นมันจึงเป็นการรวมกันของความยาวของ sapn และความครอบคลุม ยิ่งฉันปล่อยให้ความคุ้มครองสูงเท่าไหร่และยิ่งคิดว่าเป็นหุบเขา

ขอบคุณ

เดฟ


คุณสามารถให้ตัวอย่างข้อมูลขนาดเล็กได้หรือไม่
เชน

@Shane ดูการอัปเดต
David B

@ David ขอบคุณ เนื่องจากคำตอบทั้งสองบ่งบอกว่าสามารถใช้การวิเคราะห์อนุกรมเวลาได้ที่นี่เนื่องจากคุณสั่งการสังเกตการณ์
เชน

นี่เป็นคำตอบที่ตอบยากโดยไม่รู้ว่าคุณกำลังมองหาอะไร คุณสามารถวงกลมจุดในแปลงที่คุณต้องการจับ? คุณคิดว่า "หุบเขา" คืออะไร? มันต้องไปได้แค่ไหนและคุณต้องการกลับมาเท่าไหร่ มันยากที่จะกำหนดวิธีการแก้ปัญหาโดยไม่ทราบคำถามเช่นเกณฑ์และเช่น
Falmarri

@ Shane ♦ขอบคุณ เนื่องจากฉันไม่มีประสบการณ์กับการวิเคราะห์อนุกรมเวลาคุณสามารถปล่อยให้ตัวชี้บางตัวของฉันควรเริ่มต้นที่ไหน
David B

คำตอบ:


5

คุณสามารถใช้วิธีมอนติคาร์โลได้เช่นใช้ค่าเฉลี่ยเคลื่อนที่ของข้อมูลของคุณ

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

ในข้อมูลของคุณจะมีค่าเฉลี่ยต่ำกว่าดังนั้นตอนนี้คุณต้องค้นหา "เกณฑ์" เพื่อกำหนด "ต่ำ"

ในการทำเช่นนั้นคุณสุ่มสลับค่าข้อมูลของคุณ (เช่นใช้sample()) และคำนวณค่าเฉลี่ยเคลื่อนที่สำหรับข้อมูลที่สลับเปลี่ยนของคุณ

ทำซ้ำข้อความสุดท้ายนี้ด้วยจำนวนครั้งที่สมเหตุสมผล (> 5,000) และเก็บค่าเฉลี่ยทั้งหมดของการทดลองเหล่านี้ โดยพื้นฐานแล้วคุณจะต้องมีเมทริกซ์ที่มี 5,000 เส้นต่อการทดลองแต่ละอันจะมีค่าเฉลี่ยเคลื่อนที่สำหรับการทดลองนั้น

ณ จุดนี้สำหรับแต่ละคอลัมน์คุณเลือกควอไทล์ 5% (หรือ 1% หรืออะไรก็ได้ที่คุณต้องการ) นั่นคือค่าภายใต้ซึ่งอยู่เพียง 5% ของวิธีการของข้อมูลแบบสุ่ม

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

แน่นอนว่าอย่าลืมว่าไม่ใช่หรือวิธีการทางคณิตศาสตร์อื่นใดที่สามารถบ่งบอกถึงความสำคัญทางชีววิทยาของคุณได้แม้ว่าฉันจะแน่ใจว่าคุณทราบดีอยู่แล้ว

แก้ไข - ตัวอย่าง

require(ares) # for the ma (moving average) function

# Some data with peaks and throughs 
values <- cos(0.12 * 1:100) + 0.3 * rnorm(100) 
plot(values, t="l")

# Calculate the moving average with a window of 10 points 
mov.avg <- ma(values, 1, 10, FALSE)

numSwaps <- 1000    
mov.avg.swp <- matrix(0, nrow=numSwaps, ncol=length(mov.avg))

# The swapping may take a while, so we display a progress bar 
prog <- txtProgressBar(0, numSwaps, style=3)

for (i in 1:numSwaps)
{
# Swap the data
val.swp <- sample(values)
# Calculate the moving average
mov.avg.swp[i,] <- ma(val.swp, 1, 10, FALSE)
setTxtProgressBar(prog, i)
}

# Now find the 1% and 5% quantiles for each column
limits.1 <- apply(mov.avg.swp, 2, quantile, 0.01, na.rm=T)
limits.5 <- apply(mov.avg.swp, 2, quantile, 0.05, na.rm=T)

# Plot the limits
points(limits.5, t="l", col="orange", lwd=2)
points(limits.1, t="l", col="red", lwd=2)

เพียงแค่นี้ก็จะช่วยให้คุณหากราฟิกภูมิภาค which(values>limits.5)แต่คุณสามารถค้นหาได้อย่างง่ายดายโดยใช้บางอย่างในสายของ


เห็นได้ชัดว่าคุณสามารถใช้วิธีการเดียวกันโดยใช้อย่างอื่นที่ไม่ใช่ค่าเฉลี่ยเคลื่อนที่นี่เป็นเพียงการให้ความคิด
โก้

+1 ขอบคุณมากนิโก้ ให้ฉันดูว่าฉันทำให้คุณถูกต้อง: ในตอนท้ายนี่เป็นเหมือนการตั้งค่าขีด จำกัด สากลและกำหนดจุดใด ๆ ที่มีค่า <ขีด จำกัด เป็นส่วนหนึ่งของหุบเขา การสุ่มตัวอย่าง ฯลฯ ใช้เพื่อรับการวัดที่มีความหมาย (quantile) เพื่อกำหนดเกณฑ์ ทำไมเราไม่สามารถใช้เกณฑ์เดียวสำหรับคะแนนทั้งหมดได้ฉันหมายถึงถ้าเราทำแบบจำลองมากพอเราจะได้เส้นตรง (อ่านและสีเหลือง) นอกจากนี้แก้ไขให้ฉันด้วยถ้าฉันเข้าใจผิด แต่สิ่งนี้ไม่ได้คำนึงถึงสภาพแวดล้อมโดยรอบ แต่ตรวจสอบค่าสัมบูรณ์ของแต่ละจุด
David B

@David B: แน่นอนคุณสามารถใช้ threshold สากลและนั่นอาจจะช่วยคุณประหยัดเวลาในการคำนวณ ฉันเดาว่าการเลือกอะไรประมาณ 1/3 ของค่าเฉลี่ยทั่วโลกอาจเป็นการเริ่ม กระบวนการสลับนี้อาจมีประโยชน์มากขึ้นถ้าคุณใช้สถิติอื่นนอกเหนือจากค่าเฉลี่ยเคลื่อนที่ส่วนใหญ่จะให้แนวคิด อย่างไรก็ตามค่าเฉลี่ยเคลื่อนที่จะคำนึงถึงสภาพแวดล้อมโดยรอบในตัวอย่างจะคำนึงถึงหน้าต่าง 10 คะแนน
โก้

4

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


@cxr ขอบคุณสำหรับคำตอบของคุณ ฉันมีดูที่surveillanceและDCluster แต่คุณจะกรุณาเป็นที่เฉพาะเจาะจงมากขึ้นอีกนิด? พวกเขามีทั้งแพ็คเกจที่ค่อนข้างใหญ่และเป้าหมายดูเหมือนจะค่อนข้างเฉพาะ ฉันไม่แน่ใจว่าจะเริ่มจากตรงไหน
David B

2

มีหลายทางเลือกสำหรับการนี้มี แต่คนดีที่หนึ่ง: คุณสามารถใช้msExtremaฟังก์ชั่นในแพคเกจmsProcess

แก้ไข:

ในการวิเคราะห์ประสิทธิภาพทางการเงินการวิเคราะห์ประเภทนี้มักจะดำเนินการโดยใช้แนวคิด "ดรอดาวน์" PerformanceAnalyticsแพคเกจมีบางฟังก์ชันที่มีประโยชน์ที่จะหาหุบเขาเหล่านี้ คุณสามารถใช้อัลกอริทึมแบบเดียวกันได้ที่นี่หากคุณปฏิบัติตามการสังเกตของคุณเป็นอนุกรมเวลา

นี่คือตัวอย่างของวิธีที่คุณสามารถนำข้อมูลนี้ไปใช้กับข้อมูลของคุณ (ซึ่ง "วันที่" ไม่เกี่ยวข้อง แต่เพิ่งใช้สำหรับการสั่งซื้อ) แต่องค์ประกอบแรกในzooวัตถุจะเป็นข้อมูลของคุณ:

library(PerformanceAnalytics)
x <- zoo(cumsum(rnorm(50)), as.Date(1:50))
findDrawdowns(x)
table.Drawdowns(x)
chart.Drawdown(x)

ขอบคุณ Shane แต่นี่ดูเหมือนจะเป็นจุดต่ำสุดในท้องถิ่น (หรือสูงสุด) - คือจุดเดียวในภูมิภาค ข้อมูลของฉัน (เป็นข้อมูลทางชีวภาพใด ๆ ) ไม่มีเสียง> ฉันไม่สนใจจุดตัวเองอย่างแท้จริง แต่เกี่ยวกับพื้นที่ขนาดใหญ่ที่ต่ำ
David B

หากคุณมีคะแนนสูงสุดและต่ำสุดในพื้นที่คุณสามารถคำนวณความแตกต่างได้อย่างง่ายดาย ดังนั้นคุณต้องการที่จะรู้ว่าอินสแตนซ์เมื่อความแตกต่างทั้งขนาดใหญ่และใน "ระยะเวลา"? นี่เป็นข้อมูลอนุกรมเวลาหรือไม่
เชน

@ David บางทีคุณสามารถใช้ฟังก์ชันนี้ซ้ำ ๆ ได้ ใช้ฟังก์ชั่นเพื่อระบุขั้นต่ำ ปล่อยจุดนั้นและจุดรอบข้าง (พูดจุด x ภายในระดับความอดทน) คุณสามารถเลือกระดับความอดทน (เช่น + - 10 นับ) ซึ่งจะกำหนดพื้นที่ราบสำหรับการสมัครของคุณ ค้นหา minima ใหม่บนชุดข้อมูลใหม่ มันจะใช้ได้ไหม

@ เชนการเปรียบเทียบที่นึกได้คือหุบเขาในเขตภูเขา ฉันคิดว่าเป้าหมายคือการระบุหุบเขาทั้งหมดและปัญหาก็คือหุบเขาบางแห่งนั้น 'ลึก' และบางแห่งก็เป็น 'น้ำตื้น' ที่สัมพันธ์กับภูเขา

@Shane มันไม่ใช่ซีรีย์เวลาพวกมันประสานงานกับจีโนม (โครโมโซม)
David B

2

แพคเกจบางส่วนของBioconductor (เช่นShortRead , Biostrings , BSgenome , IRanges , genomeIntervals ) เสนอสิ่งอำนวยความสะดวกสำหรับจัดการกับตำแหน่งจีโนมหรือเวกเตอร์ที่ครอบคลุมเช่นChIP-seqและระบุภูมิภาคที่ได้รับการเสริม สำหรับคำตอบอื่น ๆ ฉันยอมรับว่าวิธีการใด ๆ ที่อาศัยการสังเกตที่สั่งไว้กับตัวกรองตามเกณฑ์บางอย่างจะอนุญาตให้แยกสัญญาณต่ำภายในแบนด์วิดท์ที่เฉพาะเจาะจง

บางทีคุณสามารถดูวิธีการที่ใช้เพื่อระบุสิ่งที่เรียกว่า "Islands"

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K และ Peng, W (2009) วิธีการจัดกลุ่มเพื่อระบุตัวตนของโดเมนอุดมจากการปรับเปลี่ยนสโตนข้อมูลชิป Seq ชีวสารสนเทศศาสตร์, 25 (15) , 2495-2501

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