Làm thế nào để tìm các thung lũng trong một biểu đồ?


10

Tôi đang kiểm tra một số dữ liệu bao phủ bộ gen về cơ bản là một danh sách dài (vài triệu giá trị) của các số nguyên, mỗi số cho biết vị trí này (hoặc "sâu") trong bộ gen được bao phủ như thế nào.

Tôi muốn tìm "thung lũng" trong dữ liệu này, nghĩa là các khu vực "thấp hơn" đáng kể so với môi trường xung quanh của chúng.

Lưu ý rằng kích thước của các thung lũng tôi đang tìm kiếm có thể dao động từ 50 cơ sở đến vài nghìn.

Loại mô hình nào bạn muốn giới thiệu sử dụng để tìm các thung lũng đó?

CẬP NHẬT

Một số ví dụ đồ họa cho dữ liệu: văn bản thay thế văn bản thay thế

CẬP NHẬT 2

Xác định thung lũng là gì tất nhiên là một trong những câu hỏi tôi đang đấu tranh. Đây là những điều hiển nhiên đối với tôi: văn bản thay thế văn bản thay thế

nhưng có một số tình huống phức tạp hơn. Nói chung, có 3 tiêu chí tôi xem xét: 1. Độ bao phủ (trung bình? Tối đa?) Trong cửa sổ đối với mức trung bình toàn cầu. 2. Phạm vi (...) trong cửa sổ đối với xung quanh ngay lập tức. 3. Cửa sổ lớn bao nhiêu: nếu tôi thấy vùng phủ sóng rất thấp trong một khoảng ngắn thì thật thú vị, nếu tôi thấy vùng phủ sóng rất thấp trong một khoảng thời gian dài thì cũng thật thú vị, nếu tôi thấy vùng phủ sóng thấp cho một khoảng ngắn thì không thực sự thú vị , nhưng nếu tôi thấy phạm vi bảo hiểm thấp trong một khoảng thời gian dài - đó là .. Vì vậy, đó là sự kết hợp giữa chiều dài của nhựa cây và phạm vi bảo hiểm. Càng để lâu, tôi càng để vùng phủ sóng cao hơn và vẫn coi đó là một thung lũng.

Cảm ơn,

Dave


Bạn có thể cung cấp một mẫu dữ liệu nhỏ?
Shane

@Shane xem cập nhật
David B

@David Cảm ơn. Vì cả hai câu trả lời đều ngụ ý, phân tích chuỗi thời gian có thể được áp dụng ở đây vì bạn đã ra lệnh quan sát.
Shane

Đây là loại khó trả lời mà không biết chính xác những gì bạn đang tìm kiếm. Bạn có thể khoanh tròn các điểm trên các ô mà bạn đang muốn chụp không? Bạn nghĩ gì về một "thung lũng"? nó phải đi thấp đến mức nào và bạn đang muốn trở về cái gì? Thật khó để đưa ra một giải pháp mà không biết câu hỏi, tức là các ngưỡng và như vậy.
Falmarri

@ Shane ♦ Cảm ơn bạn. Vì tôi cũng không có kinh nghiệm về phân tích chuỗi thời gian, bạn có thể để lại một vài gợi ý về việc tôi nên bắt đầu từ đâu không?
David B

Câu trả lời:


5

Bạn có thể sử dụng một số cách tiếp cận Monte Carlo, ví dụ sử dụng trung bình di chuyển của dữ liệu của bạn.

Lấy trung bình di chuyển của dữ liệu, sử dụng cửa sổ có kích thước hợp lý (tôi đoán nó tùy thuộc vào bạn quyết định độ rộng).

Thông qua dữ liệu của bạn (tất nhiên) sẽ được đặc trưng bởi mức trung bình thấp hơn, vì vậy bây giờ bạn cần tìm một số "ngưỡng" để xác định "mức thấp".

Để làm điều đó, bạn trao đổi ngẫu nhiên các giá trị của dữ liệu của mình (ví dụ: sử dụng sample()) và tính toán lại trung bình di chuyển cho dữ liệu được hoán đổi của bạn.

Lặp lại đoạn cuối này với số lần hợp lý cao (> 5000) và lưu trữ tất cả mức trung bình của các thử nghiệm này. Vì vậy, về cơ bản, bạn sẽ có một ma trận với 5000 dòng, mỗi dòng cho mỗi thử nghiệm, mỗi dòng chứa trung bình di chuyển cho thử nghiệm đó.

Tại thời điểm này, mỗi cột bạn chọn định lượng 5% (hoặc 1% hoặc bất cứ thứ gì bạn muốn), đó là giá trị chỉ chiếm 5% phương tiện của dữ liệu ngẫu nhiên.

Bây giờ bạn có "giới hạn tin cậy" (tôi không chắc đó có phải là thuật ngữ thống kê chính xác không) để so sánh dữ liệu gốc của bạn với. Nếu bạn tìm thấy một phần dữ liệu của bạn thấp hơn giới hạn này thì bạn có thể gọi đó là thông qua.

Tất nhiên, lưu ý rằng không phải phương pháp toán học này cũng như bất kỳ phương pháp toán học nào khác có thể cung cấp cho bạn bất kỳ dấu hiệu nào về ý nghĩa sinh học, mặc dù tôi chắc chắn rằng bạn biết rõ về điều đó.

EDIT - một ví dụ

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)

Điều này sẽ chỉ cho phép bạn tìm đồ họa các vùng, nhưng bạn có thể dễ dàng tìm thấy chúng bằng cách sử dụng một cái gì đó trên các dòng của which(values>limits.5).


Rõ ràng bạn có thể áp dụng cách tiếp cận tương tự bằng cách sử dụng một cái gì đó khác với mức trung bình di chuyển, đây chỉ là để đưa ra một ý tưởng.
nico

+1 Cảm ơn bạn rất nhiều, nico. Hãy để tôi xem nếu tôi hiểu đúng về bạn: cuối cùng, điều này về cơ bản giống như đặt một số ngưỡng toàn cầu và xác định bất kỳ điểm nào có giá trị <ngưỡng là một phần của thung lũng. Việc lấy mẫu, vv chỉ được sử dụng để có được một số biện pháp có ý nghĩa (lượng tử) để đặt ngưỡng. Tại sao chúng ta không thể sử dụng một ngưỡng duy nhất cho toàn bộ các điểm, ý tôi là, nếu chúng ta thực hiện đủ các mô phỏng, chúng ta sẽ có được các đường thẳng (đọc và màu vàng). Ngoài ra, hãy sửa cho tôi nếu tôi nhầm, nhưng điều này không tính đến môi trường xung quanh mà kiểm tra giá trị tuyệt đối của từng điểm.
David B

@David B: tất nhiên, bạn có thể sử dụng ngưỡng toàn cầu và điều đó có thể sẽ giúp bạn tiết kiệm thời gian tính toán. Tôi đoán việc chọn một cái gì đó như 1/3 của ý nghĩa toàn cầu có thể là một sự khởi đầu. Quá trình hoán đổi này có thể hữu ích hơn nếu bạn sử dụng một số thống kê khác ngoài mức trung bình di chuyển, chủ yếu là để đưa ra một ý tưởng. Dù sao, trung bình di chuyển sẽ tính đến xung quanh, trong ví dụ, nó sẽ tính đến một cửa sổ 10 điểm.
nico

4

Tôi hoàn toàn không biết gì về những dữ liệu này, nhưng giả sử dữ liệu được sắp xếp (không đúng lúc, nhưng theo vị trí?) Thì việc sử dụng các phương pháp chuỗi thời gian là hợp lý. Có rất nhiều phương pháp để xác định các cụm thời gian trong dữ liệu. Nói chung, chúng được sử dụng để tìm giá trị cao nhưng có thể được sử dụng cho các giá trị thấp được nhóm lại với nhau. Tôi đang suy nghĩ ở đây về thống kê quét, thống kê tổng tích lũy (và các số liệu khác) được sử dụng để phát hiện dịch bệnh trong dữ liệu đếm. Ví dụ về các phương pháp này nằm trong gói giám sát và gói DCluster.


@cxr Cảm ơn phản hồi của bạn. Tôi có một cái nhìn surveillanceDCluster , nhưng bạn có thể vui lòng cụ thể hơn một chút không? Cả hai đều là gói tương đối lớn và mục tiêu của họ có vẻ khá cụ thể. Tôi không chắc bắt đầu từ đâu.
David B

2

Có nhiều lựa chọn cho việc này, nhưng một lựa chọn tốt: bạn có thể sử dụng msExtremachức năng trong msProcessgói .

Biên tập:

Trong phân tích hiệu suất tài chính, loại phân tích này thường được thực hiện bằng cách sử dụng khái niệm "giải ngân". Các PerformanceAnalyticsgói có một số chức năng hữu ích để tìm những thung lũng . Bạn có thể sử dụng cùng một thuật toán ở đây nếu bạn coi các quan sát của mình là một chuỗi thời gian.

Dưới đây là một số ví dụ về cách bạn có thể áp dụng điều này cho dữ liệu của mình (trong đó "ngày" không liên quan nhưng chỉ được sử dụng để đặt hàng), nhưng các yếu tố đầu tiên trong zoođối tượng sẽ là dữ liệu của bạn:

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

Cảm ơn Shane, nhưng điều này dường như tìm thấy cực tiểu địa phương (hoặc cực đại) - tức là một điểm duy nhất trong một khu vực. Dữ liệu của tôi (như bất kỳ dữ liệu sinh học nào) LÀ KHÔNG CÓ> Tôi thực sự không quan tâm đến điểm cực tiểu mà là về các vùng lớn hơn thấp.
David B

Nếu bạn có điểm tối đa và tối thiểu cục bộ, bạn có thể dễ dàng tính toán sự khác biệt. Vì vậy, bạn muốn biết các trường hợp khi sự khác biệt cả về độ lớn và "thời lượng"? Là dữ liệu chuỗi thời gian này?
Shane

@david Có lẽ, bạn có thể sử dụng chức năng này. Sử dụng hàm để xác định một cực tiểu. Thả điểm đó và các điểm xung quanh (giả sử điểm x trong một số mức dung sai). Bạn có thể chọn mức dung sai (ví dụ: + - 10 số) sẽ xác định vùng phẳng cho ứng dụng của bạn. Tìm một cực tiểu mới trên tập dữ liệu mới. Công việc vừa ý?

@shane Sự tương tự xuất hiện trong tâm trí là các thung lũng ở một vùng núi. Tôi nghĩ mục tiêu là xác định tất cả các thung lũng và vấn đề là một số thung lũng 'sâu hơn' và một số 'nông' so với các ngọn núi.

@Shane Đây không phải là chuỗi thời gian, chúng được phối hợp dọc theo bộ gen (nhiễm sắc thể).
David B

2

Một số gói của Bioconductor (ví dụ: ShortRead , Biostrings , BSgenome , IRanges , genomeInter đạn ) cung cấp các phương tiện để xử lý các vị trí bộ gen hoặc vectơ bảo hiểm, ví dụ cho ChIP-seq và xác định các vùng được làm giàu. Đối với các câu trả lời khác, tôi đồng ý rằng bất kỳ phương pháp nào dựa trên các quan sát có trật tự với một số bộ lọc dựa trên ngưỡng sẽ cho phép cách ly tín hiệu thấp trong một băng thông cụ thể.

Có lẽ bạn cũng có thể xem các phương pháp được sử dụng để xác định cái gọi là "đảo"

Zang, C, Schones, DE, Zeng, C, Cui, K, Zhao, K và Peng, W (2009). Một cách tiếp cận phân cụm để xác định các miền được làm giàu từ dữ liệu ChIP-Seq sửa đổi histone . Tin sinh học, 25 (15) , 1952-1958.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.