Diferencias de temperaturas en casos de heladas

El objetivo de este documento es analizar la variabilidad de temperaturas en distintos escenarios.

Estudios sobre heladas comentan que es más frío a nivel del suelo que a mayores alturas. Por ello en primer lugar analizaremos datasets donde los sensores están ubicados a distintas alturas.

Finalmente, veremos si hay una diferencia de alturas a nivel espacial (horizontal) en los escenarios que pueda visualizarse.

Sensores a distintas alturas

Escenario fca-uncu-carlos

Importo el dataset

library(readr)
dataset <- read_delim("fca-carlos/datostermmetros/120726-minimal.csv", 
    ";", escape_double = FALSE, col_types = cols(interval = col_skip(), 
        number = col_skip()), trim_ws = TRUE)
#View(dataset)

Chusmeo un sensor, el s_0, observamos varios días de heladas

plot(cbind(1:nrow(dataset),dataset[,5]))

Un vistazo a los datos

head(dataset)
## # A tibble: 6 x 8
##   date       hour       s_0 s_0_4 s_0_75 s_1_50   s_2   s_3
##   <date>     <drtn>   <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 2012-07-21 14:46:10  18.2  17.3   17.4   17    17.8  17.8
## 2 2012-07-21 14:47:10  18.4  17.2   17.3   16.8  17.7  17.5
## 3 2012-07-21 14:48:10  18.4  17.1   17.2   16.7  17.3  17.2
## 4 2012-07-21 14:49:10  18.4  17     17.1   16.6  17.1  17  
## 5 2012-07-21 14:50:10  18.5  16.9   17.1   16.5  17.1  16.9
## 6 2012-07-21 14:51:10  18.5  16.8   16.9   16.4  17    16.7
dataset$date <- as.POSIXct(strptime(paste(dataset$date,dataset$hour,sep=" "), "%Y-%m-%d %H:%M:%S"))
head(dataset)
## # A tibble: 6 x 8
##   date                hour       s_0 s_0_4 s_0_75 s_1_50   s_2   s_3
##   <dttm>              <drtn>   <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 2012-07-21 14:46:10 14:46:10  18.2  17.3   17.4   17    17.8  17.8
## 2 2012-07-21 14:47:10 14:47:10  18.4  17.2   17.3   16.8  17.7  17.5
## 3 2012-07-21 14:48:10 14:48:10  18.4  17.1   17.2   16.7  17.3  17.2
## 4 2012-07-21 14:49:10 14:49:10  18.4  17     17.1   16.6  17.1  17  
## 5 2012-07-21 14:50:10 14:50:10  18.5  16.9   17.1   16.5  17.1  16.9
## 6 2012-07-21 14:51:10 14:51:10  18.5  16.8   16.9   16.4  17    16.7
dim(dataset)
## [1] 7330    8

Convertimos a tipo de dato serie temporal

library(xts)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(forecast)
dataset_ts <- xts(dataset[,-c(1,2)],order.by = dataset$date)
head(dataset_ts)
##                      s_0 s_0_4 s_0_75 s_1_50  s_2  s_3
## 2012-07-21 14:46:10 18.2  17.3   17.4   17.0 17.8 17.8
## 2012-07-21 14:47:10 18.4  17.2   17.3   16.8 17.7 17.5
## 2012-07-21 14:48:10 18.4  17.1   17.2   16.7 17.3 17.2
## 2012-07-21 14:49:10 18.4  17.0   17.1   16.6 17.1 17.0
## 2012-07-21 14:50:10 18.5  16.9   17.1   16.5 17.1 16.9
## 2012-07-21 14:51:10 18.5  16.8   16.9   16.4 17.0 16.7
summary(dataset_ts)
##      Index                          s_0             s_0_4       
##  Min.   :2012-07-21 14:46:10   Min.   :-9.800   Min.   :-7.800  
##  1st Qu.:2012-07-22 21:18:25   1st Qu.:-3.100   1st Qu.:-0.600  
##  Median :2012-07-24 03:50:40   Median : 1.400   Median : 4.300  
##  Mean   :2012-07-24 03:50:40   Mean   : 4.275   Mean   : 5.673  
##  3rd Qu.:2012-07-25 10:22:55   3rd Qu.:11.700   3rd Qu.:13.000  
##  Max.   :2012-07-26 16:55:10   Max.   :26.800   Max.   :25.600  
##      s_0_75           s_1_50            s_2              s_3        
##  Min.   :-7.600   Min.   :-6.600   Min.   :-5.800   Min.   :-5.300  
##  1st Qu.:-0.400   1st Qu.: 0.700   1st Qu.: 1.200   1st Qu.: 1.500  
##  Median : 4.400   Median : 5.200   Median : 5.300   Median : 5.600  
##  Mean   : 5.638   Mean   : 6.221   Mean   : 6.899   Mean   : 7.134  
##  3rd Qu.:12.600   3rd Qu.:12.400   3rd Qu.:13.500   3rd Qu.:13.200  
##  Max.   :20.800   Max.   :21.200   Max.   :22.300   Max.   :25.200

Graficamos para tener un panorama

plot.xts(dataset_ts)

library(ggfortify)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:forecast':
## 
##     autolayer
autoplot(dataset_ts)

Observamos las heladas, filtrando por valores menores a cero en sensor del suelo

library(reshape2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
dataset_ts %>%
  as_tibble() %>%
  filter(s_0 <= 0) %>%
  melt() %>%
  ggplot(aes(x=variable,y=value)) + geom_boxplot()
## Warning: Calling `as_tibble()` on a vector is discouraged, because the behavior is likely to change in the future. Use `tibble::enframe(name = NULL)` instead.
## This warning is displayed once per session.
## No id variables; using all as measure variables

library(reshape2)
dataset_ts %>%
  as_tibble() %>%
  filter(s_3 <= 0) %>%
  melt() %>%
  ggplot(aes(x=variable,y=value)) + geom_boxplot()
## No id variables; using all as measure variables

Observamos que en promedio en momentos de heladas a nivel del suelo, los sensores de mayores alturas todos tenian en promedio temperaturas superiores. Considerar que se usaron data loggers cuya precision es baja, un grado, lo que justifica una mayor dispoersion.

PEACH

load dataset

Cargo datos de temperatura de sensores SHT31

library(readr)
X2016_2018_temperatura_sht31_peach <- read_delim("./peach/2016-2018-temperatura-sht31-peach.csv", 
    ";", escape_double = FALSE, na = "null", 
    trim_ws = TRUE)
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   Time = col_datetime(format = ""),
##   `00-17-0d-00-00-38-0f-66 ID_0` = col_integer()
## )
## See spec(...) for full column specifications.
head(X2016_2018_temperatura_sht31_peach)
## # A tibble: 6 x 21
##   Time                `00-17-0d-00-00… `00-17-0d-00-00… `00-17-0d-00-00…
##   <dttm>                         <int>            <dbl>            <dbl>
## 1 2016-10-13 13:15:05               NA            -45                 NA
## 2 2016-10-13 14:12:08               NA             16.6               NA
## 3 2016-10-13 14:13:11              -45             NA                 NA
## 4 2016-10-13 14:17:16               NA             20.0               NA
## 5 2016-10-13 14:18:35               NA             NA                 NA
## 6 2016-10-13 14:34:13               NA             NA                 NA
## # … with 17 more variables: `00-17-0d-00-00-60-06-27 ID_0` <dbl>,
## #   `00-17-0d-00-00-60-08-d5 ID_0` <dbl>, `00-17-0d-00-00-38-0f-66
## #   ID_1` <dbl>, `00-17-0d-00-00-3f-f8-20 ID_1` <dbl>,
## #   `00-17-0d-00-00-60-02-1b ID_1` <dbl>, `00-17-0d-00-00-60-06-27
## #   ID_1` <dbl>, `00-17-0d-00-00-60-08-d5 ID_1` <dbl>,
## #   `00-17-0d-00-00-38-0f-66 ID_2` <dbl>, `00-17-0d-00-00-3f-f8-20
## #   ID_2` <dbl>, `00-17-0d-00-00-60-02-1b ID_2` <dbl>,
## #   `00-17-0d-00-00-60-06-27 ID_2` <dbl>, `00-17-0d-00-00-60-08-d5
## #   ID_2` <dbl>, `00-17-0d-00-00-38-0f-66 ID_3` <dbl>,
## #   `00-17-0d-00-00-3f-f8-20 ID_3` <dbl>, `00-17-0d-00-00-60-02-1b
## #   ID_3` <dbl>, `00-17-0d-00-00-60-06-27 ID_3` <dbl>,
## #   `00-17-0d-00-00-60-08-d5 ID_3` <dbl>

El nombre de la columna, por ejemplo 00-17-0d-00-00-38-0f-66 ID_0 significa que “00-17-0d-00-00-38-0f-66” es la direccion MAC del mote o nodo y ID_0 la identificacion del sensor SHT31d.

De acuerdo a documentacion (http://proyectos.gridtics.frm.utn.edu.ar/projects/peach-wsn/wiki/SENSORES)

Se debe cortar el cable de red en cuatro piezas, de los siguientes largos, 2, 3, 4 y 5 (metros). (ya qeu el mote esta en lo alto del poste)

La sonda 1 corresponde con el cable de 2 metros, es decir, ID_3, la sonda del suelo

La sonda 2 corresponde con el cable de 3 metros, es decir, ID_2

La sonda 3 corresponde con el cable de 4 metros, es decir, ID_1

La sonda 4 corresponde con el cable de 5 metros, es decir, ID_0

siendo ID_03 el sensor ubicado a nivel del suelo, ID_2 a un metro del suelo, ID_1 a dos metros e ID_0 a tres metros de altura.

preprocessing

El -45 es valor perdido x error del sensor, reemplazo.

X2016_2018_temperatura_sht31_peach[X2016_2018_temperatura_sht31_peach==-45]<-NA

Crear objeto time series (xts), intento

sht31.temp.ts <- xts(X2016_2018_temperatura_sht31_peach[-1],order.by = X2016_2018_temperatura_sht31_peach$Time)

Un resumen de los datos

summary(sht31.temp.ts)
##      Index                     00-17-0d-00-00-38-0f-66 ID_0
##  Min.   :2016-10-13 13:15:05   Min.   : NA                 
##  1st Qu.:2017-04-11 12:20:10   1st Qu.: NA                 
##  Median :2017-05-27 20:17:24   Median : NA                 
##  Mean   :2017-08-29 14:20:13   Mean   :NaN                 
##  3rd Qu.:2018-02-24 17:01:50   3rd Qu.: NA                 
##  Max.   :2018-05-16 15:51:16   Max.   : NA                 
##                                NA's   :185077              
##  00-17-0d-00-00-3f-f8-20 ID_0 00-17-0d-00-00-60-02-1b ID_0
##  Min.   :-0.14                Min.   : 0.02               
##  1st Qu.:12.07                1st Qu.:12.41               
##  Median :16.89                Median :17.34               
##  Mean   :17.54                Mean   :18.00               
##  3rd Qu.:22.65                3rd Qu.:23.29               
##  Max.   :40.03                Max.   :41.98               
##  NA's   :144901               NA's   :148640              
##  00-17-0d-00-00-60-06-27 ID_0 00-17-0d-00-00-60-08-d5 ID_0
##  Min.   :-0.36                Min.   : 0.32               
##  1st Qu.:12.19                1st Qu.:12.31               
##  Median :17.14                Median :17.60               
##  Mean   :17.99                Mean   :18.27               
##  3rd Qu.:23.53                3rd Qu.:23.91               
##  Max.   :41.01                Max.   :41.24               
##  NA's   :147081               NA's   :153023              
##  00-17-0d-00-00-38-0f-66 ID_1 00-17-0d-00-00-3f-f8-20 ID_1
##  Min.   :-0.33                Min.   :-0.62               
##  1st Qu.:12.03                1st Qu.:11.85               
##  Median :16.81                Median :16.85               
##  Mean   :17.70                Mean   :17.62               
##  3rd Qu.:23.00                3rd Qu.:23.17               
##  Max.   :42.57                Max.   :41.47               
##  NA's   :148072               NA's   :144896              
##  00-17-0d-00-00-60-02-1b ID_1 00-17-0d-00-00-60-06-27 ID_1
##  Min.   :-0.14                Min.   :-0.30               
##  1st Qu.:12.14                1st Qu.:11.81               
##  Median :17.18                Median :16.71               
##  Mean   :17.93                Mean   :17.47               
##  3rd Qu.:23.55                3rd Qu.:22.89               
##  Max.   :42.59                Max.   :42.05               
##  NA's   :148638               NA's   :145592              
##  00-17-0d-00-00-60-08-d5 ID_1 00-17-0d-00-00-38-0f-66 ID_2
##  Min.   :-0.07                Min.   :-0.62               
##  1st Qu.:11.49                1st Qu.:11.81               
##  Median :17.04                Median :16.67               
##  Mean   :17.94                Mean   :17.56               
##  3rd Qu.:24.28                3rd Qu.:22.89               
##  Max.   :42.94                Max.   :42.78               
##  NA's   :159034               NA's   :148065              
##  00-17-0d-00-00-3f-f8-20 ID_2 00-17-0d-00-00-60-02-1b ID_2
##  Min.   :-1.44                Min.   :-0.72               
##  1st Qu.:11.71                1st Qu.:12.02               
##  Median :16.78                Median :16.96               
##  Mean   :17.68                Mean   :17.58               
##  3rd Qu.:23.38                3rd Qu.:22.85               
##  Max.   :42.97                Max.   :41.75               
##  NA's   :144892               NA's   :148644              
##  00-17-0d-00-00-60-06-27 ID_2 00-17-0d-00-00-60-08-d5 ID_2
##  Min.   :-0.89                Min.   :-0.91               
##  1st Qu.:11.54                1st Qu.:12.05               
##  Median :16.55                Median :17.45               
##  Mean   :17.33                Mean   :18.10               
##  3rd Qu.:22.70                3rd Qu.:23.95               
##  Max.   :42.95                Max.   :41.96               
##  NA's   :145584               NA's   :153022              
##  00-17-0d-00-00-38-0f-66 ID_3 00-17-0d-00-00-3f-f8-20 ID_3
##  Min.   :-2.61                Min.   :-2.93               
##  1st Qu.:11.81                1st Qu.:11.71               
##  Median :16.78                Median :16.85               
##  Mean   :17.64                Mean   :17.70               
##  3rd Qu.:23.00                3rd Qu.:23.25               
##  Max.   :43.92                Max.   :44.15               
##  NA's   :148064               NA's   :144889              
##  00-17-0d-00-00-60-02-1b ID_3 00-17-0d-00-00-60-06-27 ID_3
##  Min.   :-2.14                Min.   :-2.35               
##  1st Qu.:12.06                1st Qu.:11.45               
##  Median :17.07                Median :16.47               
##  Mean   :17.61                Mean   :17.25               
##  3rd Qu.:22.83                3rd Qu.:22.47               
##  Max.   :41.81                Max.   :44.51               
##  NA's   :148627               NA's   :145581              
##  00-17-0d-00-00-60-08-d5 ID_3
##  Min.   :-2.39               
##  1st Qu.:12.06               
##  Median :17.39               
##  Mean   :17.93               
##  3rd Qu.:23.43               
##  Max.   :43.21               
##  NA's   :153017

Plot para vistazo de los datos (puede demorar este plot en compus pequenias, filtrar por una cantidad de filas menor)

plot.xts(sht31.temp.ts)

Observamos que no llegaron a medir eventos de heladas :-(.

Dataset de sensores de suelo, 1m, 2m, 3m. Hay variabilidad espacial horizontal??

Filtro sensores a nivel del suelo

sensores_suelo <- sht31.temp.ts[ , grepl( "ID_0" , names(sht31.temp.ts ) ) ]
plot.xts(sensores_suelo)

library(ggfortify)
autoplot(sensores_suelo)
## Warning: Removed 239161 rows containing missing values (geom_path).

Para un mote ver la distribucion en las cuatro alturas.

Mote

mote_60_08_d5 <- sht31.temp.ts[ , grepl( "00-17-0d-00-00-60-08-d5" , names(sht31.temp.ts ) ) ]
colnames(mote_60_08_d5) <- c("ID_0","ID_1","ID_2","ID_3")
head(mote_60_08_d5)
## Warning: timezone of object (UTC) is different than current timezone ().
##                       ID_0  ID_1   ID_2   ID_3
## 2016-10-13 13:15:05     NA    NA     NA     NA
## 2016-10-13 14:12:08     NA    NA     NA     NA
## 2016-10-13 14:13:11     NA    NA     NA     NA
## 2016-10-13 14:17:16     NA    NA     NA     NA
## 2016-10-13 14:18:35     NA    NA     NA     NA
## 2016-10-13 14:34:13 24.653 21.94 21.107 19.996
library(ggplot2)
library(reshape2)
mote_60_08_d5 %>%
  as_tibble() %>%
  na.omit() %>%
  filter(ID_3 < 0) %>%
  melt() %>%
  ggplot(aes(x=variable,y=value)) + geom_boxplot()
## No id variables; using all as measure variables

Observamos que en promedio ante temperaturas bajas menores a cero grados, el sensor del suelo tiene em promedio menos temperatura siguiendo del sensor del suelo ID_3 (en promedio) < ID_2 < ID_1 < ID_0

Autoplot

mote_60_08_d5 %>%
  na.omit() %>%
  autoplot()

Misma grafica de cajas pero filtrando por menos de dos grados.

library(ggplot2)
library(reshape2)
mote_60_08_d5 %>%
  as_tibble() %>%
  na.omit() %>%
  filter(ID_3 < 2) %>%
  melt() %>%
  ggplot(aes(x=variable,y=value)) + geom_boxplot()
## No id variables; using all as measure variables

mote_60_08_d5 %>%
  as_tibble() %>%
  na.omit() %>%
  filter(ID_3 < 0) 
## # A tibble: 17 x 4
##     ID_0   ID_1   ID_2   ID_3
##    <dbl>  <dbl>  <dbl>  <dbl>
##  1 0.996  0.775  0.414 -0.056
##  2 1.05   0.775  0.398 -0.154
##  3 1.08   0.537  0.118 -0.267
##  4 1.51   1.27   0.665 -0.085
##  5 1.59   1.21   0.721 -0.056
##  6 1.41   0.914  0.497 -0.029
##  7 1.46   1.06   0.441 -0.069
##  8 0.604  0.227  0.019 -0.181
##  9 0.577  0.056 -0.109 -0.125
## 10 0.422  0.142 -0.109 -0.168
## 11 0.409 -0.013 -0.235 -0.237
## 12 0.465  0     -0.235 -0.253
## 13 0.732  0.481 -0.205 -0.267
## 14 1.15   0.887 -0.037 -0.224
## 15 1.38   1.14   0.342 -0.098
## 16 1.42   0.874  0.441 -0.029
## 17 1.03   0.396  0.091 -0.013

Cuando esta helando en el suelo (sensor ID_3) se observan temperaturas superiores en los sensores a alturas mayores, eos muestra el sgte plot, siendo los sensores utilizados en este proyecto con un accuracy de 0.3 (chequear)

library(dplyr)
# Add extra space to right of plot area; change clipping to figure
par(mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)

mote_60_08_d5 %>%
  as_tibble() %>%
  na.omit() %>%
  filter(ID_3 < 0) %>%
  matplot( type = c("p"),pch=1,col = 1:4) #plot
# legend("topleft", legend = c("ID_0","ID_1","ID_2","ID_3"), col=1:4, pch=1) 
 
 legend("topright", inset=c(-0.2,0), c("ID_0","ID_1","ID_2","ID_3"),pch=1, col=1:4, title="Sensores")

TODO con los otros sensores de PEACH

TODO si hay variabilidad horizontal (por ejemplo entre los 5 sensores en la parcela)

Agrupamos los sensores de suelo, los que estan a 1m, 2m y 3m, para observar variabilidad en general.