15 votos

Determinar si los árboles dentro de los huecos del bosque están agrupados utilizando R?

El conjunto de datos adjunto muestra aproximadamente 6000 árboles jóvenes en unos 50 huecos forestales de tamaño variable. Me interesa saber cómo crecen estos arbolitos dentro de sus respectivos huecos (es decir, agrupados, al azar, dispersos). Sin embargo, las agregaciones de árboles dentro de las agregaciones de huecos parecen ser un uso inadecuado de la I de Moran. He realizado algunas pruebas estadísticas con la I de Moran utilizando una distancia umbral de 50 metros, que ha producido resultados sin sentido (es decir, valor p = 0,0000000...). Es probable que la interacción entre las agregaciones de las brechas esté produciendo estos resultados. He considerado la posibilidad de crear una secuencia de comandos para recorrer las brechas individuales de las copas de los árboles y determinar la agrupación dentro de cada brecha, aunque mostrar estos resultados al público sería problemático.

¿Cuál es el mejor enfoque para cuantificar la agrupación dentro de los clusters?

enter image description here

1 votos

Aaron, dices que has probado a ejecutar la I de Moran, ¿estás interesado en medir cómo un arbolito atributo se compara con los atributos de los arbolitos vecinos (es decir, ¿se trata de un marcado patrón de puntos)? El título parece dar a entender que está seulement interesado en el ubicación de los árboles jóvenes entre sí y no sus atributos.

0 votos

@MannyG Sí, sólo me interesa determinar si los arbolitos están agrupados en relación con las ubicaciones de otros arbolitos dentro de cualquier hueco del bosque. Sólo hay una especie de interés y el tamaño de los árboles jóvenes no son de interés.

7voto

Dan Puntos 16

No tienes un campo aleatorio uniforme, por lo que intentar analizar todos los datos a la vez violará las suposiciones de cualquier estadística que elijas lanzar al problema. No está claro en su mensaje si sus datos son un proceso de puntos marcados (es decir, el diámetro o la altura asociada a cada ubicación del árbol). Si estos datos no representan un proceso de puntos marcados, no tengo ni idea de cómo has aplicado una I de Moran. Si los datos sólo representan ubicaciones espaciales, recomendaría utilizar una K de Ripley con la transformación Besag-L para normalizar la expectativa nula en cero. Esto permite una evaluación multiescalar de la agrupación. Si sus datos tienen un valor asociado, entonces su mejor opción es un Moran's-I local (LISA). De hecho, yo lo miraría con ambos estadísticos. Independientemente de su elección, usted todavía tendrá que hacer un bucle a través de cada sitio individual para producir resultados válidos. Aquí hay un ejemplo de código R para una simulación Monte Carlo de Ripley's-K/Besag's-L usando el conjunto de datos de árboles jóvenes de secuoya. Debería ser bastante sencillo modificar esto para hacer un bucle a través de sus sitios y producir un gráfico para cada uno.

# 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 votos

Pero no puedes usar el casco convexo como ventana para tu patrón de puntos. Recuerda que la ventana es la zona en la que opera el patrón que produce los puntos. Usted sabe a priori que los árboles sólo crecen en estas regiones establecidas, y usted tiene que establecer su ventana para reflejar eso. Se puede mitigar esto estableciendo el rango de K(r) en algo muy pequeño, del orden de 0,3 veces el tamaño de sus claros, pero obtendrá resultados sesgados debido a la falta de correcciones del efecto de borde. Jeffrey utiliza el tamaño de toda el área de estudio para definir su rmax.

1 votos

En mi ejemplo, sí estoy utilizando toda la región. Por esto es exactamente por lo que recomendé hacer un bucle a través de cada sitio de la muestra (brecha). Cada vez que se subestime una zona de muestreo específica, se volverá a realizar el análisis. No puede tratar toda la zona de estudio como su campo aleatorio porque no tiene un muestreo continuo. Al haber muestreado sólo los huecos, tiene, en efecto, parcelas independientes. La función Kest que estoy llamando, por defecto, utiliza una corrección de bordes "de frontera". Hay otras opciones de corrección de bordes disponibles. Yo diría que su unidad experimental es la brecha del dosel y debería ser analizada como tal.

1 votos

Pensando un poco más en esto. En realidad deberías usar polígonos que representen cada hueco como tu ventana. Si se subconjunta su problema para reflejar la unidad experimental, entonces el CSR y K serán sesgados porque el área no refleja el tamaño real de la brecha del dosel. Este es un problema tanto en mis recomendaciones como en las de @Spacedman.

4voto

Jay Bazuzi Puntos 194

Lo que tienes es un patrón de puntos con una ventana que es un número de pequeñas regiones poligonales desconectadas.

Debería poder utilizar cualquiera de las pruebas en package:spatstat para el RSC siempre que lo alimente con una ventana correcta. Esta puede ser un número de conjuntos de pares (x,y) que definen cada claro o una matriz binaria de valores (0,1) sobre el espacio.

Primero vamos a definir algo que se parezca un poco a tus datos:

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)

y hagamos de cuenta que nuestros claros son celdas cuadradas que resultan ser esto:

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)

Así que podemos trazar la función K de esos puntos en esa ventana. Esperamos que esto no sea CSR porque los puntos parecen estar agrupados dentro de las celdas. Obsérvese que tengo que cambiar el rango de distancias para que sea pequeño -del orden del tamaño de la celda-, de lo contrario la función K se evalúa sobre distancias del tamaño de todo el patrón.

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

Si generamos algunos puntos CSR en las mismas celdas, podemos comparar los gráficos de la función K. Esta debería ser más parecida a la RSE:

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

two point patterns in patchy windows

En realidad, no se pueden ver los puntos agrupados en las celdas del primer patrón, pero si se traza por sí solo en una ventana de gráficos queda claro. Los puntos del segundo patrón son uniformes dentro de las celdas (y no existen en la región negra) y la función K es claramente diferente de Kpois(r) la función K de CSR para los datos agrupados y similar para los datos uniformes.

2voto

Rihan Meij Puntos 362

Además del post de Andy:

Lo que se quiere calcular es una medida de homogeneidad espacial (ergo la hipótesis: "¿Están sus puntos agrupados?") como Función L y K de Ripley .

Este entrada del blog explica bastante bien cómo hacerlo en R. Basándome en el código descrito, primero etiquetaría cada cluster en tu conjunto de datos y luego calcularía en un bucle para cada cluster la envolvente crítica a través de la K de Ripley

0 votos

Actualmente he borrado mi respuesta. Un breve análisis sugirió que la identificación oportunista de las parcelas basada en K-means sesgó las estadísticas locales para que estuvieran más agrupadas de lo que sugeriría el azar. Esta respuesta todavía se aplica aunque +1, (sólo la fabricación de las ventanas de los datos es más problemático que mi respuesta original sugeriría).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X