Bestimmen, ob Bäume innerhalb von Waldlücken mithilfe von R?

14

Der angehängte Datensatz zeigt ca. 6000 Setzlinge in ca. 50 unterschiedlich großen Waldlücken. Ich bin daran interessiert zu erfahren, wie diese Setzlinge innerhalb ihrer jeweiligen Lücken wachsen (dh gebündelt, zufällig, verteilt). Wie Sie wissen, würde ein traditioneller Ansatz darin bestehen, Global Morans I zu betreiben. Aggregationen von Bäumen innerhalb von Aggregationen von Lücken scheinen jedoch eine unangemessene Verwendung von Morans I zu sein. was zu unsinnigen Ergebnissen führte (dh p-Wert = 0,0000000 ...). Die Wechselwirkung zwischen den Lückenaggregationen führt wahrscheinlich zu diesen Ergebnissen. Ich habe darüber nachgedacht, ein Skript zu erstellen, um einzelne Lücken in der Überdachung zu durchlaufen und die Clusterbildung in jeder Lücke zu bestimmen, obwohl es problematisch wäre, diese Ergebnisse der Öffentlichkeit anzuzeigen.

Was ist der beste Ansatz zur Quantifizierung der Clusterbildung innerhalb von Clustern?

Bildbeschreibung hier eingeben

Aaron
quelle
1
Aaron, Sie sagen, Sie haben versucht, Morans I auszuführen. Möchten Sie messen, wie das Attribut eines Schösslings mit dem der benachbarten Schösslinge verglichen wird (dh, Sie haben es mit einem markierten Punktmuster zu tun )? Der Titel scheint zu implizieren, dass Sie sich nur für die Lage der Setzlinge im Verhältnis zueinander interessieren und nicht für deren Eigenschaften.
MannyG
@MannyG Ja, ich möchte nur feststellen, ob die Setzlinge relativ zu den Standorten anderer Setzlinge in einer bestimmten Waldlücke gruppiert sind. Es gibt nur eine Art von Interesse und die Größe der Setzlinge ist nicht von Interesse.
Aaron

Antworten:

7

Sie haben kein einheitliches Zufallsfeld. Wenn Sie also versuchen, alle Ihre Daten auf einmal zu analysieren, verstoßen Sie gegen die Annahmen einer Statistik, mit der Sie das Problem lösen. Aus Ihrem Beitrag geht nicht hervor, ob es sich bei Ihren Daten um einen markierten Punktprozess handelt (dh Durchmesser oder Höhe, die mit jedem Baumstandort verknüpft sind). Wenn diese Daten keinen markierten Punktprozess darstellen, habe ich keine Ahnung, wie Sie ein Moran's-I angewendet haben. Wenn die Daten nur räumliche Orte darstellen, würde ich die Verwendung eines Ripley's-K mit der Besag-L-Transformation empfehlen, um die Nullerwartung auf Null zu standardisieren. Dies ermöglicht eine mehrskalige Beurteilung der Clusterbildung. Wenn Ihren Daten ein Wert zugeordnet ist, ist die beste Option ein lokales Moran's-I (LISA). Ich würde es mir mit beiden Statistiken ansehen. Unabhängig von Ihrer Wahl, Sie müssen weiterhin jede einzelne Site durchlaufen, um gültige Ergebnisse zu erzielen. Hier ist ein Beispiel eines R-Codes für eine Monte-Carlo-Simulation von Ripley's-K / Besag's-L unter Verwendung des eingebauten Redwood-Setzling-Datensatzes. Es sollte ziemlich einfach sein, dies zu ändern, um eine Schleife durch Ihre Websites zu erstellen und für jede ein Diagramm zu erstellen.

# ADD REQUIRED PACKAGES
require(sp)
require(spatstat)
options(scipen=5)

# USE REDWOOD SAPLING DATASET
spp <- SpatialPoints(coords(redwood))

###################################################
###### START BESAG'S-L MONTE CARLO  ANALYSUS ######
###################################################
# CREATE CONVEX HULL FOR ANALYSIS WINDOW                       
W=ripras(coordinates(spp)) 

# COERCE TO spatstat ppp OBJECT
spp.ppp=as.ppp(coordinates(spp), W)                     
  plot(spp.ppp) 

# ESTIMATE BANDWIDTH
area <- area.owin(W)
lambda <- spp.ppp$n/area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
bw <- seq(0, rmax, by=rmax/10)  

# CALCULATE PERMUTED CROSS-K AND PLOT RESULTS       
Lenv <- envelope(spp.ppp, fun="Kest", r=bw, i="1", j="2", nsim=99, nrank=5, 
                 transform=expression(sqrt(./pi)-bw), global=TRUE)            
plot(Lenv, main="Besag's-L", xlab="Distance", ylab="L(r)", legend=F, col=c("white","black","grey","grey"), 
    lty=c(1,2,2,2), lwd=c(2,1,1,1) )
     polygon( c(Lenv$r, rev(Lenv$r)), c(Lenv$lo, rev(Lenv$hi)), col="lightgrey", border="grey")
       lines(supsmu(bw, Lenv$obs), lwd=2)
       lines(bw, Lenv$theo, lwd=1, lty=2)
         legend("topleft", c(expression(hat(L)(r)), "Simulation Envelope", "theo"), pch=c(-32,22),
                col=c("black","grey"), lty=c(1,0,2), lwd=c(2,0,2), pt.bg=c("white","grey"))
Jeffrey Evans
quelle
1
Aber Sie können nicht einfach den konvexen Rumpf als Fenster für Ihr Punktmuster verwenden! Denken Sie daran, dass das Fenster der Bereich ist, in dem das Muster arbeitet, das die Punkte erzeugt. Sie wissen von vornherein, dass die Bäume nur in diesen festgelegten Regionen wachsen, und Sie müssen Ihr Fenster so einstellen, dass es dies widerspiegelt. Sie können dies abmildern, indem Sie den Bereich von K (r) auf einen sehr kleinen Wert in der Größenordnung des 0,3-fachen Ihrer Clearings festlegen. Aufgrund des Fehlens von Korrekturen für Kanteneffekte erhalten Sie jedoch voreingenommene Ergebnisse. Jeffrey verwendet die Größe des gesamten Untersuchungsgebiets, um seinen Rmax zu definieren.
Spacedman
1
In meinem Beispiel Ja, ich verwende die gesamte Region. Genau aus diesem Grund habe ich empfohlen, jede Sample-Site (Lücke) zu durchlaufen. Jedes Mal, wenn Sie eine Untermenge eines bestimmten Probenbereichs festlegen, führen Sie die Analyse erneut durch. Sie können nicht das gesamte Untersuchungsgebiet als Zufallsfeld behandeln, da Sie keine kontinuierliche Stichprobe haben. Wenn Sie nur Lücken abgetastet haben, haben Sie praktisch unabhängige Diagramme. Die von mir aufgerufene Kest-Funktion verwendet standardmäßig eine Randkorrektur. Es stehen noch weitere Optionen zur Kantenkorrektur zur Verfügung. Ich würde argumentieren, dass Ihre experimentelle Einheit die Überdachungslücke ist und als solche analysiert werden sollte.
Jeffrey Evans
1
Wenn ich ein bisschen mehr darüber nachdenke. Sie sollten wirklich Polygone verwenden, die jede Lücke als Ihr Fenster darstellen. Wenn Sie Ihr Problem so unterteilen, dass es die experimentelle Einheit widerspiegelt, werden CSR und K voreingenommen, da der Bereich nicht die tatsächliche Spaltgröße der Überdachung widerspiegelt. Dies ist ein Problem in den Empfehlungen von my und @ Spacedman.
Jeffrey Evans
2
Beachten Sie, dass in meinem erweiterten Beispiel nur ein grobes Raster verwendet wurde, da dies eine ziemlich einfache Methode war, um etwas mit ungefähr der richtigen Struktur zu erstellen. Ihre Maske sollte wie eine Karte Ihrer offenen Waldgebiete aussehen. Es ist technisch falsch, die Maske aus den Daten zu definieren!
Spacedman
1
@Spacedman. Ich mag Ihren Ansatz und es ist auf jeden Fall effizient. Mein spezielles Anliegen ist, dass die Überdachungslücken die experimentelle Einheit sind. Wenn in Ihrem Ansatz zwei Lücken nahe beieinander liegen, könnte die Bandbreite plausibel Beobachtungen von verschiedenen Stichprobeneinheiten enthalten. Darüber hinaus sollte die resultierende Statistik nicht den "Pool" von experimentellen Einheiten widerspiegeln, sondern für jede Einheit repräsentativ sein und Rückschlüsse auf den räumlichen Prozess ziehen, der aus gemeinsamen Mustern über die experimentellen Einheiten gezogen wird. Bei globaler Behandlung handelt es sich um einen nichtstationären Intensitätsprozess, der statistische Annahmen verletzt.
Jeffrey Evans
4

Was Sie haben, ist ein Punktmuster mit einem Fenster, das aus mehreren kleinen nicht verbundenen polygonalen Bereichen besteht.

Sie sollten in der Lage sein, jeden der package:spatstatCSR- Tests zu verwenden, solange Sie ihn mit einem korrekten Fenster füttern. Dies kann entweder eine Anzahl von Sätzen von (x, y) Paaren sein, die jede Löschung definieren, oder eine binäre Matrix von (0,1) Werten über den Raum.

Definieren wir zunächst etwas, das Ihren Daten ähnelt:

set.seed(310366)
nclust <- function(x0, y0, radius, n) {
               return(runifdisc(n, radius, centre=c(x0, y0)))
             }
c = rPoissonCluster(15, 0.04, nclust, radius=0.02, n=5)
plot(c)

und lassen Sie uns so tun, als wären unsere Lichtungen quadratische Zellen, die einfach so sind:

m = matrix(0,20,20)
m[1+20*cbind(c$x,c$y)]=1
imask = owin(c(0,1),c(0,1),mask = t(m)==1 )
pp1 = ppp(x=c$x,y=c$y,window=imask)
plot(pp1)

So können wir die K-Funktion dieser Punkte in diesem Fenster zeichnen. Wir erwarten, dass dies keine CSR ist, da die Punkte in den Zellen gebündelt zu sein scheinen. Beachten Sie, dass ich den Entfernungsbereich so ändern muss, dass er klein ist - in der Größenordnung der Zellengröße - sonst wird die K-Funktion über Entfernungen der Größe des gesamten Musters ausgewertet.

plot(Kest(pp1,r=seq(0,.02,len=20)))

Wenn wir einige CSR-Punkte in denselben Zellen erzeugen, können wir die K-Funktionsdiagramme vergleichen. Dieser sollte eher CSR sein:

ppSim = rpoispp(73/(24/400),win=imask)
plot(ppSim)
plot(Kest(ppSim,r=seq(0,.02,len=20)))

Zwei Punktmuster in lückenhaften Fenstern

Sie können die in den Zellen gebündelten Punkte im ersten Muster nicht wirklich sehen, aber wenn Sie sie einzeln in einem Grafikfenster zeichnen, ist sie klar. Die Punkte im zweiten Muster sind innerhalb der Zellen einheitlich (und existieren nicht im schwarzen Bereich) und die K-Funktion unterscheidet sich deutlich von Kpois(r)der CSR-K-Funktion für die gruppierten Daten und ähnlich für die einheitlichen Daten.

Raumfahrer
quelle
2

Zusätzlich zu Andys Beitrag:

Was Sie berechnen möchten, ist ein Maß für die räumliche Homogenität (ergo die Hypothese: "Sind Ihre Punkte gebündelt?") Wie die L- und K-Funktion von Ripley .

Dieser Blog-Beitrag erklärt die Vorgehensweise in R ziemlich gut. Basierend auf dem beschriebenen Code würde ich zuerst jeden Cluster in Ihrem Datensatz kennzeichnen und dann in einer Schleife für jeden Cluster die kritische Hüllkurve durch Ripleys K berechnen

Brachvogel
quelle
Ich habe momentan meine Antwort gelöscht. Einige kurze Analysen deuteten darauf hin, dass eine opportunistische Identifizierung der Diagramme auf der Grundlage von K-Mitteln die lokalen Statistiken dahingehend verzerrte, dass sie stärker gruppiert waren, als dies zufällig nahegelegt würde. Diese Antwort gilt immer noch für +1 (nur das Erstellen der Fenster aus den Daten ist problematischer, als meine ursprüngliche Antwort vermuten lässt).
Andy W