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.
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.
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.
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.