Determinare se gli alberi all'interno degli spazi forestali sono raggruppati usando R?


14

Il set di dati allegato mostra circa 6000 alberelli in circa 50 spazi forestali di dimensioni variabili. Sono interessato a sapere come questi alberelli stanno crescendo nei loro rispettivi vuoti (cioè raggruppati, casuali, dispersi). Come sapete, un approccio tradizionale sarebbe quello di eseguire il Global Moran's I. Tuttavia, aggregazioni di alberi all'interno di aggregazioni di spazi vuoti sembrano essere un uso inappropriato di Moran I. Ho eseguito alcune statistiche di test con Moran I usando una distanza di soglia di 50 metri, che ha prodotto risultati insensati (ovvero valore p = 0,0000000 ...). L'interazione tra le aggregazioni di gap sta probabilmente producendo questi risultati. Ho preso in considerazione la creazione di una sceneggiatura per colmare le lacune dei singoli baldacchini e determinare il clustering all'interno di ogni gap, sebbene la visualizzazione di questi risultati al pubblico sarebbe problematica.

Qual è l'approccio migliore per quantificare il clustering all'interno dei cluster?

inserisci qui la descrizione dell'immagine


1
Aaron, dici che hai provato a gestire l'Io di Moran, sei interessato a misurare il modo in cui l' attributo di un alberello si confronta con gli attributi degli alberelli vicini (cioè hai a che fare con uno schema di punti marcato )? Il titolo sembra implicare che sei interessato solo alla posizione degli alberelli l'uno rispetto all'altro e non ai loro attributi.
MannyG,

@MannyG Sì, mi interessa solo determinare se gli alberelli sono raggruppati in relazione alle posizioni di altri alberelli all'interno di un dato spazio nella foresta. C'è solo una specie di interesse e la dimensione degli alberelli non è di interesse.
Aaron

Risposte:


7

Non hai un campo casuale uniforme, quindi il tentativo di analizzare tutti i tuoi dati in una sola volta violerà i presupposti di qualsiasi statistica tu scelga di gettare il problema. Non è chiaro dal tuo post se i tuoi dati sono un processo punto contrassegnato (cioè diametro o altezza associati a ogni posizione dell'albero). Se questi dati non rappresentano un processo marcato, non ho idea di come hai applicato un Moran-I. Se i dati rappresentano solo posizioni spaziali, consiglierei di utilizzare un Ripley's-K con la trasformazione Besag-L per standardizzare l'aspettativa nulla a zero. Ciò consente una valutazione multiscala del clustering. Se i tuoi dati hanno un valore associato, la tua migliore opzione è un Moran's-I (LISA) locale. Vorrei davvero guardarlo con entrambe le statistiche. Indipendentemente dalla tua scelta, dovrai comunque passare in rassegna ogni singolo sito per produrre risultati validi. Ecco un esempio di codice R per una simulazione Monte Carlo di Ripley's-K / Besag's-L utilizzando il set di dati alberello della sequoia incorporato. Dovrebbe essere abbastanza semplice modificarlo per passare in rassegna i tuoi siti e produrre un grafico per ciascuno di essi.

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

1
Ma non puoi semplicemente usare lo scafo convesso come finestra per la sequenza di punti! Ricorda, la finestra è l'area in cui opera il modello che produce i punti. Sai a priori che gli alberi crescono solo in queste regioni fisse e devi impostare la tua finestra per riflettere ciò. Puoi mitigarlo impostando l'intervallo di K (r) su qualcosa di molto piccolo, dell'ordine delle dimensioni 0,3x delle tue radure, ma otterrai risultati distorti a causa della mancanza di correzioni dell'effetto bordo. Jeffrey sta usando le dimensioni dell'intera area di studio per definire il suo rmax.
Spacedman il

1
Nel mio esempio, Sì, sto usando l'intera regione. Con questo è esattamente il motivo per cui ho raccomandato di scorrere in loop ogni sito campione (gap). Ogni volta che si effettua un sottoinsieme in un'area campione specifica, si esegue nuovamente l'analisi. Non puoi trattare l'intera area di studio come il tuo campo casuale perché non hai un campionamento continuo. Avendo solo lacune campionate, in effetti hai trame indipendenti. La funzione Kest che sto chiamando, per impostazione predefinita, utilizza una correzione del bordo "border". Sono disponibili altre opzioni di correzione dei bordi. Direi che la tua unità sperimentale è il baldacchino e dovrebbe essere analizzato come tale.
Jeffrey Evans,

1
Nel pensarci un po 'di più. Dovresti davvero usare poligoni che rappresentano ogni spazio come finestra. Se si imposta il problema in modo da riflettere l'unità sperimentale, CSR e K saranno distorti perché l'area non riflette la dimensione del gap del baldacchino. Questo è un problema sia nei miei consigli che in quelli di @ Spacedman.
Jeffrey Evans,

2
Nota il mio esempio esteso ha usato solo una griglia grezza perché era un modo abbastanza semplice di creare qualcosa con approssimativamente la struttura giusta. La maschera dovrebbe apparire come una mappa delle aree forestali aperte. È tecnicamente sbagliato provare a definire la maschera dai dati!
Spacedman il

1
@Spacedman. Mi piace il tuo approccio ed è sicuramente efficiente. La mia preoccupazione specifica è che le lacune del baldacchino sono l'unità sperimentale. Nel tuo approccio, se due lacune sono prossimali, la larghezza di banda potrebbe plausibilmente includere osservazioni da unità di campionamento diverse. Inoltre, la statistica risultante non dovrebbe riflettere il "pool" di unità sperimentali, ma dovrebbe essere rappresentativo di ciascuna unità e inferenza sul processo spaziale disegnato da schemi comuni attraverso le unità sperimentali. Se trattato a livello globale, rappresenta un processo di intensità non stazionaria che viola le ipotesi statistiche.
Jeffrey Evans,

4

Quello che hai è un motivo a punti con una finestra che è un numero di piccole aree poligonali disconnesse.

Dovresti essere in grado di utilizzare uno qualsiasi dei test package:spatstatper CSR purché lo alimenti con una finestra corretta. Questo può essere un numero di insiemi di coppie (x, y) che definiscono ogni compensazione o una matrice binaria di valori (0,1) sullo spazio.

Per prima cosa definiamo qualcosa che assomigli un po 'ai tuoi dati:

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)

e facciamo finta che le nostre radure siano celle quadrate che sono solo queste:

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)

Quindi possiamo tracciare la funzione K di quei punti in quella finestra. Ci aspettiamo che ciò non sia CSR perché i punti sembrano raggruppati all'interno delle celle. Si noti che devo modificare l'intervallo di distanze in modo che siano piccole - dell'ordine delle dimensioni della cella - altrimenti la funzione K viene valutata su distanze della dimensione dell'intero modello.

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

Se generiamo alcuni punti CSR nelle stesse celle, possiamo confrontare i grafici delle funzioni K. Questo dovrebbe essere più simile alla CSR:

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

due punti in finestre irregolari

Non puoi davvero vedere i punti raggruppati nelle celle nel primo modello, ma se lo disegni da solo in una finestra grafica è chiaro. I punti nel secondo modello sono uniformi all'interno delle celle (e non esistono nella regione nera) e la funzione K è chiaramente diversa dalla Kpois(r)funzione CSR K per i dati raggruppati e simile per i dati uniformi.


2

Oltre al post di Andy:

Quello che vuoi calcolare è una misura dell'omogeneità spaziale (ergo l'ipotesi: "I tuoi punti sono raggruppati?") Come la funzione L e K di Ripley .

Questo post sul blog spiega come fare in R abbastanza bene. In base al codice descritto, prima etichetta ogni cluster nel set di dati e quindi calcola in un ciclo per ciascun cluster la busta critica attraverso K di Ripley


Al momento ho eliminato la mia risposta. Alcune brevi analisi hanno suggerito che l'identificazione opportunistica dei diagrammi basati su K-media ha distorto le statistiche locali per essere più raggruppate di quanto sarebbe suggerito per caso. Questa risposta è valida anche se +1, (solo la creazione delle finestre dai dati è più problematica di quanto la mia risposta originale suggerisca).
Andy W,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.