2 votos

dismo::randomPoints genera puntos NA con máscara de pila rasterizada

Estoy utilizando la función randomPoints del paquete dismo en R para generar puntos aleatorios a partir de una pila raster. La documentación de la función randomPoints dice:

"Los puntos se muestrean (sin reemplazo) de las celdas que no son 'NA' en la 'máscara' de rasterización".

Muestro con éxito puntos aleatorios de mi pila de tramas rs que consta de 9 capas rasterizadas, y poner los puntos en un marco de datos para facilitar su manejo.

bg <- as.data.frame(randomPoints(mask = rs, n = 5000))
length(bg[,1])
[1] 5000

Todos los puntos generados son válidos:

sum(is.na(bg))
[1] 0

Para comprobar si alguno de estos puntos es NA en la pila de trama de la máscara, extraigo la pila de trama sobre los puntos:

ext <- extract(rs, bg)
dim(ext)
[1] 5000   9

Ahora compruebo si hay alguna NA. No debería haberlos, porque la función randomPoints debería excluir las celdas de la trama de la máscara que son NA. Pero aún así:

sum(is.na(ext))
[1] 2303

Cuando miro a través del ext veo que los NA parecen estar dispersos de forma bastante aleatoria en la pila de trama. No es una capa de trama en particular la que tiene todos los NA, y los puntos que son NA en una capa no son necesariamente NA en las otras. Entiendo que tal vez los valores no NA en mis capas de trama no coinciden perfectamente, pero de todos modos, estos deben haber sido excluidos por la función randomPoints, ¿no?

Para asegurarme, lo he vuelto a intentar, pero esta vez he seleccionado los puntos del fondo utilizando sólo una capa de la pila de trama como máscara.

bg1 <- as.data.frame(randomPoints(mask = rs[[1]], n = 5000))

Ahora, cuando compruebo si hay valores NA en las extracciones, efectivamente no hay valores NA para el ráster que se utilizó como máscara, pero sigue habiendo valores NA en algunos de los otros rásters para algunos de los puntos.

Parece que el hecho de pasar una pila de tramas a la función randomPoints, en lugar de una sola capa de tramas, no hace que la función excluya las celdas que son NA en cualquier de las capas de la pila.

¿Alguien sabe cuál es la mejor manera de resolver esto, si necesito tener puntos de fondo que no sean NA en ninguna de las capas de trama de la pila? Es posible que haya una ligera desalineación en mis capas rasterizadas (quizás en los límites entre tierra y agua), pero todas cubren la misma área y están, en su mayor parte, bien alineadas. Todo lo que se me ocurre es seleccionar puntos de fondo, extraerlos sobre los rásteres y luego excluir los que tienen al menos un valor NA, pero a.) esto es tedioso y b.) necesito asegurarme de que termino con un número determinado de puntos aleatorios; como el número de NA resultante es impredecible, no estoy seguro de cómo hacer que esto funcione.

1voto

David Davila Puntos 41

Desde el randomPoints archivo de ayuda:

"máscara": Objeto Raster*. Si el objeto tiene valores de celda, se excluyen las celdas con NA (de la primera capa del objeto si hay varias capas)"

Parece que sólo utilizará la primera capa de un rasterStack. Una solución es crear una única máscara de capa rasterizada que incluya la ubicación de todos los NA, tomando la media, por ejemplo.

#reprex
# create rasters
require(dismo)
rs1 <- raster(matrix(rnorm(100, 10), 10,10))
rs2 <- raster(matrix(rnorm(100, 5), 10,10))
rs3 <- raster(matrix(rnorm(100, 20), 10,10))

#add random NAs to bottom two layers
rs2[sample(100,10)] <- NA
rs3[sample(100,10)] <- NA

#stack
rs <- stack(rs1, rs2, rs3)

Yo uso mean que debería ser bastante rápido, dependiendo del tamaño de su trama.

#create raster layer with location of NAs
rs.with.na <- mean(rs)
sum(is.na(values(rs.with.na)))
[1] 20

# extract with new mask layer including NAs
bg <- as.data.frame(randomPoints(mask = rs.with.na, n = 50))
sum(is.na(bg))
[1] 0

ext <- extract(rs, bg)
dim(ext)
[1] 50  3

sum(is.na(ext))
[1] 0

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