Tenemos el hallazgo a esta dificultad, al menos eso deseamos. Si tienes inquietudes puedes dejarlo en el apartado de comentarios, para nosotros será un gusto responderte
Solución:
El paquete raster tiene una función para hacer esto por usted en una línea. Usar layerize()
:
library(raster)
# make an example raster
r <- raster(nrow=100, ncol=100)
r[] <- round(runif(ncell(r),1,4),0)
# create presence/absence rasters, stored in a RasterBrick.
r_dummy <- layerize(r)
plot(r_dummy[[1]])
¿Está seguro de que la codificación ficticia en STAN requiere parámetros binomiales separados para la estimación? En aras de la eficiencia, la codificación ficticia para, por ejemplo, la vegetación nativa debería ser un factor de [1,2,3,4] y no cuatro parámetros separados. Si este es, de hecho, el caso, es trivial hacer esto en R.
library(raster)
r <- raster(nrow=100, ncol=100)
r[] <- round(runif(ncell(r),1,4),0)
r1=r; r2=r; r3=r; r4=r # make copies of original to modify
r1[] <- ifelse(r[] == 1, 1, 0)
r2[] <- ifelse(r[] == 2, 1, 0)
r3[] <- ifelse(r[] == 3, 1, 0)
r4[] <- ifelse(r[] == 4, 1, 0)
plot(stack(r1,r2,r3,r4))
Puede extender esto para procesar todos sus rásteres en un bucle for.
Primero, como ejemplo, cree una pila de ráster con 5 capas y diferentes valores únicos que van del 1 al 5. Esto debería emular su problema ya que cada ráster tiene una cantidad diferente de niveles. Estos datos simulados, por supuesto, representan una pila ráster o un objeto de ladrillo de sus covariables nominales que deben convertirse a binomial. Sus datos ráster se pueden leer en esta clase de objeto usando el raster::stack
o raster::brick
funciones
r <- stack(brick(array(runif(100 * 100 * 5), dim=c(100, 100, 5))))
for(i in 1:nlayers(r)) r[[i]][] <- round(runif(ncell(r),
sample(1:2,1),sample(3:5,1) ),0)
names(r) <- paste0("parameter",1:5)
Ahora podemos definir un bucle doble que observe los valores únicos de cada ráster y luego los recorra para crear rásteres binarios para cada nivel único de ráster. El objeto resultante (dado el siguiente código) será binary.rasters.
binary.rasters <- stack()
rnames <- vector()
for(i in 1:nlayers(r))
for(j in 1:length(unique(r[[i]][])))
u <- unique(r[[i]][])
b <- r[[i]]
b[] <- ifelse(b[] == u[j], 1, 0)
binary.rasters <- addLayer(binary.rasters, b)
rnames <- append(rnames, paste(names(r)[i], paste("level",u[j],sep="-"), sep="_") )
( names(binary.rasters) <- rnames )
Agregué un vector rnames
que rastrea el nombre del ráster y lo agrega con el nivel en cada subbucle. Esto se puede agregar como los nombres de la pila de ráster resultante. Esto permitirá saber qué ráster y nivel representa un ráster binario dado; sin embargo, no necesariamente se corresponde con los nombres de los parámetros utilizados en el modelo original. Aunque, puede cambiar fácilmente el nombre de los elementos en este vector.
He visto este tipo de codificación ficticia en el modelado de ocupación (p. ej., Presencia de software) y seguro que consume espacio de parámetros. Uno tiene que preguntarse si no sería prudente formular hipótesis explícitas en torno a un nivel específico en una variable categórica dada y no pensar en ella como una única variable independiente, porque seguro que no es así como se está comportando en el modelo. En este caso, cada nivel de la variable es verdaderamente un parámetro separado. Si solo hay uno o dos niveles en una variable nominal independiente dada que, según su hipótesis, afectará su proceso, ¿por qué incluir todos los niveles? Al reducir el espacio de parámetros, obtendrá valores de AIC mucho más relevantes al evaluar modelos de la competencia.
valoraciones y reseñas
Nos encantaría que puedieras difundir este ensayo si lograste el éxito.