https://grasswiki.osgeo.org/w/index.php?title=Temporal_data_processing/GRASS_R_raster_time_series_processing/es&feed=atom&action=historyTemporal data processing/GRASS R raster time series processing/es - Revision history2024-03-29T04:46:55ZRevision history for this page on the wikiMediaWiki 1.41.0https://grasswiki.osgeo.org/w/index.php?title=Temporal_data_processing/GRASS_R_raster_time_series_processing/es&diff=24735&oldid=prev⚠️Dat: spanish translation of "Creating Temporal data processing/GRASS R raster time series processing"2017-08-25T18:33:03Z<p>spanish translation of "Creating Temporal data processing/GRASS R raster time series processing"</p>
<p><b>New page</b></p><div>== GRASS-R / R-GRASS for raster time series processing == <br />
<br />
Este pequeño ejemplo lo va a guiar en los pasos para exportar un Conjunto de datos Espacio-temporales (strds) guardados en GRASS, importarlos a R, preparar los datos adecuadamente para usar el algoritmo Data INterpolation Empirical Orthogonal Functions ([http://modb.oce.ulg.ac.be/mediawiki/index.php/DINEOF DINEOF]) y luego de correrlo, reconstruir la serie de tiempo de rásters, exportarla e importar la nueva strds a GRASS.<br />
<br />
Vamos a usar los datos climáticos de North Carolina que están ya disponibles como una Localización GRASS. Los puede obtener de [http://courses.ncsu.edu/mea592/common/media/02/nc_climate_spm_2000_2012.zip aquí]. Si no lo ha hecho, necesita descomprimir el archivo y pegarlo en su carpeta de base de datos d eGRASS (normalmente llamada grassdata).<br />
<br />
¿Empezamos?<br />
<br />
<br />
=== 1. En GRASS GIS ===<br />
<br />
* Abrir GRASS en la Localización/Directorio de mapas de interés<br />
<br />
<source lang="bash"><br />
grass70 $HOME/grassdata/nc_climate_spm_2000_2012/climate_1970_2012/<br />
</source><br />
<br />
* En listar los mapas ráster con pattern=*tempmean<br />
<br />
<source lang="bash"><br />
g.list type=raster pattern=*tempmean<br />
</source><br />
<br />
* Crear un strds con la media de los mapas de temperatura: {{cmd|t.create}}<br />
<br />
<source lang="bash"><br />
t.create output=tempmean type=strds temporaltype=absolute \<br />
title="Average temperature" description="Monthly temperature average in NC [deg C]"<br />
</source><br />
<br />
* Registrar los mapas en la strds ({{cmd|t.register}}), enlistar la strds ({{cmd|t.list}}) y obtener la información general para un conjunto de datos espacio temporales particular ({{cmd|t.info}}). Más detalles sobre diferentes opciones para registrar mapas en una strds pueden ser encontrados en la wiki particular de [https://grasswiki.osgeo.org/wiki/Temporal_data_processing/maps_registration map registration].<br />
<br />
<br />
<source lang="bash"><br />
t.register -i input=tempmean type=raster start=2000-01-01 increment="1 months" \<br />
maps=`g.list type=raster pattern=*tempmean separator=comma` <br />
<br />
t.list type=strds<br />
<br />
t.info input=tempmean<br />
</source><br />
<br />
* Enlistar los mapas y revisar las estadísticas básicas del strds: {{cmd|t.rast.list}} y {{cmd|t.rast.univar}}<br />
<br />
<source lang="bash"><br />
t.rast.list input=tempmean<br />
<br />
t.rast.univar input=tempmean<br />
</source><br />
<br />
* Exportar fuera de GRASS: {{cmd|t.rast.export}}<br />
<br />
Como se dijo antes, vamos a usar DINEOF como la técnica para el rellenado de huecos (gap-filling). Este método no está disponible (aún) en GRAS GIS, así que ''necesitamos exportar la serie de tiempo de rásters'''. Para exportar solamente el subconjunto de mapas rásters, definimos la región a la región computacional predeterminada (default) de North Carolina y luego usamos {{cmd|t.rast.export}} para exportar nuestro strds.<br />
<br />
<source lang="bash"><br />
# set default region<br />
g.region -d<br />
<br />
t.rast.export input=tempmean output=tempmean4R.tar.gzip compression=gzip<br />
</source><br />
<br />
=== 2. Moviendonos a R ===<br />
<br />
* Desde la consola de GRASS, abra R (o rstudio)<br />
<br />
Note que puede abrir directamente un proyecto en el que esté trabajando (como en el ejemplo de arriba) o solo escribir '''R''' o '''rstudio''' seguido de '''&''' así no pierde el prompt en la consola de GRASS. Para más detalles y ejemplos de cómo usar R o rstudio dentro de una sesión de grass, puede ver la [https://grasswiki.osgeo.org/wiki/R_statistics/rgrass7 wiki del tema]. Vea las secciones [https://grasswiki.osgeo.org/wiki/R_statistics/rgrass7#R_within_GRASS R within GRASS] y [https://grasswiki.osgeo.org/wiki/R_statistics/rgrass7#Using_RStudio_in_a_GRASS_GIS_session Rstudio within GRASS].<br />
<br />
<br />
<source lang="bash"><br />
rstudio $HOME/Documents/foss4g_bonn/ts_grass_r & <br />
</source><br />
<br />
Una vez dentro de R, primero vamos a cargar el paquete ''rgrass7''. Esta librería provee la interfaz con GRASS GIS 7. Vamos a revisar alguna información básica de la sesión.<br />
<br />
<source lang="rsplus"><br />
# Cargar el paquete rgrass7<br />
library(rgrass7)<br />
<br />
# Revisar el ambiente GRASS<br />
genv <- gmeta()<br />
genv<br />
gisdbase /home/veroandreo/grassdata <br />
location nc_climate_spm_2000_2012 <br />
mapset climate_1970_2012 <br />
rows 104 <br />
columns 139 <br />
north 260500 <br />
south 208500 <br />
west 624500 <br />
east 694000 <br />
nsres 500 <br />
ewres 500 <br />
projection +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75<br />
+lon_0=-79 +x_0=609601.22 +y_0=0 +no_defs +a=6378137 +rf=298.257222101<br />
+towgs84=0.000,0.000,0.000 +to_meter=1 <br />
</source><br />
<br />
Esto nos da información acerca de la proyección y la región, entre otras cosas que vamos a necesitar más adelate (ver abajo).<br />
<br />
Dado que ni los módulos temporales de GRASS, ni los conjuntos de datos temporales de GRASS están implementados (aún) en R, cuando necesite hacer un proceso de una serie de tiempo que tenga en la GRASS DB, debe exportar todos los mapas y luego leerlos en R. Por lo tanto, necesitamos cargar el siguiente paquete también:<br />
<br />
<source lang="rsplus"><br />
# Load other required packages<br />
library(spacetime)<br />
library(raster)<br />
library(rgdal)<br />
</source><br />
<br />
Ahora, necesitamos '''leer el strds exportado desde GRASS en R''' con la función read.tgrass del paquete ''spacetime''.<br />
<br />
<source lang="rsplus"><br />
# Importar strds a R<br />
tempmean_in_R <- read.tgrass("tempmean4R.tar.gzip", localName = FALSE, useTempDir = FALSE)<br />
</source><br />
<br />
Note que R importa nuestro strds como un [http://rspatial.org/spatial/rst/4-rasterdata.html#rasterstack-and-rasterbrick RasterStack]. Veamos si todo está ahi:<br />
<br />
<source lang="rsplus"><br />
# Obtener información sobre el RasterStack<br />
class(tempmean_in_R)<br />
[1] "RasterStack"<br />
attr(,"package")<br />
[1] "raster"<br />
# Dimensiones<br />
> dim(tempmean_in_R)<br />
[1] 104 139 156<br />
</source><br />
<br />
Podemos también pedir el resumen de capas particulares en el stack o de todo el RasterStack:<br />
<br />
<source lang="rsplus"><br />
# Resumen de la primer capa<br />
summary(tempmean_in_R[[1]])<br />
X2000_01_tempmean<br />
Min. 2.833784<br />
1st Qu. 3.667942<br />
Median 3.936594<br />
3rd Qu. 4.132093<br />
Max. 4.496206<br />
NA's 0.000000<br />
<br />
# Resumen del RasterStack<br />
summary(tempmean_in_R)<br />
</source><br />
<br />
Y, por supuesto, podemos graficar alguna capa:<br />
<br />
<source lang="rsplus"><br />
# Graficar la 3er capa del stack<br />
plot(tempmean_in_R,3) <br />
</source><br />
<br />
[[File:Layer3.png|border|center]]<br />
<br />
<br />
Para la mayoría de los métodos en R (por ej: Theil-Sen slope, fft, dineof) necesitamos transformar nuestro RasterStack en una matriz o data.frame En el caso particular de este ejemplo, necesitamos transformar nuestro RasterStack en una matriz ''mtx'' con ''m'' = mapas y ''t'' = tiempo, i.e.: en esta matriz tenemos nuestros mapas como filas y el tiempo como columnas. Por lo tanto, ''en cada columna tenemos una serie de tiempo para un pixel dado''. Vamos a empezar:<br />
<br />
<source lang="rsplus"><br />
# RasterStack a matriz (esto nos da mapas como columnas y tiempo como filas)<br />
txm_tempmean <- as.matrix(tempmean_in_R) <br />
dim(txm_tempmean)<br />
[1] 14456 156<br />
<br />
# Transponemos la matriz (necesitamos tiempo como columnas y mapas como filas)<br />
mxt_tempmean <- t(txm_tempmean)<br />
dim(mxt_tempmean)<br />
[1] 156 14456<br />
</source><br />
<br />
El punto para DINEOF es rellenar los huecos (gap-filling). Sin embargo, como uestro conjunto de datos proviene de interpolaciones de estaciones climáticas, no tenemos tales huecos...<br />
<br />
<source lang="rsplus"><br />
# Revisar huecos en los datos<br />
sum(is.na(mxt_tempmean))<br />
[1] 0<br />
</source><br />
<br />
Así que para propósitos de este ejemplo, vamos a crearlos<br />
<br />
<source lang="rsplus"><br />
# Crear huecos<br />
# Conteo total de pixeles: 14456*156=2255136<br />
# Valores NULL deben aparecer como NaN<br />
set.seed(46)<br />
n = 400000<br />
mxt_tempmean[mysamples <- sample(length(mxt_tempmean), n)] <- NaN<br />
sum(is.na(mxt_tempmean))<br />
[1] 400000<br />
</source><br />
<br />
Ahora estamos listos para '''usar DINEOF para rellenar los datos faltantes'''. Puede encontrar más información sobre DINEOF en el [http://modb.oce.ulg.ac.be/mediawiki/index.php/DINEOF sitio oficial]. Sin embargo, el paquete de R que provee DINEOF se llama ''sinkr'' y puede ser instalado desde [https://github.com/marchtaylor/sinkr aquí].<br />
<br />
<br />
<source lang="rsplus"><br />
# Cargar la librería que contiene la fución dineof y otras librerías requeridas<br />
library(sinkr)<br />
library(irlba)<br />
library(Matrix)<br />
# o, descargar la función dineof desde el repositorio y ''source it'':<br />
# source('dineof.r')<br />
<br />
# Correr el algoritmo - configuración predeterminada<br />
result_tempmean <- dineof(mxt_tempmean) <br />
</source><br />
<br />
El objeto ''result_tempmean'' es una lista con todos los resultados de dineof. Puede investigarla ud. mismo, pruebe con otra configuración y compare los resultados.<br />
<br />
<source lang="rsplus"><br />
# Explorar qué tiene dentro<br />
names(result_tempmean)<br />
[1] "Xa" "n.eof" "RMS" "NEOF" <br />
</source><br />
<br />
Para este ejemplo, vamos a extraer solamente la matriz espacio-temporal reconstruida y mostrarla:<br />
<br />
<source lang="rsplus"><br />
# Extraer la matriz rellenada (gap-filled)<br />
tempmean_new <- result_tempmean$Xa <br />
<br />
# Definir la paleta de colores<br />
library(RColorBrewer)<br />
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red"))<br />
<br />
# Mostrar las matrices espacio-temporales con huecos y sin huecos<br />
par(mfrow = c(2,1))<br />
image(mxt_tempmean, col = pal(100), main = "Original data with gaps")<br />
image(tempmean_new, col = pal(100), main = "Gap-filled data")<br />
</source><br />
<br />
<br />
[[File:Plot gaps nogaps.png|border|center]]<br />
<br />
Y queremos ver cómo la serie de tiempo de un pixel particular es reconstruida. Por lo tanto, necesitamos graficar todas las filas de una cierta columna. ¿Recuerdas cómo se formó nuestra matriz?<br />
<br />
<source lang="rsplus"><br />
# Graficar la serie de tiempo de un pixel particular de ambas matrices<br />
pixel <- 10000<br />
ylim <- range(c(mxt_tempmean[,pixel], tempmean_new[,pixel]), na.rm = TRUE)<br />
plot(mxt_tempmean[,pixel], t = "l", ylim = ylim, lwd = 2, ylab = "Temperature", xlab = "Time")<br />
lines(tempmean_new[,pixel], col = 2, lty = 3)<br />
legend(123, 13, c("original","gap-filled"), lty = c(1,3), lwd = c(2,1), col = c(1,2), cex = 0.8)<br />
abline(h = 0, v = 0, col = "gray60")<br />
</source><br />
<br />
<br />
[[File:Time series.png|border|center]]<br />
<br />
<br />
Asumamos que estamos contentos con el resultado, necesitamos regresar a un formato strds. Vamos a reconstruir la serie de tiempo de rásters empezando con una matriz ''mxt''. Para eso, primero ''creamos rásters vacíos de las mismas dimensiones que nuestros mapas ráster originales y luego los rellenamos con cada fila de la matriz rellenada'''. Lo que obtenemos es entonces una lista de rásters. Veamos:<br />
<br />
<source lang="rsplus"><br />
# Crear objetos rásters para rellenar con los datos de tempmean_new<br />
tempmean_2_grass <- raster(nrows = 104, ncols = 139, <br />
xmn = 624500, xmx = 694000, <br />
ymn = 208500, ymx = 260500, <br />
crs = tempmean_in_R)<br />
dim(tempmean_2_grass)<br />
[1] 104 139 1<br />
<br />
# Extraer los datos de cada fila de ''tempmean_new'' y construir una capa ráster<br />
# Salida: lista de ráters<br />
tempmean_new_rl <- lapply(1:nrow(tempmean_new), function(i) {<br />
setValues(tempmean_2_grass, tempmean_new[i,])<br />
} )<br />
length(tempmean_new_rl)<br />
[1] 156<br />
dim(tempmean_new_rl[[3]])<br />
[1] 104 139 1<br />
<br />
# Graficar una capa ráster de la lista<br />
plot(tempmean_new_rl[[3]], main="X2000_03_tempmean_new")<br />
</source><br />
<br />
<br />
[[File:Tempmean new 3.png|border|center]]<br />
<br />
Puede comparar con la tercer capa de los datos originales.<br />
<br />
<source lang="rsplus"><br />
plot(tempmean_in_R,3)<br />
</source><br />
<br />
Bien, hasta ahora, tenemos una lista de rásters. Pero para exportarlos e importarlos a GRASS, necesitamos de nuevo un RasterStack.<br />
<br />
<source lang="rsplus"><br />
# reconstruir el RasterStack<br />
tempmean_new_rs <- stack(tempmean_new_rl) <br />
</source><br />
<br />
No solo un RasterStack, pero necesitamos especificar la dimensión temporal, i.e.: ''necesitamos añadir tiempo al RasterStack'''.<br />
<br />
<source lang="rsplus"><br />
time_4_new_rs <- seq(as.Date("2001-01-01"), as.Date("2012-12-01"))<br />
tempmean_new_rs_and_time <- setZ(tempmean_new_rs, time_4_new_rs, name="time")<br />
</source><br />
<br />
Finalmente, '''exportamos el RasterStack a GRASS''' con la función write.tgrass del paquete ''spacetime''.<br />
<br />
<source lang="rsplus"><br />
write.tgrass(tempmean_new_rs_and_time, "tempmean_new_from_R.tar.gzip")<br />
</source><br />
<br />
=== 3. De regreso a GRASS ===<br />
<br />
Ahora cambiamos de nuevo a la consola de GRASS e '''importamos el strds''' con {{cmd|t.rast.import}}. Este comando creará el strds y registrará todos los mapas que hay en él.<br />
<br />
<source lang="bash"><br />
t.rast.import input=tempmean_new_from_R.tar.gz output=tempmean_dineof base=tempmean_dineof extrdir=/tmp<br />
</source><br />
<br />
¡Diviertanse!<br />
<br />
<br />
<br />
[[Category: Documentation]]<br />
[[Category: Tutorial]]<br />
[[Category: Temporal]]<br />
[[Category: R]]<br />
[[Category: Languages/es]]</div>⚠️Dat