Làm thế nào để xác định một cách tao nhã khu vực của một vòng trễ (vấn đề bên trong / bên ngoài)?


8

Tôi đã đo hai thông số (Carbon hữu cơ hòa tan DOC = y và xả = x). Khi hai biến này được vẽ với nhau, chúng ta sẽ có một vòng lặp trễ (xem ví dụ mã và hình ảnh).

Bây giờ, để phân tích sâu hơn, tôi muốn xác định khu vực của vòng lặp cuồng loạn này. Tôi đã tìm ra rằng điều này có thể được thực hiện bằng phương pháp phóng phi tiêu Monte Carlo. Phương pháp này nói rằng diện tích của một khu vực không xác định tỷ lệ với diện tích của một hình chữ nhật đã biết nhân với số lần truy cập trong trường bên trong (vòng lặp).

Vấn đề của tôi bây giờ là, làm thế nào để giải quyết vấn đề bên trong / bên ngoài bằng R. Làm cách nào tôi có thể vẽ một hình chữ nhật với một khu vực đã biết và làm thế nào tôi có thể vượt trội các lần truy cập ngẫu nhiên bên trong và bên ngoài vòng lặp cuồng loạn?

Xin lưu ý rằng tôi mở cho bất kỳ phương pháp nào khác ...

Tôi googled, và tìm kiếm các trang web thống kê khác nhau nhưng không thể tìm thấy câu trả lời. Bất kỳ trợ giúp trực tiếp hoặc liên kết đến các trang web / bài viết khác được đánh giá rất cao.

Vòng lặp trễ của tôi

Data <- read.table("http://dl.dropbox.com/u/2108381/DOC_Q_hystersis.txt", sep = ";",
               header = T)

head(Data)
plot(Data$Q, Data$DOC, type = "o", xlab = "Discharge (m3 s-1)", ylab = "DOC (mg C l-1)",
 main = "Hystersis loop of the C/Q relationship")

Câu trả lời:


6

Một cách hoàn toàn khác sẽ là tính trực tiếp diện tích đa giác của bạn:

library(geometry)
polyarea(x=Data$Q, y=Data$DOC)

Điều này mang lại 0,606.


+1. Ngoài ra, các khu vực (không giống như độ dài chẳng hạn) rất mạnh đối với các lỗi độc lập trong tọa độ đỉnh. Lưu ý rằng giải pháp này không giả định nhiều về đa giác; đặc biệt, nó tôn trọng sự thiếu lồi (biểu hiện) của nó.
whuber

1

Một khả năng sẽ là thế này: có vẻ như vòng lặp trễ phải lồi phải không? Vì vậy, người ta có thể tạo điểm và kiểm tra cho từng điểm xem đó có phải là một phần của vỏ lồi của liên kết tập dữ liệu của bạn và điểm ngẫu nhiên - nếu có, nó nằm ngoài tập dữ liệu gốc. Để tăng tốc mọi thứ, chúng ta có thể làm việc với một tập hợp con của tập dữ liệu gốc, cụ thể là các điểm bao gồm thân tàu lồi của nó.

Data.subset <- Data[chull(Data$Q, Data$DOC),c("Q","DOC")]

x.min <- min(Data.subset$Q)
x.max <- max(Data.subset$Q)
y.min <- min(Data.subset$DOC)
y.max <- max(Data.subset$DOC)

n.sims <- 1000
random.points <- data.frame(Q=runif(n=n.sims,x.min,x.max),
  DOC=runif(n=n.sims,y.min,y.max))
hit <- rep(NA,n.sims)
for ( ii in 1:n.sims ) {
  hit[ii] <- !((nrow(Data.subset)+1) %in%
    chull(c(Data.subset$Q,random.points$Q[ii]),
      c(Data.subset$DOC,random.points$DOC[ii])))
}

points(random.points$Q[hit],random.points$DOC[hit],pch=21,bg="black",cex=0.6)
points(random.points$Q[!hit],random.points$DOC[!hit],pch=21,bg="red",col="red",cex=0.6)

estimated.area <- (y.max-y.min)*(x.max-x.min)*sum(hit)/n.sims

thân tàu lồi

Tất nhiên, cách làm R sẽ không sử dụng forvòng lặp của tôi , nhưng điều này dễ hiểu và không quá chậm. Tôi có diện tích ước tính là 0,703.

EDIT: tất nhiên, điều này phụ thuộc vào sự lồi lõm của mối quan hệ. Ví dụ, dường như có một phần không lồi ở phía dưới bên phải. Về nguyên tắc, chúng ta có thể ước tính diện tích của một khu vực như vậy theo cách tương tự và trừ phần này khỏi ước tính diện tích ban đầu.


Sẽ nhanh hơn và chính xác hơn nhiều nếu chỉ raster đa giác và ước tính diện tích của nó bằng cách đếm các ô mà nó chứa.
whuber
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.