Wie kann man elegant den Bereich einer Hystereseschleife bestimmen (Innen- / Außenproblem)?


8

Ich habe zwei Parameter gemessen (gelöster organischer Kohlenstoff DOC = y und Entladung = x). Wenn diese beiden Variablen gegeneinander aufgetragen werden, erhalten wir eine Hystereseschleife (siehe Codebeispiel und Bild).

Zur weiteren Analyse möchte ich nun den Bereich dieser hysteretischen Schleife bestimmen. Ich fand heraus, dass dies mit der Monte-Carlo-Dartmethode möglich ist. Diese Methode besagt, dass die Fläche eines unbekannten Gebiets proportional zur Fläche eines bekannten Rechtecks ​​multipliziert mit den Treffern im Innenfeld (der Schleife) ist.

Mein Problem ist nun, wie man das Innen- / Außenproblem mit R löst. Wie kann ich ein Rechteck mit einem bekannten Bereich zeichnen und wie kann ich die zufälligen Treffer innerhalb und außerhalb der Hystereseschleife übertreffen?

Bitte beachten Sie, dass ich für jede andere Methode offen bin ...

Ich googelte und durchsuchte verschiedene statistische Websites, konnte aber keine Antwort finden. Jede direkte Hilfe oder Verknüpfung mit anderen Websites / Posts wird sehr geschätzt.

Meine Hystereseschleife

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")

Antworten:


6

Eine ganz andere Möglichkeit wäre, die Fläche Ihres Polygons direkt zu berechnen:

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

Dies ergibt 0,606.


+1. Darüber hinaus sind Bereiche (im Gegensatz zu beispielsweise Längen) gegenüber unabhängigen Fehlern in den Scheitelpunktkoordinaten bemerkenswert robust. Beachten Sie, dass diese Lösung nicht viel über das Polygon annimmt. insbesondere respektiert es seinen (offensichtlichen) Mangel an Konvexität.
whuber

1

Eine Möglichkeit wäre folgende: Es sieht für mich so aus, als ob die Hystereseschleife konvex sein sollte, oder? Man könnte also Punkte generieren und für jeden Punkt testen, ob er Teil der konvexen Hülle der Vereinigung Ihres Datensatzes und des zufälligen Punkts ist - wenn ja, liegt er außerhalb des ursprünglichen Datensatzes. Um die Dinge zu beschleunigen, können wir mit einer Teilmenge des ursprünglichen Datensatzes arbeiten, nämlich den Punkten, aus denen sich die konvexe Hülle selbst zusammensetzt.

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

konvexer Rumpf

Natürlich würde die R-Methode meine forSchleife nicht verwenden , aber das ist leicht zu verstehen und nicht zu langsam. Ich bekomme eine geschätzte Fläche von 0,703.

EDIT: Dies hängt natürlich von der vermuteten Konvexität der Beziehung ab. Zum Beispiel scheint es unten rechts einen nicht konvexen Teil zu geben. Im Prinzip könnten wir die Fläche einer solchen Fläche auf die gleiche Weise nach Monte-Carlo schätzen und diese von der ursprünglichen Flächenschätzung abziehen.


Es wäre viel schneller und genauer, nur das Polygon zu rastern und seine Fläche durch Zählen der darin enthaltenen Zellen zu schätzen.
whuber
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.