5 votos

Muestras de puntos al azar dentro de celdas raster en R

Me gustaría generar un punto al azar para cada celda en el ráster, mientras que excluyendo NAs. Puedo usar sampleRandom sin embargo esto sólo me da el centroide de cada celda:

    library(raster)
    ras <- raster(nrows = 3, ncols = 3)
    v <- c(1,2,NA,4,NA,NA,7,8,9)
    ras[] <- v
    plot(ras)
    samp <- sampleRandom(ras, ncell(ras), xy = TRUE, sp=TRUE, na.rm = TRUE)
    points(samp)

Quiero generar puntos al azar para que luego se pueden extraer datos de varias otras capas raster, que no son necesariamente la misma resolución (y por lo tanto el centro de gravedad no es representante por eso prefiero tener un punto aleatorio).

Actualmente estoy haciendo uso de spsample en un spdf, pero prefiero no tener que utilizar archivos de forma que si es posible los requisitos de memoria son demasiado grandes.

5voto

cjstehno Puntos 131

Solo mueve al azar cada punto dentro de su celda. (Esta es una operación muy rápida.) En la imagen, los círculos grises marcan los centros originales, mientras que los puntos rojos muestran dónde se han movido.

Figura

 dx <- diff(c(xmin(ras), xmax(ras))) / ncol(ras) / 2 # Half of horizontal width
dy <- diff(c(ymin(ras), ymax(ras))) / nrow(ras) / 2 # Half of vertical width
xy <- coordinates(samp)                             # 2-column matrix of coordinates
n <- nrow(xy)                                       # Number of sample points
xy <- xy + c(runif(n, -dx, dx), runif(n, -dy, dy))  # Add random changes
points(xy, pch=21, bg="red")                        # Plot the new sample
 

1voto

Dan Puntos 16

Se está dando el centroide de cada celda porque se establece n a la misma como el número de celdas en el ráster (ncells(ras)), por lo tanto no se toma una muestra. Conjunto de n a algo razonable y usted obtendrá una muestra.

Su lógica de un total de la muestra, con lugares al azar en cada celda, parece una exageración, incluso cuando el muestreo de los rásteres de una resolución diferente. La palabra clave aquí es "ejemplo" no se necesita que la población de esta trama para actuar como una muestra de otra trama!

La única manera que se me ocurre para hacer esto en R es coaccionar a la trama a un SpatialGridDataFrame objeto, que representa a las celdas de la cuadrícula como polígonos y recorrer no NA de las células. Aunque, parece que usted ha intentado algo como esto ya. No me queda claro donde un shapefile entra en juego pero, yo creo que usted está atascado aquí.

0voto

Palesz Puntos 1288
 library(raster)
ras <- raster(nrows = 3, ncols = 3)
v <- c(1,2,NA,4,NA,NA,7,8,9)

ras[] <- v
plot(ras)
res(ras)

ras_fine <- raster(nrows = 9, ncols = 9) #finer resolution raster
ras<-resample(ras,ras_fine,method='ngb')
plot(ras)

samp_strat.rand<- sampleStratified(ras, 1, xy = TRUE, sp=TRUE, na.rm = TRUE)

plot(ras)
points(samp_strat.rand)
 

Esto se puede lograr usando resample () para cambiar la resolución de la capa de resolución gruesa a la capa más fina. Asegúrese de usar method = 'ngb' para el vecino más cercano. Luego realice una muestra aleatoria estratificada con 1 valor / estrato.

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