Datos de la estación de monitoreo en el Centro Cultural R. Mijares en Torreón Coahuila Los datos se obtuvieron desde el portal nacional de transparencia. Folio 051260800019725 Exp.197-2025
Recuperación de datos
Conversión de datos alfanuméricos (caracter) a variables de tiempo La función myPOSIX cambia la hora 00:00 del día a las 24:00 del día anterior para efectos de visualización y cálculo Uso del paquete lubridate que manipula datos de fecha y tiempo para agruparlos de acuerdo a un propósito por una variable de tiempo
ruta<-"C:/Users/cguer/Documents/Claudia/Midropbox/Investigacion y escritos/karamanis/data/"
infile <- "2calairetorreon.CSV"
nomarchi<-paste0(ruta,infile)
caliairehora<-read.csv(nomarchi,stringsAsFactors = FALSE)
caliairehora$tc<-as.POSIXct(caliairehora$Fecha,format = "%d/%m/%Y %H:%M",tz=Sys.timezone())
class(caliairehora$tc) <- c("myPOSIX", class(caliairehora$tc))
caliairehora$time2<- format.myPOSIX(caliairehora$tc)
caliairehora$date <- ymd_hms(caliairehora$time2)
#head(caliairehora$date)
caliairehora$PM10<-as.numeric(caliairehora$PM10)
caliairehora$PM2.5<-as.numeric(caliairehora$PM2.5)
caliairehora$O3<-as.numeric(caliairehora$O3)
caliairehora$NO2<-as.numeric(caliairehora$NO2)
caliairehora$SO2<-as.numeric(caliairehora$SO2)
caliairehora$CO<-as.numeric(caliairehora$CO)
caliairehora$year<-year(caliairehora$date)
caliairehora$hour<-hour(caliairehora$date)
caliairehora %>% dplyr::select(date,year,hour)
head(caliairehora)
OPENAIR
library(openair)
aq<-caliairehora
# Very easy approach for doing time average
aq_daily <- timeAverage(aq, avg.time = "day")
head(aq_daily)
aq_monthly <- timeAverage(aq, avg.time = "month")
head(aq_monthly)
timePlot(selectByDate(aq, year = 2024),
pollutant = c("NO2", "O3", "PM2.5", "PM10", "SO2"),
y.relation = "free")
timeVariation(subset(aq,year=2025),
pollutant = "PM10", ylab = "pm10 (ug/m3)")
timeVariation(subset(aq,year=2025),
pollutant = "PM2.5", ylab = "pm2.5 (ug/m3)")
TIDYVERSE
library(tidyverse)
ggplot(aq, aes(x = date, y = PM10)) + geom_line(colour = "blue", alpha = 0.5) + theme_bw() +
theme(axis.title = element_text(size = 20), axis.text=element_text(size=20)) +
labs(x = "Fecha", y = expression(PM[10]))
plot<- ggplot(aq, aes(x = PM2.5, y = PM10)) +
geom_point(colour = "red", size = 3) +
theme_bw() +
geom_smooth(method = "lm") +
theme(
axis.title = element_text(size = 20),
axis.text=element_text(size=20)) +
xlab (expression(PM[2.5])) +
ylab (expression(PM[10]))
plot
ggplot(aq, aes(SO2)) + geom_histogram() + theme_bw() +
theme(axis.title = element_text(size = 20),
axis.text= element_text(size=20))
lm_aq <- aq %>% filter(year == "2024")
lm_aq <- lm (data = aq, formula = PM2.5 ~ PM10 + O3 + hour)
summary(lm_aq)
Call: lm(formula = PM2.5 ~ PM10 + O3 + hour, data = aq)
Residuals: Min 1Q Median 3Q Max -107.597 -4.230 -0.481 3.302 306.398
Coefficients: Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.099e+00 2.868e-01 28.24 <2e-16 PM10
2.071e-01 1.398e-03 148.14 <2e-16 O3 -1.082e+02
5.753e+00 -18.82 <2e-16 hour -2.517e-01 1.492e-02 -16.87
<2e-16 — Signif. codes: 0 ‘’ 0.001
’’ 0.01 ’’ 0.05 ‘.’ 0.1 ’ ’ 1
Residual standard error: 11.41 on 12720 degrees of freedom (716 observations deleted due to missingness) Multiple R-squared: 0.699, Adjusted R-squared: 0.6989 F-statistic: 9845 on 3 and 12720 DF, p-value: < 2.2e-16
summaryPlot(subset(dplyr::select(aq,-c(year,hour))))
calendarPlot(aq, pollutant = "PM2.5", year =2025)
calendarPlot(aq, pollutant = "PM2.5", year = 2025,
breaks = c(0, 15, 41, 79, 130,400),
labels = c("buena", "acepta", "mala", "muy mala","extmala"),
cols = c("green", "yellow", "orange", "red","purple"),
statistic = "max")
calendarPlot(aq, pollutant = "PM2.5", year = 2025, annotate = "value",
lim =41, cols = "Purples", col.lim = c("black", "orange"),
layout = c(4, 3))
#### FUNCIÓN Para calcular promedios móviles
#Se crea un nuevo campo de rollingPM25
aq <- rollingMean(aq, pollutant = "PM2.5", hours = 8, new.name = "rollingPM25", data.thresh = 75)
tail(aq)
calendarPlot(aq, pollutant = "rollingPM25", year = 2025,
breaks = c(0, 15, 41, 79, 130,400),
labels = c("buena", "acepta", "mala", "muy mala","extmala"),
cols = c("green", "yellow", "orange", "red","purple"),
statistic = "max")
## Cálculo de dos promedios pero que sólo se calcula si hay al menos el 75% de datos disponibles
twoweek <- timeAverage(aq, avg.time = "2 week", data.thresh = 75)
head(twoweek)
### correlación de datos
corPlot(subset(select(aq,-c(year,hour))), dendrogram = TRUE)
#### FUNCIÓN Para calcular promedios móviles
#Se crea un nuevo campo de rollingPM25
aq <- rollingMean(aq, pollutant = "PM2.5", hours = 8, new.name = "rollingPM25", data.thresh = 75)
tail(aq)