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 ...
base_datos$Time <- 1:nrow(base_datos) # Índice para representar el tiempo
head(base_datos)
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 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} \]
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.
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.
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.
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\)).
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.
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.
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 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 \]
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.
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\)).
El error estándar residual es 2.334, lo que indica el promedio de las desviaciones entre las temperaturas observadas y las predichas.
\(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.
\(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.
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:
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\)).
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\)).
El coeficiente cuadrático (\(\beta_2 = -0.0008\)) refleja un efecto curvilíneo leve, pero no es estadísticamente significativo (\(p = 0.992\)).
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 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 \]
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.
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.
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.
\(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.
\(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.
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:
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.
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.
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.
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.
Intercepto (\(\beta_0 = 10.92\)):
Coeficiente lineal (\(\beta_1 = -5.33\)):
Coeficiente cuadrático (\(\beta_2 = 1.33\)):
Coeficiente cúbico (\(\beta_3 = -0.074\)):
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.
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.
# 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).
Min: -1.94644, 1Q: -0.61277, Median: 0.01088, 3Q: 0.36184, Max: 2.44604.
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.
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.
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.
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:
df (Grados de libertad):
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.
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.
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.
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.
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.
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.
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.
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)
# 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))
# 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
}
# 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))