Déterminer si les arbres dans les lacunes forestières sont regroupés à l'aide de R?

14

L'ensemble de données ci-joint montre environ 6 000 gaules dans environ 50 lacunes forestières de taille variable. Je voudrais savoir comment ces jeunes poussent dans leurs lacunes respectives (c.-à-d. Regroupées, aléatoires, dispersées). Comme vous le savez, une approche traditionnelle serait d'exécuter Global Moran's I.Toutefois, les agrégations d'arbres dans des agrégations de lacunes semblent être une utilisation inappropriée de Moran's I.J'ai exécuté des statistiques de test avec Moran's I en utilisant une distance de seuil de 50 mètres, ce qui a produit des résultats absurdes (c.-à-d. valeur p = 0,0000000 ...). L'interaction entre les agrégations d'écarts produit probablement ces résultats. J'ai envisagé de créer un script pour parcourir les lacunes individuelles de la canopée et déterminer le regroupement au sein de chaque lacune, bien que l'affichage de ces résultats au public soit problématique.

Quelle est la meilleure approche pour quantifier le clustering au sein des clusters?

entrez la description de l'image ici

Aaron
la source
1
Aaron, vous dites que vous avez essayé d'exécuter le Moran's I, souhaitez-vous mesurer la façon dont l' attribut d' un jeune arbre se compare aux attributs des jeunes arbres voisins (c'est-à-dire que vous traitez avec un motif de points marqué )? Le titre semble impliquer que vous vous intéressez uniquement à l' emplacement des jeunes arbres les uns par rapport aux autres et non à leurs attributs.
MannyG
@MannyG Oui, je souhaite seulement déterminer si les jeunes arbres sont groupés par rapport à l'emplacement d'autres jeunes arbres dans un espace forestier donné. Il n'y a qu'une seule espèce d'intérêt et la taille des jeunes arbres n'est pas intéressante.
Aaron

Réponses:

7

Vous n'avez pas un champ aléatoire uniforme, donc tenter d'analyser toutes vos données à la fois violera les hypothèses de toute statistique que vous choisissez de jeter sur le problème. Il n'est pas clair dans votre message si vos données sont un processus ponctuel marqué (c'est-à-dire le diamètre ou la hauteur associés à chaque emplacement d'arbre). Si ces données ne représentent pas un processus ponctuel marqué, je n'ai aucune idée de la façon dont vous avez appliqué un Moran's-I. Si les données ne représentent que des emplacements spatiaux, je recommanderais d'utiliser un Ripley's-K avec la transformation Besag-L pour normaliser l'attente nulle à zéro. Cela permet une évaluation multi-échelles du clustering. Si vos données ont une valeur associée, votre meilleure option est un Moran's-I local (LISA). Je le regarderais en fait avec les deux statistiques. Quel que soit votre choix, vous devrez toujours parcourir chaque site pour produire des résultats valides. Voici un exemple de code R pour une simulation Monte Carlo du Ripley's-K / Besag's-L en utilisant le jeu de données intégré de redwood sapling. Il devrait être assez simple de le modifier pour parcourir vos sites et produire un graphique pour chacun d'eux.

# 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
la source
1
Mais vous ne pouvez pas simplement utiliser la coque convexe comme fenêtre pour votre motif de points! Souvenez-vous que la fenêtre est la zone dans laquelle opère le motif qui produit les points. Vous savez a priori que les arbres ne poussent que dans ces régions définies, et vous devez configurer votre fenêtre pour refléter cela. Vous pouvez atténuer cela en définissant la plage de K (r) sur quelque chose de très petit, de l'ordre de 0,3x la taille de vos clairières, mais vous obtiendrez des résultats biaisés en raison du manque de corrections d'effet de bord. Jeffrey utilise la taille de toute la zone d'étude pour définir son rmax.
Spacedman
1
Dans mon exemple, Oui, j'utilise toute la région. C'est exactement pourquoi j'ai recommandé de parcourir chaque site d'échantillonnage (écart). Chaque fois que vous sous-ensemble à une zone d'échantillonnage spécifique, vous réexécutez l'analyse. Vous ne pouvez pas traiter toute la zone d'étude comme votre champ aléatoire car vous n'avez pas d'échantillonnage continu. N'ayant que des lacunes échantillonnées, vous disposez en effet de tracés indépendants. La fonction Kest que j'appelle, par défaut, utilise une correction de bord "frontière". D'autres options de correction des bords sont disponibles. Je dirais que votre unité expérimentale est l'écart de la canopée et doit être analysée en tant que telle.
Jeffrey Evans
1
En y réfléchissant un peu plus. Vous devriez vraiment utiliser des polygones qui représentent chaque espace comme fenêtre. Si vous sous-définissez votre problème pour refléter l'unité expérimentale, alors le CSR et K seront biaisés car la zone ne reflète pas la taille réelle de l'espace de la canopée. C'est un problème dans mes recommandations et celles de @ Spacedman.
Jeffrey Evans
2
Notez que mon exemple étendu n'utilisait qu'une grille grossière car c'était un moyen assez simple de créer quelque chose avec à peu près la bonne structure. Votre masque devrait ressembler à une carte de vos zones forestières ouvertes. C'est techniquement faux d'essayer de définir le masque à partir des données!
Spacedman
1
@Spacedman. J'aime votre approche et elle est certainement efficace. Ma préoccupation particulière est que les lacunes de la canopée soient l'unité expérimentale. Dans votre approche, si deux lacunes sont proximales, la bande passante pourrait vraisemblablement inclure des observations provenant de différentes unités d'échantillonnage. De plus, la statistique résultante ne devrait pas refléter le «pool» d'unités expérimentales, mais devrait être représentative de chaque unité et inférence sur le processus spatial tirée de modèles communs à travers les unités expérimentales. S'il est traité globalement, il représente un processus d'intensité non stationnaire qui viole les hypothèses statistiques.
Jeffrey Evans
4

Ce que vous avez est un motif de points avec une fenêtre qui est un certain nombre de petites régions polygonales déconnectées.

Vous devriez pouvoir utiliser l'un des tests package:spatstatde CSR tant que vous le nourrissez avec une fenêtre correcte. Il peut s'agir d'un certain nombre d'ensembles de paires (x, y) définissant chaque effacement ou d'une matrice binaire de (0,1) valeurs sur l'espace.

Définissons d'abord quelque chose qui ressemble un peu à vos données:

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)

et laisse supposer que nos clairières sont des cellules carrées qui se trouvent être les suivantes:

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)

Nous pouvons donc tracer la fonction K de ces points dans cette fenêtre. Nous nous attendons à ce que ce soit non-CSR parce que les points semblent regroupés dans les cellules. Remarquez que je dois changer la plage de distances pour qu'elle soit petite - de l'ordre de la taille des cellules - sinon la fonction K est évaluée sur des distances de la taille de l'ensemble du motif.

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

Si nous générons des points CSR dans les mêmes cellules, nous pouvons comparer les tracés de la fonction K. Celui-ci devrait ressembler davantage à la RSE:

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

motifs à deux points dans des fenêtres inégales

Vous ne pouvez pas vraiment voir les points regroupés dans les cellules du premier motif, mais si vous le tracez seul dans une fenêtre graphique, c'est clair. Les points du deuxième motif sont uniformes dans les cellules (et n'existent pas dans la région noire) et la fonction K est clairement différente de Kpois(r)la fonction K CSR pour les données en cluster et similaire pour les données uniformes.

Spacedman
la source
2

En plus du post d'Andy:

Ce que vous voulez calculer est une mesure de l'homogénéité spatiale (ergo l'hypothèse: "Vos points sont-ils groupés?") Comme la fonction L et K de Ripley .

Cet article de blog explique assez bien le mode d'emploi de R. Sur la base du code décrit, je voudrais d'abord étiqueter chaque cluster de votre ensemble de données, puis calculer en boucle pour chaque cluster l'enveloppe critique via le K de Ripley

Courlis
la source
J'ai actuellement supprimé ma réponse. Une brève analyse a suggéré que l'identification opportuniste des parcelles sur la base des moyennes K biaisait les statistiques locales pour qu'elles soient plus groupées que ce qui serait suggéré par hasard. Cette réponse s'applique toujours cependant +1, (juste la création des fenêtres à partir des données est plus problématique que ma réponse d'origine ne le suggère).
Andy W