2013-01-14 28 views
7

Tôi có một khối dữ liệu lỗ (10.000 - 50.000 giá trị cho mỗi chuỗi phép đo) và tôi muốn tự động xác định maxima/minima cục bộ trong ước lượng mật độ của phân phối của các giá trị này. Trong thực tế, tôi giả định rằng thường có hai đỉnh, cách nhau bởi một hố, và tôi muốn tìm hố đó tách hai đỉnh từ nhau để tách dữ liệu thành hai phần để xử lý tiếp. Nếu có thể, tôi cũng muốn biết vị trí của các đỉnh.Tìm cực đại/cực tiểu cục bộ trong R

Khi ước lượng mật độ có thể chứa những thay đổi cục bộ rất nhỏ, tôi muốn có khả năng điều chỉnh "độ nhạy". Điều tốt nhất tôi có thể tìm thấy cho đến nay là giải pháp này của @Tommy: https://stackoverflow.com/a/6836924/1003358 Dưới đây là một ví dụ:

library(ggplot2) 

d <- density(faithful$eruptions, bw = "sj") 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(faithful, aes(eruptions)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

Identifying maxima in faithful dataset

Bây giờ, dữ liệu của tôi là ồn ào hơn nhiều:

d <- density(my.df$Values, bw = "sj") 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

First attempt to identify maxima in my dataset

Cố gắng điều chỉnh các thông số (lưu ý rằng hai đỉnh "không mong muốn" ở đuôi đã được tìm thấy):

d <- density(my.df$Values, bw="nrd", adjust=1.2) 
loc.max <- d$x[localMaxima(d$y)] 

ggplot(my.df, aes(Values)) + geom_density(adjust=1/2) + 
    geom_vline(x=loc.max, col="red") + 
    xlab("Measured values") 

Second attempt to detect peaks in my dataset

Vì vậy, câu hỏi là:

1) Làm thế nào để tự động xác định đỉnh thực trong một tập dữ liệu ồn ào như vậy? 2) Làm thế nào để tìm ra các hố phân tách những đỉnh đó?

+0

Làm thế nào để bạn xác định "đỉnh cao thực"? –

+0

@SvenHohenstein Đó là một câu hỏi hay. Tôi đang gặp khó khăn trong việc nắm bắt khái niệm này một cách toán học. Nên có một cửa sổ cụ thể xung quanh đỉnh trong đó đỉnh này là giá trị lớn nhất. Ngoài ra, một cắt cho kích thước đỉnh tối thiểu (có thể liên quan đến trung vị) có thể giúp đỡ. Nếu tôi biết dữ liệu của tôi là hai mặt, hai đỉnh cao nhất với một cách hợp lý (tôi thừa nhận, điều này là một lần nữa mơ hồ) cửa sổ lớn nên kết quả. Nếu tôi không biết số lượng các đỉnh trước, có thể là một mức giảm cho giá trị tối đa. giá trị của một hố phân tách các đỉnh núi cùng với một cắt cho min. giá trị của một đỉnh sẽ giúp gì? – AnjaM

+1

Phân tích dữ liệu phổ (sắc ký hoặc trắc quang) thường có vấn đề này, vì vậy bạn có thể thấy nếu bao gồm "spectr *" trong tìm kiếm của bạn để nhận dạng cao điểm. @cbeleites vừa là người tham gia SO vừa tham gia vào phát triển gói R đang hoạt động dọc theo các dòng đó. –

Trả lời

1

Yêu thích của tôi là pastecs::turnpoints. Nhưng bạn chính xác rằng bạn sẽ phải thực hiện một số tính năng lọc chủ quan để phân biệt tiếng ồn có gai từ các đỉnh cao thực sự. Một cách để thực hiện điều này là yêu cầu dữ liệu thô hoặc dữ liệu được tách ở trên ngưỡng nào đó cho N giá trị liên tiếp.

+0

Cảm ơn đề xuất của bạn. 'pastecs :: turnpoints' dường như không cung cấp khả năng xác định một khoảng/cửa sổ, vì vậy một lần nữa tôi phải đối mặt với cùng một vấn đề như với cách tiếp cận ở trên. Tôi không chắc chắn cách triển khai đề xuất của bạn để xác định ngưỡng như vậy. Ngoài ra, theo như tôi hiểu, nó không phân biệt giữa các đỉnh và hố, phải không? – AnjaM

+0

Ồ, xin lỗi, tôi vừa mới nhận thấy rằng bạn có thể phân biệt các đỉnh từ các hố với phương thức 'extract()'. Tôi chắc chắn sẽ xem xét kỹ hơn chức năng này. Nhưng tôi vẫn tự hỏi cách tốt nhất để lọc các giá trị là gì. – AnjaM

Các vấn đề liên quan