2  Regresión múltiple

Presentamos un ejemplo de modelos de regresión a partir de datos reales de clima y de uso del sistema de bicicletas Ecobici de la Ciudad Autónoma de Buenos Aires.

Cómo MidJourney imagina que se ilustra este problema bajo el prompt: /imagine an enchanting illustration of Buenos Aires, with the obelisk at the center of the image, during a rainy day, where the focal point is the bustling bicycle usage.

A continuación, se muestran algunos posibles ajustes de regresión que vinculan la cantidad de usuarios del sistema Ecobici por día en función de ciertas variables climáticas.

Código
rm(list=ls())
# Librerías necesarias
require(tidyverse)
require(ggfortify)
require(plotly)
require(kableExtra)
require(knitr)
require(devtools)
options(scipen = 999)

2.1 Exploración inicial

En el dataset climabici de la librería datosIC se incluyen datos de viajes con duración entre 5 y 60 minutos, cualquier día de la semana, durante el año 2022. A continuación, se muestran 10 datos de dicho conjunto.

Código
devtools::install_github("daniellaparada/datosIC")
library(datosIC)
datos <- climabici
Dataset reducido, primeras 10 observaciones.
fecha n tavg tmin tmax prcp dia tipo_dia lluvia
2022-01-01 2233 24.8 20.7 29.1 2.3 sábado Fin de semana Llueve
2022-01-02 3162 24.7 19.2 29.7 1.5 domingo Fin de semana Llueve
2022-01-03 7389 27.9 24.1 31.7 6.7 lunes Lunes a viernes Llueve
2022-01-04 7215 28.2 24.8 32.6 3.9 martes Lunes a viernes Llueve
2022-01-05 7611 21.7 16.7 31.7 0.0 miércoles Lunes a viernes No llueve
2022-01-06 8336 22.1 18.8 25.7 0.0 jueves Lunes a viernes No llueve
2022-01-07 8079 23.8 20.6 26.6 0.0 viernes Lunes a viernes No llueve
2022-01-08 3529 24.4 21.8 27.1 0.0 sábado Fin de semana No llueve
2022-01-09 3453 24.9 20.9 29.5 0.0 domingo Fin de semana No llueve
2022-01-10 7825 26.9 22.8 31.3 0.0 lunes Lunes a viernes No llueve

Como puede verse en el siguiente gráfico, la cantidad de registros de viajes de esa duración varía en función de la temperatura del día, de las precipitaciones, y de si se trata de un día de la semana (lunes a viernes) o fin de semana (sábado y domingo), entre otros.

El sistema de Ecobici es un sistema público de transporte y, como tal, es razonable que su uso sea intensivo durante los días hábiles, lo que explica las tendencias separadas que se ven en el gráfico anterior. Sin embargo, en el conjunto de datos no se tiene información de feriados, por lo que hay algunas observaciones del grupo verde (lunes a viernes) que se observan próximos a los del grupo rojo (fines de semana). También hay fines de semana que coinciden con feriados en los que típicamente hay menos movimiento; y también ocurre lo contrario: fines de semana de uso atípico, como el de aquel domingo 18 de diciembre de 2022 en que Argentina se coronó campeón Mundial, y cuya observación, aunque de color rojo (domingo), se ubica dentro de la nube de puntos verdes.

El tamaño de los puntos del gráfico anterior es proporcional al nivel de precipitación (en mm) del día. Sin embargo, una observación (27/02/22) registra una precipitación tan alta (más de 240 mm) que limita la posibilidad de apreciar qué ocurre, en general, cuando llueve y las lluvias no son tan extremas en términos de precipitación acumulada (acá una noticia al respecto).

Datos del 27 de febrero.
fecha n tavg tmin tmax prcp dia tipo_dia lluvia
2022-02-27 1573 23.1 21.8 25.6 246.9 domingo Fin de semana Llueve

Para lo que sigue, removemos esa observación.

Código
datos <- datos[-58, ]
ggplotly(
  ggplot(data = datos, aes(
    x = tavg,
    y = n,
    key = fecha,
    size = prcp,
    color = tipo_dia
  )) +
    labs(x = "Temperatura media", y = "Cantidad de usos de Ecobici") +
    geom_point() +
    scale_color_manual(values = c("Fin de semana" = "deeppink2", "Lunes a viernes" = "dodgerblue2")) +
    geom_smooth(method = "lm",
                formula = y ~ poly(x, 2)) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

En efecto, los puntos más grandes de cada “nube” de color se encuentran ubicados por debajo de la tendencia general del resto de los puntos de su clase. Es decir, los días con mayor nivel de precipitación, la cantidad de usos del sistema de Ecobici se reduce notablemente, tanto para días hábiles como fines de semana. En particular, las tendencias por tipo de día se observan más “limpias” cuando se filtra por días en los que no se registran precipitaciones, como se observa a continuación.

Código
ggplotly(
  ggplot(
    data = filter(datos, lluvia == "No llueve"),
    aes(
      x = tavg,
      y = n,
      key = fecha,
      color = tipo_dia
    )
  ) +
    labs(x = "Temperatura media", y = "Cantidad de usos de Ecobici") +
    geom_point() +
    scale_color_manual(values = c("Fin de semana" = "deeppink2", "Lunes a viernes" = "dodgerblue2")) +
    geom_smooth(method = "lm",
                formula = y ~ poly(x, 2)) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

2.1.1 Primeros ajustes con temperatura y precipitaciones

Se incorpora la variable de precipitaciones (prcp) además de la temperatura (tavg) a un modelo de regresión para predecir la cantidad de bicicletas utilizadas por día (n). En esta primera exploración, no se distingue por tipo de día (tipo_dia).

Código
fitlm = lm(n ~ tavg + prcp, data = datos)

Call:
lm(formula = n ~ tavg + prcp, data = datos)

Residuals:
    Min      1Q  Median      3Q     Max 
-7328.4 -3839.4   707.9  3262.7  5908.4 

Coefficients:
            Estimate Std. Error t value             Pr(>|t|)    
(Intercept)  6737.93     671.79  10.030 < 0.0000000000000002 ***
tavg           83.27      36.56   2.278              0.02333 *  
prcp         -116.44      39.00  -2.986              0.00302 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3677 on 359 degrees of freedom
Multiple R-squared:  0.03235,   Adjusted R-squared:  0.02696 
F-statistic: 6.001 on 2 and 359 DF,  p-value: 0.002733

El coeficiente estimado para la variable del nivel de precipitación es \(-116.44\), lo que sugiere que el incremento en el nivel de lluvia hace disminuir la cantidad de bicicletas que se usan en un día, razonablemente con lo esperado y observado.

Lo contrario ocurre con la temperatura, cuyo coeficiente estimado es \(83.27\), que sugiere que el aumento de temperatura incrementa el uso del sistema Ecobici.

Para lo que sigue, trabajamos con una reducción inicial de los datos a los días “lluviososo y templados”, es decir, a las observaciones que registran precipitación no nula y temperatura media inferior a 25°, e incorporamos la variable de precipitaciones en un modelo de regresión múltiple.

Código
datosfilt <- filter(datos,
                    lluvia == "Llueve",
                    tavg < 25)
ggplotly(
  ggplot(data = datosfilt, aes(
    x = tavg,
    y = n,
    key = fecha,
    size = prcp,
    color = tipo_dia
  )) +
    labs(x = "Temperatura media", y = "Cantidad de usos de Ecobici") +
    geom_point() +
    scale_color_manual(values = c("Fin de semana" = "deeppink2", "Lunes a viernes" = "dodgerblue2")) +
    geom_smooth(method = "lm",
                formula = y ~ x) +
    theme_classic(),
  source = "select",
  tooltip = c("key")
)

2.1.1.1 Días de semana lluviosos y templados

Código
datosfilt <- filter(datos,
                    lluvia == "Llueve",
                    tipo_dia == "Lunes a viernes",
                    tavg < 25)
fitlm = lm(n ~ tavg + prcp, data = datosfilt)
summary(fitlm)

Call:
lm(formula = n ~ tavg + prcp, data = datosfilt)

Residuals:
    Min      1Q  Median      3Q     Max 
-6996.6 -1537.5   -29.4  2145.9  4274.0 

Coefficients:
            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  6376.65    1422.03   4.484 0.0000386 ***
tavg          186.20      80.94   2.301    0.0253 *  
prcp         -102.49      46.93  -2.184    0.0334 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2610 on 54 degrees of freedom
Multiple R-squared:  0.1259,    Adjusted R-squared:  0.09356 
F-statistic:  3.89 on 2 and 54 DF,  p-value: 0.0264

2.1.1.2 Fines de semana lluviosos y templados

Código
datosfilt <- filter(datos,
                    lluvia == "Llueve",
                    tipo_dia == "Fin de semana",
                    tavg < 25)

fitlm = lm(n ~ tavg + prcp, data = datosfilt)
summary(fitlm)

Call:
lm(formula = n ~ tavg + prcp, data = datosfilt)

Residuals:
     Min       1Q   Median       3Q      Max 
-1735.57  -607.12   -54.45   517.62  1882.70 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3611.0469   908.5880   3.974 0.000691 ***
tavg           0.0722    48.7403   0.001 0.998832    
prcp         -64.1289    24.7465  -2.591 0.017032 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 904 on 21 degrees of freedom
Multiple R-squared:  0.2635,    Adjusted R-squared:  0.1934 
F-statistic: 3.757 on 2 and 21 DF,  p-value: 0.04028

2.1.2 Predicción

Para una primera evaluación de estos modelos, buscamos predecir la cantidad de usos del sistema Ecobici para un día de semana, con temperatura media de 24° y con un nivel de precipitaciones de 5 mm.

Nueva observación a predecir.
tavg prcp tipo_dia
24 5 Lunes a viernes

Ajustamos diferentes modelos de acuerdo con la exploración inicial y vemos las predicciones y sus intervalos de confianza de nivel \(95\%\).

Código
datosfilt <- filter(datos,
                    lluvia == "Llueve",
                    tipo_dia == "Lunes a viernes",
                    tavg < 25)

m1 <- lm(n ~ 1, data = datos)
m2 <- lm(n ~ 1, data = datosfilt)
m3 <- lm(n ~ tavg, data = datos)
m4 <- lm(n ~ tavg, data = datosfilt)
m5 <- lm(n ~ tavg + prcp, data = datos)
m6 <- lm(n ~ tavg + prcp, data = datosfilt)

predichos <- rbind(
  predict(m1, nd, interval = "prediction"),
  predict(m2, nd, interval = "prediction"),
  predict(m3, nd, interval = "prediction"),
  predict(m4, nd, interval = "prediction"),
  predict(m5, nd, interval = "prediction"),
  predict(m6, nd, interval = "prediction")
)

predichos <- cbind(predichos, predichos[, 3] - predichos[, 2])

rownames(predichos) <- c(
  "Modelo 1: Todos los datos -> mean(n)",
  "Modelo 2: LaV, lluvia, <25° -> mean(n)",
  "Modelo 3: Todos los datos -> tavg",
  "Modelo 4: LaV, lluvia, <25° -> tavg",
  "Modelo 5: Todos los datos -> tavg + prcp",
  "Modelo 6: LaV, lluvia, <25° -> tavg + prcp"
)

colnames(predichos) <- c("Pred", "linf", "lsup", "long")

knitr::kable(data.frame(predichos), caption = "Predicciones con diferentes ajustes.")
Predicciones con diferentes ajustes.
Pred linf lsup long
Modelo 1: Todos los datos -> mean(n) 8020.412 679.5616 15361.26 14681.70
Modelo 2: LaV, lluvia, <25° -> mean(n) 9008.351 3469.1432 14547.56 11078.42
Modelo 3: Todos los datos -> tavg 8408.683 1075.0282 15742.34 14667.31
Modelo 4: LaV, lluvia, <25° -> tavg 9844.809 4300.5957 15389.02 11088.43
Modelo 5: Todos los datos -> tavg + prcp 8154.161 897.8224 15410.50 14512.68
Modelo 6: LaV, lluvia, <25° -> tavg + prcp 10333.054 4948.6154 15717.49 10768.88

Como es de esperar, el modelo que da lugar a un intervalo de predicción de menor longitud para esta nueva observación es el que incorpora datos de temperatura y precipitaciones, pero que fue construido con el dataset reducido a días de semana, templados y con lluvias.

2.2 Modelo completo: temperatura, precipitaciones y tipo de día

Buscamos un modelo más versátil y con buena capacidad predictiva. Para lo que sigue, transformamos la variable tipo_dia en una categórica (finde) representando por 1 a los días de fin de semana, y por 0, a los días de semana. Trabajamos con el dataset completo.

Código
datos_tr <- datos %>%
  mutate(finde = ifelse(tipo_dia == "Lunes a viernes", 0, 1)) %>%
  select(c(1, 2, 3, 6, 10))

knitr::kable(datos_tr[1:10, ], caption = "Datos con variable categórica para tipo de día, primeras 10 observaciones.")
Datos con variable categórica para tipo de día, primeras 10 observaciones.
fecha n tavg prcp finde
2022-01-01 2233 24.8 2.3 1
2022-01-02 3162 24.7 1.5 1
2022-01-03 7389 27.9 6.7 0
2022-01-04 7215 28.2 3.9 0
2022-01-05 7611 21.7 0.0 0
2022-01-06 8336 22.1 0.0 0
2022-01-07 8079 23.8 0.0 0
2022-01-08 3529 24.4 0.0 1
2022-01-09 3453 24.9 0.0 1
2022-01-10 7825 26.9 0.0 0

Evaluamos un modelo que incorpora los datos de temperatura, precipitaciones y tipo de día a través de la variable categórica creada.

Código
fitlm = lm(n ~ poly(tavg, 2) + prcp + finde, data = datos_tr)
summary(fitlm)

Call:
lm(formula = n ~ poly(tavg, 2) + prcp + finde, data = datos_tr)

Residuals:
    Min      1Q  Median      3Q     Max 
-7852.9  -882.7   159.1  1245.6  3643.8 

Coefficients:
                Estimate Std. Error t value             Pr(>|t|)    
(Intercept)     10137.43     125.46  80.803 < 0.0000000000000002 ***
poly(tavg, 2)1   7648.92    1967.85   3.887             0.000121 ***
poly(tavg, 2)2 -18509.72    1940.26  -9.540 < 0.0000000000000002 ***
prcp             -123.97      20.57  -6.027        0.00000000417 ***
finde           -6614.07     224.73 -29.432 < 0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1933 on 357 degrees of freedom
Multiple R-squared:  0.734, Adjusted R-squared:  0.731 
F-statistic: 246.2 on 4 and 357 DF,  p-value: < 0.00000000000000022
Código
coef <- round(fitlm$coefficients, 0)

Los coeficiente estimados sugieren que la cantidad basal de usos del sistema es de \(10137\) y que, ceteris paribus, ocurre lo siguiente:

  • como la relación entre la cantidad de usos y la temperatura es modelada con un polinomio de grado 2 y con coeficientes \(7649\) y \(-18510\), para cada grado en la variable temperatura respectivamente, se penaliza la cantidad de usos por temperaturas extremas (comportamiento que ya habíamos comentado en el capítulo 1),

  • los usos disminuyen por la presencia de lluvia, a razón de \(-124\) por cada mm de precipitaciones registrado y,

  • el mayor impacto en la cantidad de usos reside en el tipo de día, registrando una reducción de \(6614\) usos los fines de semana respecto de los días de semana.

2.2.1 Predicción

Volvemos a predecir la cantidad de usos del sistema Ecobici para un día de semana, con temperatura media de 24° y con un nivel de precipitaciones de 5 mm y comparamos con los predichos anteriores.

Código
nd <- data.frame(tavg = 24, prcp = 5, finde = 0)

predicho_nuevo <- predict(fitlm, nd, interval = "prediction")
predicho_nuevo <-
  cbind(predicho_nuevo, predicho_nuevo[, 3] - predicho_nuevo[, 2])

colnames(predicho_nuevo) <- c("Pred", "linf", "lsup", "long")
rownames(predicho_nuevo) <-
  c("Modelo completo: Todos los datos -> tavg + tavg^2 + prcp + finde")

knitr::kable(data.frame(rbind(predichos, predicho_nuevo)), caption = "Predicciones con diferentes ajustes.")
Predicciones con diferentes ajustes.
Pred linf lsup long
Modelo 1: Todos los datos -> mean(n) 8020.412 679.5616 15361.26 14681.700
Modelo 2: LaV, lluvia, <25° -> mean(n) 9008.351 3469.1432 14547.56 11078.415
Modelo 3: Todos los datos -> tavg 8408.683 1075.0282 15742.34 14667.311
Modelo 4: LaV, lluvia, <25° -> tavg 9844.809 4300.5957 15389.02 11088.426
Modelo 5: Todos los datos -> tavg + prcp 8154.161 897.8224 15410.50 14512.677
Modelo 6: LaV, lluvia, <25° -> tavg + prcp 10333.054 4948.6154 15717.49 10768.878
Modelo completo: Todos los datos -> tavg + tavg^2 + prcp + finde 9823.279 6005.6077 13640.95 7635.343

Como es de esperar, la predicción dada por el modelo completo parece ser más precisa que las de los restantes. Más aún, como el modelo estima a partir del conjunto de datos completo, su desempeño se mantiene, incluso para la predicción de la cantidad de usos del sistema Ecobici más generales, como por ejemplo, para un fin de semana, con temperatura media de 25°, sin lluvias, y en relación con los predichos anteriores.

Código
nd2 <- data.frame(tavg = 20, prcp = 0, finde = 1)

knitr::kable(nd2, caption = "Otra nueva observación a predecir.")
Otra nueva observación a predecir.
tavg prcp finde
20 0 1
Código
predicho_nuevo <- predict(fitlm, nd2, interval = "prediction")
predicho_nuevo <-
  cbind(predicho_nuevo, predicho_nuevo[, 3] - predicho_nuevo[, 2])
colnames(predicho_nuevo) <- c("Pred", "linf", "lsup", "long")
rownames(predicho_nuevo) <-
  c("Modelo completo: Todos los datos -> tavg + tavg^2 + prcp + finde")

predichos <- rbind(
  predict(m1, nd2, interval = "prediction"),
  predict(m2, nd2, interval = "prediction"),
  predict(m3, nd2, interval = "prediction"),
  predict(m4, nd2, interval = "prediction"),
  predict(m5, nd2, interval = "prediction"),
  predict(m6, nd2, interval = "prediction")
)

predichos <- cbind(predichos, predichos[, 3] - predichos[, 2])

rownames(predichos) <- c(
  "Modelo 1: Todos los datos -> mean(n)",
  "Modelo 2: LaV, lluvia, <25° -> mean(n)",
  "Modelo 3: Todos los datos -> tavg",
  "Modelo 4: LaV, lluvia, <25° -> tavg",
  "Modelo 5: Todos los datos -> tavg + prcp",
  "Modelo 6: LaV, lluvia, <25° -> tavg + prcp"
)

colnames(predichos) <- c("Pred", "linf", "lsup", "long")

knitr::kable(data.frame(rbind(predichos, predicho_nuevo)), caption = "Predicciones con diferentes ajustes.")
Predicciones con diferentes ajustes.
Pred linf lsup long
Modelo 1: Todos los datos -> mean(n) 8020.412 679.5616 15361.262 14681.700
Modelo 2: LaV, lluvia, <25° -> mean(n) 9008.351 3469.1432 14547.559 11078.415
Modelo 3: Todos los datos -> tavg 8156.240 834.1490 15478.330 14644.181
Modelo 4: LaV, lluvia, <25° -> tavg 9307.742 3842.4732 14773.011 10930.538
Modelo 5: Todos los datos -> tavg + prcp 8403.300 1158.5107 15648.090 14489.579
Modelo 6: LaV, lluvia, <25° -> tavg + prcp 10100.688 4761.4766 15439.899 10678.422
Modelo completo: Todos los datos -> tavg + tavg^2 + prcp + finde 4555.102 728.3893 8381.814 7653.425

Mientras todas las demás predicciones rondan valores entre \(8000\) y \(10000\), el modelo completo predice alrededor de \(4300\) usos, dando lugar, además, al intervalo de menor longitud observada. Es decir, el modelo de regresión múltiple que parece más adecuado para el problema es:

n ~ tavg + tavg^2 + prcp + finde.


3 Acerca de los datos

A continuación, se detallan aspectos de los datasets que conformaron el dataset reducido para el desarrollo del ejemplo, a la vez que se incluyen las fuentes de los datos y el código utilizado para pre-procesarlo con la sintaxis de tidyverse. De esta forma, puede fácilmente replicarse y/o adaptarse si así se lo desea.

El dataset reducido con el que se desarrolló el ejemplo y que surge de tal pre-procesamiento, es climabici de la librería datosIC.

3.1 Sobre el dataset de clima

Los datos de este ejemplo corresponden a datos de clima del año 2022 tomados de la base de datos meteorológicos y climáticos de MeteoStat (disponibles acá). En particular, se consideran los datos de la estación meteorológica de Aeroparque (ID 87582), desde el 1ro de enero de 2022 hasta el 31 de diciembre de 2022, y un conjunto reducido de variables.

Código
clima <-
  read_csv("./fuente/02_regresion_multiple/registro_tiempo_aeroparque.csv") %>%
  select(c(1:5, 7:8, 10))

3.2 Sobre el dataset de Ecobici

Los datos de este ejemplo corresponden a datos de uso del sistema Ecobici de la Ciudad de Buenos Aires (disponibles acá). En particular, se consideran los datos del año 2022 correspondientes a viajes de entre 5 minutos y 1 hora de duración.

Ecobici es el sistema de transporte público de bicicletas de la Ciudad de Buenos Aires, que tiene estaciones automáticas con bicicletas a disposición las 24 horas, todos los días del año. El sistema es gratuito para todas las personas residentes del país de lunes a viernes (días hábiles) con hasta cuatro viajes de 30 minutos cada uno. Sin embargo, si se utiliza por un tiempo mayor que el indicado o durante los fines de semana, existen diferentes pases con variados costos. A modo de referencia, el pase que habilita a hacer 6 viajes diarios de hasta 60 minutos cada uno cualquier día de la semana tiene un costo de $1.785 (junio 2023).

Código
trips <- read_csv(
  "./fuente/02_regresion_multiple/trips_2022.csv",
  col_types = cols(fecha_origen_recorrido = col_datetime(format = "%Y-%m-%d %H:%M:%S"))
) %>%
  mutate(fecha = format(as_date(ymd_hms(
    fecha_destino_recorrido
  )))) %>%
  filter(duracion_recorrido > 300 && duracion_recorrido < 3600) %>%
  group_by(fecha) %>%
  count() %>%
  mutate(fecha = as_date(fecha))

3.3 Dataset pre-procesado: climabici

Para reducir los datos al estudio de interés, se crea un dataset conjunto, climabici, a partir de los datos de clima y de uso del sistema Ecobici, en el que se dispone de las siguientes variables.

  • fecha: fecha, en el formato año-mes-día.
  • n: cantidad de registros de uso del sistema EcoBici en la fecha indicada.
  • tmed: temperatura media (°C) registrada en esa fecha.
  • tmin: temperatura mínima (°C) registrada en esa fecha.
  • tmax: temperatura máxima (°C) registrada en esa fecha.
  • prcp: precipitaciones (mm) registrada en esa fecha.
  • dia: día de la semana de la fecha indicada.
  • tipo_dia: tipo de día (Fin de semana o Lunes a viernes) de la fecha indicada.
  • lluvia: condición de lluvia (Llueve: prcp>0, No llueve: prcp=0) de la fecha indicada.
Código
trips <- trips %>%
  filter(fecha >= min(clima$date) & fecha <= max(clima$date))

datos <- left_join(trips, clima, by = c("fecha" = "date")) %>%
  drop_na() %>%
  mutate(
    dia = weekdays(fecha),
    tipo_dia = ifelse(dia %in% c("sábado", "domingo"), "Fin de semana", "Lunes a viernes"),
    lluvia = ifelse(prcp == 0, "No llueve", "Llueve")
  ) 

El dataset climabici está disponible en la librería datosIC.

Código
library(datosIC)
climabici
Dataset reducido disponible en la librería 'datosIC'.
fecha n tavg tmin tmax prcp dia tipo_dia lluvia
2022-01-01 2233 24.8 20.7 29.1 2.3 sábado Fin de semana Llueve
2022-01-02 3162 24.7 19.2 29.7 1.5 domingo Fin de semana Llueve
2022-01-03 7389 27.9 24.1 31.7 6.7 lunes Lunes a viernes Llueve
2022-01-04 7215 28.2 24.8 32.6 3.9 martes Lunes a viernes Llueve
2022-01-05 7611 21.7 16.7 31.7 0.0 miércoles Lunes a viernes No llueve
2022-01-06 8336 22.1 18.8 25.7 0.0 jueves Lunes a viernes No llueve
2022-01-07 8079 23.8 20.6 26.6 0.0 viernes Lunes a viernes No llueve
2022-01-08 3529 24.4 21.8 27.1 0.0 sábado Fin de semana No llueve
2022-01-09 3453 24.9 20.9 29.5 0.0 domingo Fin de semana No llueve
2022-01-10 7825 26.9 22.8 31.3 0.0 lunes Lunes a viernes No llueve
Código
sessionInfo()
R version 4.2.3 (2023-03-15 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22621)

Matrix products: default

locale:
[1] LC_COLLATE=Spanish_Argentina.utf8  LC_CTYPE=Spanish_Argentina.utf8   
[3] LC_MONETARY=Spanish_Argentina.utf8 LC_NUMERIC=C                      
[5] LC_TIME=Spanish_Argentina.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] datosIC_0.0.0.9000 devtools_2.4.5     usethis_2.1.6      knitr_1.42        
 [5] kableExtra_1.3.4   plotly_4.10.1      ggfortify_0.4.16   lubridate_1.9.2   
 [9] forcats_1.0.0      stringr_1.5.0      dplyr_1.1.2        purrr_1.0.1       
[13] readr_2.1.4        tidyr_1.3.0        tibble_3.2.1       ggplot2_3.4.2     
[17] tidyverse_2.0.0   

loaded via a namespace (and not attached):
 [1] nlme_3.1-162      fs_1.6.1          webshot_0.5.5     httr_1.4.5       
 [5] tools_4.2.3       profvis_0.3.7     utf8_1.2.3        R6_2.5.1         
 [9] lazyeval_0.2.2    mgcv_1.8-42       colorspace_2.1-0  urlchecker_1.0.1 
[13] withr_2.5.0       tidyselect_1.2.0  gridExtra_2.3     prettyunits_1.1.1
[17] processx_3.8.0    curl_5.0.0        compiler_4.2.3    cli_3.6.1        
[21] rvest_1.0.3       xml2_1.3.5        labeling_0.4.2    scales_1.2.1     
[25] callr_3.7.3       systemfonts_1.0.4 digest_0.6.31     rmarkdown_2.21   
[29] svglite_2.1.1     pkgconfig_2.0.3   htmltools_0.5.5   sessioninfo_1.2.2
[33] fastmap_1.1.1     highr_0.10        htmlwidgets_1.6.2 rlang_1.1.0      
[37] rstudioapi_0.14   shiny_1.7.4       generics_0.1.3    jsonlite_1.8.4   
[41] crosstalk_1.2.0   magrittr_2.0.3    Matrix_1.5-4      Rcpp_1.0.10      
[45] munsell_0.5.0     fansi_1.0.4       lifecycle_1.0.3   stringi_1.7.12   
[49] yaml_2.3.7        pkgbuild_1.4.0    grid_4.2.3        promises_1.2.0.1 
[53] crayon_1.5.2      miniUI_0.1.1.1    lattice_0.21-8    splines_4.2.3    
[57] hms_1.1.3         ps_1.7.4          pillar_1.9.0      pkgload_1.3.2    
[61] glue_1.6.2        evaluate_0.20     data.table_1.14.8 remotes_2.4.2    
[65] vctrs_0.6.1       tzdb_0.3.0        httpuv_1.6.9      gtable_0.3.4     
[69] cachem_1.0.7      xfun_0.39         mime_0.12         xtable_1.8-4     
[73] later_1.3.0       viridisLite_0.4.2 memoise_2.0.1     timechange_0.2.0 
[77] ellipsis_0.3.2   

4 Referencias