Metadata: Temperatura, Estación White Rock British - Columbia, Canada.

1. Hallar el mejor modelo para la curva de temperatura.

Cargamos las librerías necesarias y la base de datos:

library(openxlsx)
library(tidyverse)
base_datos <- read.xlsx("primer_asignacion.xlsx", sheet = 1)

base_datos <- as.data.frame(unclass(base_datos),
                             stringsAsFactors = TRUE)

str(base_datos)
## 'data.frame':    11 obs. of  3 variables:
##  $ Year : num  2005 2005 2006 2006 2006 ...
##  $ Month: num  11 12 1 2 3 4 5 6 7 8 ...
##  $ Temp : num  6.1 5.2 7.2 5.5 7.6 10 13.2 16.4 18 16.9 ...

Agregamos una columna de tiempo en meses:

base_datos$Time <- 1:nrow(base_datos) # Índice para representar el tiempo
head(base_datos)

Generamos un gráfico de Temperatura vs. Tiempo:

ggplot(base_datos, aes(x = Time, y = Temp)) +
  geom_point() +
  geom_line() +
  labs(title = "Variación de la temperatura", x = "Tiempo (meses)", y = "Temperatura (°C)")

Modelo lineal simple:

Modelo lineal para la predicción de la temperatura en función del tiempo

model_lin <- lm(Temp ~ Time, data = base_datos)
summary(model_lin)
## 
## Call:
## lm(formula = Temp ~ Time, data = base_datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1500 -1.4950  0.2936  1.3882  2.9609 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   2.8400     1.4227   1.996 0.077028 .  
## Time          1.3555     0.2098   6.462 0.000117 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.2 on 9 degrees of freedom
## Multiple R-squared:  0.8227, Adjusted R-squared:  0.803 
## F-statistic: 41.75 on 1 and 9 DF,  p-value: 0.0001165

El modelo ajustado tiene la siguiente forma general:

\[ \hat{y} = \beta_0 + \beta_1 \cdot x + \epsilon \]

Donde:

  • \(\hat{y}\): Es el Valor Predicho de la variable dependiente (Temp en este caso).

  • \(\beta_0\): Es el Intercepto. Es decir, es el valor de \(\hat{y}\) cuando \(x = 0\).

  • \(\beta_1\): Es la Pendiente. Indica el cambio promedio en \(\hat{y}\) por cada unidad adicional en \(x\).

  • \(x\): Es la Variable Independiente (Time en este caso).

  • \(\epsilon\): Es el Término de Error. Este representa las diferencias entre los valores observados y los predichos.

Con base en los resultados del modelo, podemos escribir la ecuación específica ajustada como:

\[ \hat{\text{Temp}} = 2.8400 + 1.3555 \cdot \text{Time} \]


Relación con la fórmula del modelo:

  1. Intercepto (\(\beta_0\))

    • En la fórmula, el intercepto es \(\beta_0 = 2.8400\).

    • Esto indica que, cuando el tiempo (Time) es igual a 0, la temperatura promedio predicha sería 2.84.

  2. Pendiente (\(\beta_1\))

    • La pendiente es \(\beta_1 = 1.3555\).

    • En la fórmula, este término multiplica la variable independiente Time, lo que significa que por cada unidad adicional en Time, la temperatura promedio predicha aumenta en 1.3555 unidades.

  3. Residuos (\(\epsilon\))

    • Los residuos representan las diferencias entre los valores observados de Temp y los valores predichos por el modelo (\(\hat{\text{Temp}}\)).

    • Los residuos deben estar distribuidos de manera simétrica alrededor de 0.

  4. Errores estándar

    • Intercepto (Std. Error): 1.4227. Representa la incertidumbre asociada con la estimación del intercepto (\(\beta_0\)).

    • Pendiente (Std. Error): 0.2098. Muestra la precisión de la estimación de la pendiente (\(\beta_1\)).

  5. R² (Coeficiente de determinación)

    • R²: 0.8227. Indica que el 82.27% de la variación en la temperatura se explica por el modelo lineal ajustado.

    • R² ajustado: 0.803. Ajusta el valor de \(R^2\) para penalizar el número de predictores en el modelo.

  6. Pruebas de significancia

    • La prueba t para cada coeficiente evalúa si \(\beta_0\) y \(\beta_1\) son significativamente diferentes de 0:

      • Para \(\beta_0\) (intercepto), \(p = 0.077\), lo que indica que no es significativo al nivel del 5%.

      • Para \(\beta_1\) (pendiente), \(p < 0.001\), lo que indica que hay evidencia fuerte de que el tiempo está asociado significativamente con la temperatura.


Interpretación:

El modelo ajustado para analizar la relación entre la temperatura (Temp) y el tiempo (Time) es el siguiente:

\[ \hat{\text{Temp}} = 2.8400 + 1.3555 \cdot \text{Time} \]

En este modelo:

  • El término 2.8400 (\(\beta_0\)) es el valor predicho de la temperatura cuando el tiempo es 0, aunque no es estadísticamente significativo (\(p = 0.077\)).

  • El coeficiente 1.3555 (\(\beta_1\)) indica que por cada unidad adicional de tiempo, la temperatura promedio aumenta en 1.36 unidades (\(p < 0.001\)).

El modelo explica el 82.27% de la variación en la temperatura (\(R^2 = 0.8227\)) y tiene un error estándar residual de 2.2. Esto sugiere que el modelo es adecuado para describir la relación entre tiempo y temperatura, aunque persisten algunos errores de predicción.

Modelo cuadrático:

Modelo cuadrático para la predicción de la temperatura

model_quad <- lm(Temp ~ Time + I(Time^2), data = base_datos)
summary(model_quad)
## 
## Call:
## lm(formula = Temp ~ Time + I(Time^2), data = base_datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1378 -1.5028  0.2928  1.3906  2.9601 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept)  2.8187879  2.5627033   1.100    0.303
## Time         1.3652448  0.9815355   1.391    0.202
## I(Time^2)   -0.0008159  0.0796655  -0.010    0.992
## 
## Residual standard error: 2.334 on 8 degrees of freedom
## Multiple R-squared:  0.8227, Adjusted R-squared:  0.7783 
## F-statistic: 18.56 on 2 and 8 DF,  p-value: 0.0009888

El modelo ajustado incluye un término cuadrático, y la ecuación es la siguiente:

\[ \hat{\text{Temp}} = \beta_0 + \beta_1 \cdot \text{Time} + \beta_2 \cdot \text{Time}^2 \]

Donde:

  • \(\hat{\text{Temp}}\): Temperatura predicha.

  • \(\beta_0\): Intercepto, es el valor de \(\hat{\text{Temp}}\) cuando \(\text{Time} = 0\).

  • \(\beta_1\): Coeficiente del término lineal (\(\text{Time}\)), que indica el cambio promedio en \(\hat{\text{Temp}}\) por cada unidad adicional de tiempo, cuando se mantiene constante el efecto cuadrático.

  • \(\beta_2\): Coeficiente del término cuadrático (\(\text{Time}^2\)), que refleja cómo la relación entre \(\hat{\text{Temp}}\) y \(\text{Time}\) se curva o cambia a medida que el tiempo aumenta.

  • \(\text{Time}\): Variable independiente (tiempo en el modelo).

  • \(\epsilon\): Término de error, que representa las diferencias entre los valores observados y los predichos.

El modelo ajustado es:

\[ \hat{\text{Temp}} = 2.8188 + 1.3652 \cdot \text{Time} - 0.0008 \cdot \text{Time}^2 \]


Relación con la fórmula del modelo:

1. Residuos

Los residuos representan las diferencias entre los valores observados de Temp y los valores predichos (\(\hat{\text{Temp}}\)):

  • Mínimo: -3.1378, indica el mayor valor negativo del error de predicción.

  • Máximo: 2.9601, indica el mayor valor positivo del error de predicción.

  • Los cuartiles (1Q, Mediana, 3Q) describen la dispersión central de los residuos.

2. Coeficientes

  • Intercepto (\(\beta_0 = 2.8188\)):

    Representa la temperatura predicha cuando \(\text{Time} = 0\). El valor no es estadísticamente significativo (\(p = 0.303\)), lo que sugiere que este valor no es fiable por sí mismo.

  • Coeficiente lineal (\(\beta_1 = 1.3652\)):

    Representa el cambio promedio en la temperatura predicha por cada unidad de tiempo adicional, suponiendo que el término cuadrático no cambia. Tampoco es significativo (\(p = 0.202\)).

  • Coeficiente cuadrático (\(\beta_2 = -0.0008\)):

    Representa el cambio en la tasa de aumento de la temperatura (curvatura de la relación). El término cuadrático tampoco es significativo (\(p = 0.992\)).

3. Residuos estándar

El error estándar residual es 2.334, lo que indica el promedio de las desviaciones entre las temperaturas observadas y las predichas.

4. R² y R² ajustado

  • \(R^2 = 0.8227\): El 82.27% de la variación en la temperatura es explicada por el modelo.

  • \(R^2\) ajustado = 0.7783: Penaliza por el aumento de predictores no significativos. Esto indica que la inclusión del término cuadrático no mejoró mucho el modelo.

5. Estadístico F y p-valor

  • \(F = 18.56\): Evalúa si el modelo en su conjunto (con ambos términos) es significativo.

  • \(p = 0.0009888\): Muestra que el modelo global es significativo, aunque los coeficientes individuales no lo son.


Interpretación:

El modelo ajustado para analizar la relación entre la temperatura (Temp) y el tiempo (Time) con un término cuadrático es:

\[ \hat{\text{Temp}} = 2.8188 + 1.3652 \cdot \text{Time} - 0.0008 \cdot \text{Time}^2 \]

En este modelo:

  1. El intercepto (\(\beta_0 = 2.8188\)) representa la temperatura predicha cuando el tiempo es igual a 0, pero no es estadísticamente significativo (\(p = 0.303\)).

  2. El coeficiente lineal (\(\beta_1 = 1.3652\)) indica que la temperatura promedio predicha aumenta aproximadamente 1.36 unidades por cada unidad de tiempo adicional, asumiendo que el efecto cuadrático no cambia. Sin embargo, tampoco es significativo (\(p = 0.202\)).

  3. El coeficiente cuadrático (\(\beta_2 = -0.0008\)) refleja un efecto curvilíneo leve, pero no es estadísticamente significativo (\(p = 0.992\)).

  4. El modelo explica el 82.27% de la variación en la temperatura (\(R^2 = 0.8227\)), pero el término cuadrático no aporta una mejora significativa respecto al modelo lineal anterior.

Aunque el modelo cuadrático es estadísticamente significativo en su conjunto (\(p = 0.0009888\)), los coeficientes individuales no son significativos. Esto sugiere que el término cuadrático no mejora sustancialmente el ajuste, y podría ser innecesario.

Modelo cúbico:

Modelo cúbico para la predicción de la temperatura

model_cube <- lm(Temp ~ Time + I(Time^2) + I(Time^3), data = base_datos)
summary(model_cube)
## 
## Call:
## lm(formula = Temp ~ Time + I(Time^2) + I(Time^3), data = base_datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.9809 -0.7365 -0.3818  0.4260  2.2513 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 10.91970    2.07027   5.275  0.00115 **
## Time        -5.32617    1.42883  -3.728  0.00738 **
## I(Time^2)    1.33450    0.27068   4.930  0.00169 **
## I(Time^3)   -0.07418    0.01487  -4.988  0.00159 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.169 on 7 degrees of freedom
## Multiple R-squared:  0.9611, Adjusted R-squared:  0.9444 
## F-statistic: 57.59 on 3 and 7 DF,  p-value: 2.671e-05

El modelo ajustado incluye términos lineales, cuadráticos y cúbicos, y su ecuación es la siguiente:

\[ \hat{\text{Temp}} = \beta_0 + \beta_1 \cdot \text{Time} + \beta_2 \cdot \text{Time}^2 + \beta_3 \cdot \text{Time}^3 \]

Donde:

  • \(\hat{\text{Temp}}\): Temperatura predicha.

  • \(\beta_0\): Intercepto (valor predicho de la temperatura cuando \(\text{Time} = 0\)).

  • \(\beta_1\): Coeficiente del término lineal (\(\text{Time}\)).

  • \(\beta_2\): Coeficiente del término cuadrático (\(\text{Time}^2\)).

  • \(\beta_3\): Coeficiente del término cúbico (\(\text{Time}^3\)).

  • \(\text{Time}\): Variable independiente (tiempo).

  • \(\epsilon\): Término de error (residuos).

El modelo ajustado con los coeficientes estimados es:

\[ \hat{\text{Temp}} = 10.92 - 5.33 \cdot \text{Time} + 1.33 \cdot \text{Time}^2 - 0.074 \cdot \text{Time}^3 \]


Relación con la fórmula del modelo:

1. Residuos

Los residuos reflejan las diferencias entre los valores observados y los valores predichos por el modelo:

  • Min: -0.9809, indica el mayor valor negativo del error.

  • Max: 2.2513, indica el mayor valor positivo del error.

  • La distribución de los residuos (1Q, Mediana, 3Q) sugiere que la mayoría de los errores están centrados cerca de cero, lo cual es una buena señal de ajuste.

2. Coeficientes

  • Intercepto (\(\beta_0 = 10.92\)):

    Representa la temperatura predicha cuando \(\text{Time} = 0\). Es significativo (\(p = 0.00115\)), indicando que este valor tiene una base estadística sólida.

  • Coeficiente lineal (\(\beta_1 = -5.33\)):

    Representa el cambio promedio en la temperatura predicha por cada unidad de tiempo adicional, ajustando por los efectos cuadráticos y cúbicos. Es significativo (\(p = 0.00738\)), lo que sugiere que tiene un efecto relevante en el modelo.

  • Coeficiente cuadrático (\(\beta_2 = 1.33\)):

    Representa cómo la relación entre \(\text{Temp}\) y \(\text{Time}\) se curva en un nivel cuadrático. Es significativo (\(p = 0.00169\)), indicando que este término mejora el ajuste del modelo.

  • Coeficiente cúbico (\(\beta_3 = -0.074\)):

    Representa cómo la relación se ajusta a una curvatura más compleja en niveles cúbicos. Es significativo (\(p = 0.00159\)), por lo que su inclusión en el modelo está respaldada estadísticamente.

3. Residuos estándar

El error estándar residual es \(1.169\), lo cual indica que, en promedio, los valores predichos difieren de los observados en aproximadamente 1.17 unidades de temperatura.

4. \(R^2\) y \(R^2\) ajustado

  • \(R^2 = 0.9611\): El 96.11% de la variación en la temperatura es explicada por el modelo.

  • \(R^2\) ajustado = 0.9444: Indica un ajuste sólido incluso después de penalizar por la complejidad del modelo.

5. Estadístico F y p-valor

  • \(F = 57.59\): Evalúa si el modelo completo (incluyendo los tres términos) es significativo.

  • \(p = 2.671 \times 10^{-5}\): Indica que el modelo es altamente significativo en su conjunto.


Interpretación:

El modelo ajustado incluye términos lineales, cuadráticos y cúbicos, y la ecuación resultante es:

\[ \hat{\text{Temp}} = 10.92 - 5.33 \cdot \text{Time} + 1.33 \cdot \text{Time}^2 - 0.074 \cdot \text{Time}^3 \]

En este modelo:

  1. El término lineal (\(\beta_1 = -5.33\)) sugiere una tendencia inicial decreciente en la temperatura conforme el tiempo aumenta, pero este efecto se ve modificado por los términos cuadráticos y cúbicos.

  2. El término cuadrático (\(\beta_2 = 1.33\)) introduce una curvatura que refleja un cambio en la tendencia de la temperatura en función del tiempo.

  3. El término cúbico (\(\beta_3 = -0.074\)) agrega una curvatura más compleja para ajustar mejor las fluctuaciones observadas en los datos.

Todos los coeficientes son estadísticamente significativos (\(p < 0.05\)), lo que respalda su inclusión en el modelo. El \(R^2 = 0.9611\) indica que el modelo explica el 96.11% de la variación en los datos, lo que refleja un ajuste excelente.

A pesar de su complejidad, el modelo cúbico parece capturar bien las características de la relación entre la temperatura y el tiempo. Este modelo podría ser útil para realizar predicciones precisas, aunque su interpretación debe considerar la naturaleza no lineal de los términos cuadráticos y cúbicos.

Considerar los términos no lineales:

En un modelo con términos no lineales (cuadráticos o cúbicos), el efecto de la variable independiente (\(\text{Time}\)) sobre la variable dependiente (\(\text{Temp}\)) no es constante. Es decir, el cambio en la temperatura no ocurre de manera uniforme a medida que aumenta el tiempo, sino que depende del valor actual del tiempo, porque los términos \(\text{Time}^2\) y \(\text{Time}^3\) introducen curvas en la relación.

Interpretación considerando los términos no lineales:

  1. Intercepto (\(\beta_0 = 10.92\)):

    • Este es el valor predicho de la temperatura (\(\text{Temp}\)) cuando el tiempo (\(\text{Time}\)) es 0. Sin embargo, en un modelo cúbico, este valor puede no tener un significado práctico si \(\text{Time} = 0\) no tiene relevancia en el contexto de los datos. Es más una referencia matemática.
  2. Coeficiente lineal (\(\beta_1 = -5.33\)):

    • En un modelo lineal simple, este coeficiente representaría el cambio constante en la temperatura por cada unidad adicional de tiempo. Sin embargo, aquí el efecto lineal interactúa con los términos cuadráticos y cúbicos. Al inicio (cuando el tiempo es pequeño), la temperatura disminuye a un ritmo aproximado de 5.33 unidades por unidad de tiempo, pero este efecto se atenúa o intensifica debido a los términos \(\text{Time}^2\) y \(\text{Time}^3\).
  3. Coeficiente cuadrático (\(\beta_2 = 1.33\)):

    • Este término introduce una curvatura en la relación. Un coeficiente positivo indica que, a medida que aumenta el tiempo, la temperatura comienza a aumentar en forma de parábola, contrarrestando en parte el efecto negativo del término lineal. Este efecto es más evidente en valores de tiempo más altos.
  4. Coeficiente cúbico (\(\beta_3 = -0.074\)):

    • Este coeficiente añade un cambio más complejo. Un valor negativo sugiere que, a medida que el tiempo sigue aumentando, la tasa de cambio en la temperatura disminuye y puede incluso revertirse en ciertas regiones. Esto hace que la curva sea más ajustada a los datos, permitiendo capturar patrones complejos como subidas y bajadas en la temperatura.

Interpretación gráfica:

Si graficamos la relación entre \(\text{Temp}\) y \(\text{Time}\), observaríamos que:

  • Inicialmente, la temperatura disminuye (por el término lineal negativo).

  • Luego, comienza a aumentar debido al término cuadrático (\(\text{Time}^2\)), creando una parábola.

  • Finalmente, el término cúbico (\(\text{Time}^3\)) suaviza o invierte esta tendencia en los extremos, dando lugar a una curva que puede subir y bajar.

Esto es lo que significa que la relación no es lineal: el cambio en la temperatura no sigue un patrón constante, sino que varía dependiendo del punto en el tiempo en el que estemos.

Interpretación:

El modelo cúbico captura una relación compleja entre el tiempo y la temperatura. Inicialmente, la temperatura disminuye, pero esta tendencia se invierte gradualmente, y luego se estabiliza o cambia según los valores extremos del tiempo. Los términos cuadráticos y cúbicos del modelo permiten que la curva se ajuste mejor a los datos, explicando patrones no lineales como aumentos y disminuciones en diferentes momentos. Esto sugiere que el efecto del tiempo sobre la temperatura no es uniforme, sino que depende de valores específicos de tiempo, reflejando una relación dinámica y no lineal.

Modelo trigonométrico (estacional):

# Usa seno y coseno para capturar estacionalidad.

# Crear variables de estacionalidad
base_datos$sin_month <- sin(2 * pi * base_datos$Month / 12)
base_datos$cos_month <- cos(2 * pi * base_datos$Month / 12)

head(base_datos)
# Modelo con estacionalidad
model_season <- lm(Temp ~ sin_month + cos_month, data = base_datos)
summary(model_season)
## 
## Call:
## lm(formula = Temp ~ sin_month + cos_month, data = base_datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.94644 -0.61277  0.01088  0.36184  2.44604 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  10.9910     0.3736  29.418 1.93e-09 ***
## sin_month    -3.2925     0.5414  -6.081 0.000296 ***
## cos_month    -5.3010     0.5150 -10.293 6.84e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.228 on 8 degrees of freedom
## Multiple R-squared:  0.9509, Adjusted R-squared:  0.9386 
## F-statistic: 77.48 on 2 and 8 DF,  p-value: 5.809e-06

El modelo ajustado utiliza una representación trigonométrica para capturar el comportamiento periódico o cíclico de las temperaturas a lo largo de los meses. Este enfoque es útil porque la temperatura tiende a variar de manera estacional (en ciclos de 12 meses). Las funciones seno (\(\sin\)) y coseno (\(\cos\)) permiten modelar esta variación cíclica.

La fórmula del modelo es:

\[ \text{Temp} = \beta_0 + \beta_1 \cdot \sin(\text{month}) + \beta_2 \cdot \cos(\text{month}) + \varepsilon \]

Donde:

  • \(\text{Temp}\): Temperatura (variable dependiente).

  • \(\beta_0\): Intercepto, que representa el valor medio de la temperatura.

  • \(\beta_1\): Coeficiente asociado al término \(\sin(\text{month})\), que captura cómo fluctúa la temperatura a lo largo del ciclo de meses en función del seno.

  • \(\beta_2\): Coeficiente asociado al término \(\cos(\text{month})\), que captura otra dimensión del ciclo estacional.

  • \(\varepsilon\): Error residual (las diferencias entre los valores observados y los predichos por el modelo).

Los valores de \(\sin(\text{month})\) y \(\cos(\text{month})\) se calculan como:

\[ \sin(\text{month}) = \sin\left(\frac{2\pi \cdot \text{month}}{12}\right), \quad \cos(\text{month}) = \cos\left(\frac{2\pi \cdot \text{month}}{12}\right) \]

Esto asegura que las funciones sigan un ciclo completo a lo largo de un año (\(12\) meses).


Relación con la fórmula del modelo:

1. Resumen de los residuos:

  • Min: -1.94644, 1Q: -0.61277, Median: 0.01088, 3Q: 0.36184, Max: 2.44604.

    • Los residuos (diferencias entre las temperaturas observadas y predichas) tienen una magnitud pequeña, lo que indica que el modelo ajusta razonablemente bien los datos.

2. Intercepto (\(\beta_0 = 10.9910\)):

  • Este es el valor promedio de la temperatura (\(\text{Temp}\)) cuando \(\sin(\text{month}) = 0\) y \(\cos(\text{month}) = 0\). Esto ocurre matemáticamente en un punto medio del ciclo (por ejemplo, alrededor del inicio de la primavera o el otoño), dependiendo de la configuración de los datos.

3. Coeficiente de \(\sin(\text{month}) (\beta_1 = -3.2925)\):

  • Este coeficiente mide cómo el componente senoidal afecta la temperatura. Un coeficiente negativo indica que el patrón estacional tiene su punto más bajo en la parte del año donde \(\sin(\text{month})\) alcanza su máximo (por ejemplo, durante el verano o el invierno).

4. Coeficiente de \(\cos(\text{month}) (\beta_2 = -5.3010)\):

  • Este coeficiente mide cómo el componente cosenoidal afecta la temperatura. También es negativo, lo que indica que la temperatura disminuye en los puntos del año donde \(\cos(\text{month})\) es máximo (cercano al inicio del ciclo).

Ambos coeficientes (\(\beta_1\) y \(\beta_2\)) contribuyen conjuntamente a describir el ciclo estacional de la temperatura. En términos simples, indican cómo la temperatura fluctúa a lo largo del año, con máximos y mínimos que dependen de la combinación de las funciones seno y coseno.

5. Estadística de ajuste del modelo:

  • Residual standard error: 1.228. Esto indica que las predicciones del modelo tienen un error promedio de ±1.23 unidades en la escala de la temperatura.

  • Multiple \(R^2\): 0.9509. Esto significa que el modelo explica el 95.09% de la variabilidad en las temperaturas, lo que es excelente.

  • Adjusted \(R^2\): 0.9386. El modelo sigue siendo muy bueno incluso ajustando por el número de predictores.

  • \(F\)-statistic (77.48, p-value = \(5.809 \times 10^{-6}\)): El modelo general es altamente significativo, lo que indica que las variables seno y coseno tienen una contribución importante.


Interpretación:

El modelo ajustado utiliza funciones seno y coseno para capturar la naturaleza estacional de las temperaturas. El análisis muestra que el modelo es altamente significativo (\(p < 0.001\)) y explica el 95.09% de la variabilidad en las temperaturas, lo que refleja un ajuste excelente.

El intercepto (\(\beta_0 = 10.99\)) representa el promedio general de las temperaturas cuando los efectos senoidales y cosenoidales están equilibrados. Los coeficientes de \(\sin(\text{month})\) (\(\beta_1 = -3.29\)) y \(\cos(\text{month})\) (\(\beta_2 = -5.30\)) describen cómo varía la temperatura a lo largo del año. Ambos son negativos, lo que indica que los meses donde las funciones seno y coseno alcanzan valores máximos están asociados con temperaturas más bajas.

En conclusión, este modelo es adecuado para describir y predecir el comportamiento cíclico de las temperaturas a lo largo del año, capturando de manera precisa las fluctuaciones estacionales.

Criterio de Información de Akaike:

library(flextable)

# Calcular AIC de los modelos
aic_results <- AIC(model_lin, model_quad, model_cube, model_season)

# Convertir los resultados de AIC a data frame
aic_table <- as.data.frame(aic_results)
aic_table$Modelo <- rownames(aic_table)  # Agregar nombres de los modelos como columna
rownames(aic_table) <- NULL  # Eliminar nombres de las filas

# Reemplazar los nombres de los modelos con descripciones más claras
aic_table$Modelo <- recode(
  aic_table$Modelo,
  model_lin = "Modelo Lineal Simple",
  model_quad = "Modelo Cuadrático",
  model_cube = "Modelo Cúbico",
  model_season = "Modelo Trigonométrico"
)

# Reordenar columnas para que "Modelo" sea la primera
aic_table <- aic_table %>%
  select(Modelo, df, AIC) %>%  # Seleccionar y reordenar columnas
  rename(
    `Grados de libertad (df)` = df,
    `Criterio de Información de Akaike (AIC)` = AIC
  )

# Crear tabla estática para Word con flextable
flextable(aic_table) %>%
  set_header_labels(
    Modelo = "Modelo",
    `Grados de libertad (df)` = "Grados de libertad (df)",
    `Criterio de Información de Akaike (AIC)` = "Criterio de Información de Akaike (AIC)"
  ) %>%
  autofit() %>%  # Ajustar automáticamente el ancho de las columnas
  align(align = "center", part = "all") %>%  # Alinear todo al centro
  bold(part = "header") %>%  # Encabezados en negrita
  fontsize(size = 12, part = "all") %>%  # Tamaño de fuente
  font(fontname = "Times New Roman", part = "all") %>%  # Fuente Times New Roman
  border_remove() %>%  # Remover bordes predeterminados
  border_outer(border = officer::fp_border(width = 1, color = "black")) %>%  # Borde exterior negro
  border_inner_h(border = officer::fp_border(width = 1, color = "black")) %>%  # Bordes horizontales internos
  border_inner_v(border = officer::fp_border(width = 1, color = "black"))  # Bordes verticales internos

Modelo

Grados de libertad (df)

Criterio de Información de Akaike (AIC)

Modelo Lineal Simple

3

52.35623

Modelo Cuadrático

4

54.35608

Modelo Cúbico

5

39.68001

Modelo Trigonométrico

4

40.22913

El resultado presentado compara diferentes modelos estadísticos para predecir la variable de interés (en este caso, probablemente la temperatura) utilizando diferentes estructuras o términos en el modelo. Las métricas clave incluidas son:

  1. df (Grados de libertad):

    • Este valor corresponde al número de parámetros ajustados en el modelo, incluyendo el intercepto. Cada predictor en el modelo incrementa los grados de libertad (df). Los modelos con más términos tendrán mayores grados de libertad, ya que están ajustando más parámetros.
  2. AIC (Criterio de Información de Akaike):

    • El AIC es una métrica utilizada para evaluar y comparar la calidad de diferentes modelos ajustados a un conjunto de datos. Se calcula como: \[ AIC = -2 \ln(\text{verosimilitud}) + 2 \cdot k \] Donde \(k\) es el número de parámetros ajustados (grados de libertad).

    • Interpretación del AIC:

      • Penaliza la complejidad del modelo (más parámetros) y busca un balance entre ajuste y parsimonia.

      • Un AIC más bajo indica un modelo más eficiente para describir los datos sin sobreajustarse.


Análisis por modelo:

  1. model_lin (Modelo Lineal):

    • Grados de libertad (df): 3 (intercepto + un predictor).

    • AIC: 52.35623.

    • Este modelo es el más simple, probablemente ajustando una relación lineal directa entre las variables (como \(\text{Temp} = \beta_0 + \beta_1 \cdot \text{Time}\)). Sin embargo, tiene un AIC más alto que otros modelos, indicando que no es el mejor para describir los datos.

  2. model_quad (Modelo Cuadrático):

    • Grados de libertad (df): 4 (intercepto + 2 predictores: término lineal y término cuadrático, \(\text{Time}^2\)).

    • AIC: 54.35608.

    • Aunque añade complejidad al incluir el término cuadrático, su AIC es más alto que el modelo cúbico y el modelo estacional. Esto indica que la adición del término cuadrático no mejora suficientemente el ajuste como para compensar la penalización por la complejidad.

  3. model_cube (Modelo Cúbico):

    • Grados de libertad (df): 5 (intercepto + 3 predictores: términos lineal, cuadrático y cúbico).

    • AIC: 39.68001.

    • Este modelo tiene el AIC más bajo, lo que indica que proporciona el mejor equilibrio entre ajuste y complejidad. Es probable que los datos tengan un comportamiento no lineal que el término cúbico describe de manera eficiente.

  4. model_season (Modelo Estacional):

    • Grados de libertad (df): 4 (intercepto + 2 predictores: seno y coseno).

    • AIC: 40.22913.

    • Este modelo utiliza funciones trigonométricas para capturar la estacionalidad. Tiene un AIC ligeramente más alto que el modelo cúbico, pero sigue siendo mucho mejor que los modelos lineal y cuadrático.


Selección del mejor modelo:

  • Modelo cúbico (model_cube) tiene el AIC más bajo (39.68001), lo que sugiere que es el modelo que mejor describe los datos, balanceando ajuste y simplicidad.

  • Aunque el modelo estacional (model_season) también tiene un AIC bajo (40.22913), su penalización por complejidad es mayor. Sin embargo, si existe un razonamiento teórico sólido para modelar la estacionalidad, podría ser preferible en términos de interpretación y aplicabilidad.


Interpretación:

Se compararon cuatro modelos estadísticos para ajustar la temperatura a lo largo del tiempo. El modelo cúbico (\(\text{Temp} = \beta_0 + \beta_1 \cdot \text{Time} + \beta_2 \cdot \text{Time}^2 + \beta_3 \cdot \text{Time}^3\)) fue el más eficiente, con un AIC de 39.68001, lo que indica que proporciona el mejor equilibrio entre ajuste y simplicidad. Este resultado sugiere que la relación entre la temperatura y el tiempo tiene un comportamiento no lineal complejo que incluye un término cúbico.

El modelo estacional (\(\text{Temp} = \beta_0 + \beta_1 \cdot \sin(\text{month}) + \beta_2 \cdot \cos(\text{month})\)) también mostró un desempeño cercano (AIC = 40.22913) y podría ser una alternativa válida si la naturaleza periódica de los datos es un aspecto clave del análisis.

En conclusión, el modelo cúbico es estadísticamente el más eficiente, pero la elección del modelo final debe considerar la aplicabilidad y el contexto del fenómeno estudiado.

Predicción con los modelos:

base_datos$Pred_Lin <- predict(model_lin)
base_datos$Pred_Quad <- predict(model_quad)
base_datos$Pred_Cube <- predict(model_cube)
base_datos$Pred_Season <- predict(model_season)

head(base_datos)

Visualización de resultados:

# Crear etiquetas personalizadas para meses y años en base_datos
base_datos$Mes_Año <- paste(base_datos$Month, base_datos$Year, sep = "-")

# Graficar
ggplot(base_datos, aes(x = Time, y = Temp)) +
  geom_point(aes(y = Temp), color = "#030303") +
  geom_line(aes(y = Pred_Lin, color = "Lineal", linetype = "Lineal"), alpha = 0.7) +
  geom_point(aes(y = Pred_Lin, color = "Lineal"), shape = 16, size = 2.8, alpha = 0.7) +
  geom_line(aes(y = Pred_Quad, color = "Cuadrático", linetype = "Cuadrático"), alpha = 0.9) +
  geom_point(aes(y = Pred_Quad, color = "Cuadrático"), shape = 20, size = 2, alpha = 0.9) +
  geom_line(aes(y = Pred_Cube, color = "Cúbico", linetype = "Cúbico")) +
  geom_line(aes(y = Pred_Season, color = "Trigonométrico", linetype = "Trigonométrico")) +
  labs(title = "Comparación de modelos", x = "Tiempo (meses)", y = "Temperatura (°C)", color = "Color", linetype = "Modelo") +
  scale_color_manual(
    values = c("Lineal" = "#FF3030", "Cuadrático" = "#8B3A62", 
               "Cúbico" = "#1E90FF", "Trigonométrico" = "#CD661D")
  ) +
  scale_linetype_manual(
    values = c("Lineal" = "solid", "Cuadrático" = "dotted", 
               "Cúbico" = "twodash", "Trigonométrico" = "dashed")
  ) +
  # Personalización del eje x para mostrar etiquetas de meses y años
  scale_x_continuous(
    breaks = base_datos$Time,  # Mostrar cada punto en el eje
    labels = base_datos$Mes_Año  # Mostrar "Mes-Año" como etiquetas
  ) +
  # Rotar etiquetas del eje x para mejor visualización
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Predicción de los dos meses siguientes:

# Asegurar que nuevos_datos tenga las columnas Month y Year correctamente definidas
nuevos_datos <- data.frame(
  Time = nrow(base_datos) + 1:2,  # Continuación del índice temporal
  Month = c(10, 11),  # Meses de predicción
  Year = rep(2006, 2),  # Año 2006 para ambos meses
  Temp = NA  # Temperatura desconocida
)

# Crear las variables trigonométricas necesarias para el modelo estacional
nuevos_datos$sin_month <- sin(2 * pi * nuevos_datos$Month / 12)
nuevos_datos$cos_month <- cos(2 * pi * nuevos_datos$Month / 12)

# Añadir predicciones de los modelos
nuevos_datos$Pred_Cube <- predict(model_cube, newdata = nuevos_datos)
nuevos_datos$Pred_Season <- predict(model_season, newdata = nuevos_datos)

# Reordenar columnas para que coincidan
faltantes <- setdiff(names(base_datos), names(nuevos_datos))
nuevos_datos[faltantes] <- NA
nuevos_datos <- nuevos_datos[names(base_datos)]

# Combinar los datos originales y los nuevos
temp_data_ext <- rbind(base_datos, nuevos_datos)

# Crear etiquetas personalizadas de nuevo
temp_data_ext$Mes_Año <- paste(temp_data_ext$Month, temp_data_ext$Year, sep = "-")

library(DT)
library(knitr)
library(flextable)
library(officer)
library(htmlwidgets)
library(dplyr)

# Excluir columnas sin_month y cos_month
temp_data_ext_2 <- temp_data_ext %>%
  select(-sin_month, -cos_month, -Mes_Año)

# Tabla interactiva para HTML
if (knitr::is_html_output()) {
  datatable(
    temp_data_ext_2,
    extensions = 'Buttons',  # Extensión para botones interactivos
    class = "compact hover stripe",
    options = list(
      responsive = TRUE,  # Diseño responsivo
      scrollX = TRUE,  # Habilitar desplazamiento horizontal
      dom = 'lfrtip',  # Incluir botones y elementos
      buttons = c('colvis'),  # Botón para visibilidad de columnas
      lengthMenu = list(c(4, 8, -1), c('4', '8', 'All')),  # Menú de filas
      pageLength = 4  # Número de filas mostradas por defecto
    )
  ) %>%
    # Forzar ajuste dinámico al renderizar la tabla
    htmlwidgets::onRender(
      "function(el, x) {
        $(el).find('table').DataTable().columns.adjust();
      }"
    ) %>%
    formatStyle(
      columns = colnames(temp_data_ext_2),
      fontSize = '12px',  # Tamaño de fuente
      fontFamily = 'Times New Roman',  # Tipo de fuente
      lineHeight = '1.5'  # Interlineado
    ) %>%
    formatStyle(
      columns = colnames(temp_data_ext_2),
      `text-align` = 'center'  # Alinear al centro
    )
}
# Tabla estática para Word (siguiendo las normas APA)
if (!knitr::is_html_output()) {
  flextable(temp_data_ext_2) %>%
    set_header_labels(
      Year = "Año",
      Month = "Mes",
      Temp = "Temperatura (°C)",
      Time = "Tiempo (meses)",
      Pred_Lin = "Predicción: Modelo Lineal",
      Pred_Quad = "Predicción: Modelo Cuadrático",
      Pred_Cube = "Predicción: Modelo Cúbico",
      Pred_Season = "Predicción: Modelo Trigonométrico"
    ) %>%
    autofit() %>%  # Ajustar automáticamente el ancho de las columnas
    align(align = "center", part = "all") %>%  # Alinear todo al centro
    bold(part = "header") %>%  # Encabezados en negrita
    fontsize(size = 12, part = "all") %>%  # Tamaño de fuente
    font(fontname = "Times New Roman", part = "all") %>%  # Fuente Times New Roman
    border_remove() %>%  # Remover bordes predeterminados
    border_outer(border = officer::fp_border(width = 1, color = "black")) %>%  # Borde exterior negro
    border_inner_h(border = officer::fp_border(width = 1, color = "black")) %>%  # Bordes horizontales internos
    border_inner_v(border = officer::fp_border(width = 1, color = "black"))  # Bordes verticales internos
}

Visualización de resultados:

# Graficar con los datos completos
ggplot(temp_data_ext, aes(x = Time)) +
  geom_point(data = temp_data_ext %>% filter(!is.na(Temp)), aes(y = Temp), color = "#030303") +
  geom_line(data = temp_data_ext %>% filter(!is.na(Pred_Lin)), aes(y = Pred_Lin, color = "Lineal", linetype = "Lineal"), alpha = 0.7) +
  geom_point(data = temp_data_ext %>% filter(!is.na(Pred_Lin)), aes(y = Pred_Lin, color = "Lineal"), shape = 16, size = 2.8, alpha = 0.7) +
  geom_line(data = temp_data_ext %>% filter(!is.na(Pred_Quad)), aes(y = Pred_Quad, color = "Cuadrático", linetype = "Cuadrático"), alpha = 0.9) +
  geom_point(data = temp_data_ext %>% filter(!is.na(Pred_Quad)), aes(y = Pred_Quad, color = "Cuadrático"), shape = 20, size = 2, alpha = 0.9) +
  geom_line(data = temp_data_ext %>% filter(!is.na(Pred_Cube)), aes(y = Pred_Cube, color = "Cúbico", linetype = "Cúbico")) +
  geom_line(data = temp_data_ext %>% filter(!is.na(Pred_Season)), aes(y = Pred_Season, color = "Trigonométrico", linetype = "Trigonométrico")) +
  geom_point(data = nuevos_datos, aes(x = Time, y = Pred_Cube), color = "#1E90FF", size = 3, shape = 17) +
  geom_point(data = nuevos_datos, aes(x = Time, y = Pred_Season), color = "#CD661D", size = 3, shape = 18) +
  geom_text(data = nuevos_datos, aes(x = Time, y = Pred_Cube, label = round(Pred_Cube, 1)), vjust = -0.1, hjust = 1.4, color = "#1E90FF") +
  geom_text(data = nuevos_datos, aes(x = Time, y = Pred_Season, label = round(Pred_Season, 1)), vjust = -0.5, hjust = -0.1, color = "#CD661D") +
  geom_vline(xintercept = nrow(base_datos), linetype = "solid", color = "#008B00", linewidth = 1, alpha = 0.5) +  # Línea vertical
  labs(
    title = "Predicciones de los modelos para meses 10 y 11",
    x = "Tiempo (meses)",
    y = "Temperatura (°C)",
    color = "Color",
    linetype = "Modelo"
  ) +
  scale_color_manual(
    values = c("Lineal" = "#FF3030", "Cuadrático" = "#8B3A62", 
               "Cúbico" = "#1E90FF", "Trigonométrico" = "#CD661D")
  ) +
  scale_linetype_manual(
    values = c("Lineal" = "solid", "Cuadrático" = "dotted", 
               "Cúbico" = "twodash", "Trigonométrico" = "dashed")
  ) +
  annotate("text", x = nrow(base_datos) + 1.2, y = max(temp_data_ext$Temp, na.rm = TRUE), 
           label = "Predicción", color = "#008B00", angle = 0, vjust = -0.1) +
  # Personalización del eje x para mostrar meses y años
  scale_x_continuous(
    breaks = temp_data_ext$Time,  # Mostrar cada punto en el eje
    labels = temp_data_ext$Mes_Año  # Mostrar "Mes-Año" como etiquetas
  ) +
  # Rotación de etiquetas para mejor visualización
  theme(axis.text.x = element_text(angle = 45, hjust = 1))