Introducción

Este documento resuelve la batería de ejercicios 19.27 a 19.39 del capítulo 19 (Newbold, Carlson y Thorne), que cubren suavización exponencial simple, el método de Holt (nivel + tendencia) y Holt-Winters estacional multiplicativo. En lugar de programar manualmente las recursiones \(S_t = \alpha X_t + (1-\alpha)S_{t-1}\), se usan las funciones ses(), holt() y hw() del paquete forecast, fijando explícitamente las constantes de suavización que pide cada enunciado (alpha, beta, gamma) y initial = "simple" para replicar la inicialización clásica del libro (\(S_1 = X_1\), \(T_1 = X_2 - X_1\)). Esto simplifica notablemente el código sin sacrificar el criterio pedido por cada ejercicio.


1. Ejercicio 19.27 — Inventory/Sales Ratio

Modelo: suavización exponencial simple, \(\alpha = 0.4\). Al no incorporar tendencia, el pronóstico para cualquier horizonte \(h\) es simplemente el último valor suavizado \(S_n\).

ratio <- c(1.41, 1.45, 1.57, 1.48, 1.46, 1.44, 1.43, 1.45, 1.43, 1.52, 1.37, 1.33)

fit_27 <- ses(ratio, alpha = 0.4, initial = "simple", h = 4)

kable(data.frame(Año = 1:12, Observado = ratio, Suavizado = round(fitted(fit_27), 4)))
Año Observado Suavizado
1 1.41 1.4100
2 1.45 1.4100
3 1.57 1.4260
4 1.48 1.4836
5 1.46 1.4822
6 1.44 1.4733
7 1.43 1.4600
8 1.45 1.4480
9 1.43 1.4488
10 1.52 1.4413
11 1.37 1.4728
12 1.33 1.4317
kable(data.frame(Año = 13:16, Pronóstico = round(as.numeric(fit_27$mean), 4)))
Año Pronóstico
13 1.391
14 1.391
15 1.391
16 1.391
autoplot(fit_27) + labs(title = "Inventory/Sales Ratio - SES (alpha = 0.4)", x = "Año", y = "Cociente existencias/ventas")

Conclusión. El nivel suavizado se estabiliza en 1.391, valor que se repite sin cambios para los cuatro años proyectados porque un modelo de suavización simple no tiene componente de tendencia: cualquiera que sea el horizonte, el pronóstico es plano. Los últimos datos observados (1.52, 1.37, 1.33) muestran cierta caída que el modelo apenas alcanza a reflejar por el rezago propio de \(\alpha=0.4\); si esa caída resultara sostenida y no un ruido pasajero, convendría migrar a un modelo con tendencia (Holt) en vez de uno de nivel constante.


2. Ejercicio 19.28 — Precio del oro

Modelo: SES, \(\alpha = 0.3\), horizonte de 5 años.

oro <- c(135, 166, 227, 533, 591, 399, 450, 385, 308, 329, 405, 486, 410, 369)

fit_28 <- ses(oro, alpha = 0.3, initial = "simple", h = 5)

kable(data.frame(Año = 1:14, Observado = oro, Suavizado = round(fitted(fit_28), 2)))
Año Observado Suavizado
1 135 135.00
2 166 135.00
3 227 144.30
4 533 169.11
5 591 278.28
6 399 372.09
7 450 380.17
8 385 401.12
9 308 396.28
10 329 369.80
11 405 357.56
12 486 371.79
13 410 406.05
14 369 407.24
kable(data.frame(Año = 15:19, Pronóstico = round(as.numeric(fit_28$mean), 2)))
Año Pronóstico
15 395.77
16 395.77
17 395.77
18 395.77
19 395.77
autoplot(fit_28) + labs(title = "Precio del oro - SES (alpha = 0.3)", x = "Año", y = "Precio ($)")

Conclusión. Se trata de la serie más volátil del taller (rango entre 135 y 591), así que con \(\alpha=0.3\) el suavizado corre por detrás de los picos y valles reales. El nivel final es de 395.8 dólares, cifra que se toma como pronóstico constante para los cinco años siguientes. Como no hay evidencia de una tendencia sostenida —el precio parece oscilar alrededor de una media relativamente estable tras el pico inicial—, una proyección plana es razonable, aunque claramente no anticipará un nuevo repunte o desplome abrupto como los ya vistos en el histórico.


3. Ejercicio 19.29 — Housing Starts

Modelo: SES, \(\alpha = 0.5\), horizonte de 3 años.

starts <- c(8.5, 6.9, 7.1, 7.8, 8.5, 8.0, 7.6, 5.9, 6.5, 7.5, 7.2, 7.0,
            9.9, 11.3, 9.7, 6.3, 5.4, 7.1, 9.1, 9.1, 7.8, 5.7, 4.7, 4.6)

fit_29 <- ses(starts, alpha = 0.5, initial = "simple", h = 3)

kable(data.frame(Año = 1:24, Observado = starts, Suavizado = round(fitted(fit_29), 3)))
Año Observado Suavizado
1 8.5 8.500
2 6.9 8.500
3 7.1 7.700
4 7.8 7.400
5 8.5 7.600
6 8.0 8.050
7 7.6 8.025
8 5.9 7.812
9 6.5 6.856
10 7.5 6.678
11 7.2 7.089
12 7.0 7.145
13 9.9 7.072
14 11.3 8.486
15 9.7 9.893
16 6.3 9.797
17 5.4 8.048
18 7.1 6.724
19 9.1 6.912
20 9.1 8.006
21 7.8 8.553
22 5.7 8.177
23 4.7 6.938
24 4.6 5.819
kable(data.frame(Año = 25:27, Pronóstico = round(as.numeric(fit_29$mean), 3)))
Año Pronóstico
25 5.21
26 5.21
27 5.21
autoplot(fit_29) + labs(title = "Housing Starts - SES (alpha = 0.5)", x = "Año", y = "Viviendas iniciadas por mil habitantes")

Conclusión. Con \(\alpha = 0.5\) el modelo reacciona con fuerza a los datos recientes, y como los últimos años de la serie caen de forma marcada (9.1 → 4.6), el nivel final queda en 5.21, bastante por debajo del promedio histórico (~7.4). Ese es el pronóstico constante para los tres años siguientes. Aunque el modelo no proyecta explícitamente una tendencia bajista, el alto valor de \(\alpha\) hace que el nivel ya absorba buena parte de esa caída reciente, por lo que la predicción resulta razonablemente conservadora frente a una posible estabilización del mercado.


4. Ejercicio 19.30 — Earnings per Share (comparación de \(\alpha\))

Criterio: se ajustan cuatro modelos SES (\(\alpha = 0.2, 0.4, 0.6, 0.8\)) y se elige el de menor MSE dentro de la muestra, usando accuracy() del paquete forecast en vez de calcular el error a mano.

eps <- c(50.2, 33.9, 20.6, 25.4, 32.9, 31.3, 18.8, 14.5, 17.5, 23.6, 20.6, 21.6,
         27.6, 36.5, 49.3, 45.4, 35.6, 30.1, 25.5, 22.4, 12.3, 20.9, 42.8, 86.3,
         73.6, 47.7, 56.6, 53.1)

alphas <- c(0.2, 0.4, 0.6, 0.8)

modelos_eps <- lapply(alphas, function(a) ses(eps, alpha = a, initial = "simple", h = 1))
names(modelos_eps) <- paste0("alpha_", alphas)

tabla_comparacion <- data.frame(
  Alpha = alphas,
  Pronostico_29 = sapply(modelos_eps, function(m) round(as.numeric(m$mean), 3)),
  MSE = sapply(modelos_eps, function(m) round(accuracy(m)[, "RMSE"]^2, 3))
)

kable(tabla_comparacion)
Alpha Pronostico_29 MSE
alpha_0.2 0.2 49.864 294.936
alpha_0.4 0.4 54.850 238.727
alpha_0.6 0.6 54.518 207.659
alpha_0.8 0.8 53.656 184.804
mejor <- tabla_comparacion$Alpha[which.min(tabla_comparacion$MSE)]

ggplot(data.frame(Año = 1:28, Observado = eps), aes(Año, Observado)) +
  geom_line() + geom_point() +
  geom_line(aes(y = fitted(modelos_eps[[1]])), color = "steelblue") +
  geom_line(aes(y = fitted(modelos_eps[[2]])), color = "darkgreen") +
  geom_line(aes(y = fitted(modelos_eps[[3]])), color = "orange") +
  geom_line(aes(y = fitted(modelos_eps[[4]])), color = "firebrick") +
  labs(title = "Earnings per Share - comparación de alphas", y = "EPS")

Conclusión. El MSE dentro de muestra disminuye conforme sube \(\alpha\), y el mínimo se alcanza con \(\alpha = 0.8\) (MSE = 184.804). Tiene sentido: las utilidades por acción de esta compañía son extremadamente volátiles (de 12.3 a 86.3 en pocos años), así que un \(\alpha\) alto —que privilegia la información más reciente y reacciona rápido— captura mejor esos saltos que un \(\alpha\) bajo, pensado para series estables. Con ese criterio, el pronóstico recomendado para el año 29 es de 53.656, aunque vale la pena anotar que el MSE dentro de muestra tiende a favorecer siempre valores de \(\alpha\) cercanos a 1 en series erráticas, por lo que conviene contrastarlo con una validación fuera de muestra antes de adoptarlo de forma definitiva.


5. Ejercicio 19.34 — Industrial Production (Canadá)

Modelo: Holt (nivel + tendencia), \(\alpha = 0.3\), \(\beta = 0.5\), horizonte de 5 años.

prod <- c(79, 74, 78, 80, 83, 88, 85, 87, 79, 84, 91, 10, 100, 106, 112)

fit_34 <- holt(prod, alpha = 0.3, beta = 0.5, initial = "simple", h = 5)

kable(data.frame(Año = 1:15, Observado = prod, Nivel = round(fitted(fit_34), 2)))
Año Observado Nivel
1 79 74.00
2 74 71.25
3 78 68.24
4 80 68.79
5 83 71.46
6 88 75.96
7 85 82.42
8 87 86.42
9 79 89.91
10 84 88.32
11 91 88.06
12 10 90.41
13 100 55.70
14 106 65.05
15 112 79.53
kable(data.frame(Año = 16:20, Pronóstico = round(as.numeric(fit_34$mean), 2)))
Año Pronóstico
16 96.34
17 103.41
18 110.48
19 117.55
20 124.62
autoplot(fit_34) + labs(title = "Producción industrial (Canadá) - Holt", x = "Año", y = "Índice")

Conclusión. El dato del año 12 (10) rompe de manera abrupta la trayectoria ascendente que traía la serie (…, 84, 91, 10, 100, 106, 112); todo indica que se trata de un error de captura y que el valor real rondaría 100. Ese outlier distorsiona momentáneamente la tendencia estimada, pero como el método de Holt vuelve a corregirse con las observaciones siguientes, el efecto se diluye hacia el final de la serie. El nivel y la tendencia finales arrojan pronósticos crecientes para los años 16 a 20 (96.3 … 124.6), coherentes con el fuerte repunte de los últimos tres años observados. Antes de reportar esta cifra de forma definitiva, se recomienda verificar la fuente original del dato atípico, ya que un solo valor mal digitado puede sesgar de forma importante una proyección lineal a 5 años.


6. Ejercicio 19.35 — Hourly Earnings

Modelo: Holt, \(\alpha = 0.3\), \(\beta = 0.4\), horizonte de 3 meses.

earnings <- c(10.58, 10.67, 10.48, 10.59, 10.67, 10.74, 10.74, 10.80, 10.84, 10.87, 10.81, 10.93,
              10.94, 10.96, 11.05, 10.83, 11.05, 11.02, 11.06, 11.11, 11.15, 11.19, 11.22, 11.17)

fit_35 <- holt(earnings, alpha = 0.3, beta = 0.4, initial = "simple", h = 3)

kable(data.frame(Mes = 1:24, Observado = earnings, Nivel = round(fitted(fit_35), 4)))
Mes Observado Nivel
1 10.58 10.6700
2 10.67 10.7222
3 10.48 10.7795
4 10.59 10.7266
5 10.67 10.7062
6 10.74 10.7116
7 10.74 10.7398
8 10.80 10.7595
9 10.84 10.7962
10 10.87 10.8391
11 10.81 10.8819
12 10.93 10.8852
13 10.94 10.9289
14 10.96 10.9638
15 11.05 10.9938
16 10.83 11.0485
17 11.05 10.9946
18 11.02 11.0295
19 11.06 11.0438
20 11.11 11.0678
21 11.15 11.1046
22 11.19 11.1478
23 11.22 11.1952
24 11.17 11.2403
kable(data.frame(Mes = 25:27, Pronóstico = round(as.numeric(fit_35$mean), 4)))
Mes Pronóstico
25 11.2484
26 11.2776
27 11.3068
autoplot(fit_35) + labs(title = "Ingresos por hora - Holt", x = "Mes", y = "USD/hora")

Conclusión. Los ingresos por hora crecen de forma suave y casi monótona a lo largo de los 24 meses, sin cambios bruscos de dirección, por lo que el método de Holt con \(\alpha = 0.3\) y \(\beta = 0.4\) ajusta bien tanto el nivel como la pendiente. El resultado es una tendencia estimada de apenas unos centavos por mes, que proyecta ingresos de 11.248, 11.278 y 11.307 dólares para los meses 25 a 27. Al tratarse de una serie tan estable, el riesgo principal de este pronóstico no es la volatilidad sino la extrapolación lineal indefinida: si la política salarial cambiara (por ejemplo, un aumento negociado), el modelo tardaría varios periodos en “enterarse” del quiebre.


7. Ejercicio 19.36 — Food Prices

Modelo: Holt, \(\alpha = 0.5\), \(\beta = 0.5\), horizonte de 3 meses.

precio <- c(116.6, 117.1, 117.8, 118.9, 119.5, 120.3, 120.6,
            120.8, 121.2, 122.1, 122.6, 123.6, 124.2, 125.0)

fit_36 <- holt(precio, alpha = 0.5, beta = 0.5, initial = "simple", h = 3)

kable(data.frame(Mes = 1:14, Observado = precio, Nivel = round(fitted(fit_36), 3)))
Mes Observado Nivel
1 116.6 117.100
2 117.1 117.225
3 117.8 117.506
4 118.9 118.070
5 119.5 119.110
6 120.3 120.027
7 120.6 120.954
8 120.8 121.479
9 121.2 121.672
10 122.1 121.850
11 122.6 122.452
12 123.6 123.040
13 124.2 123.974
14 125.0 124.797
kable(data.frame(Mes = 15:17, Pronóstico = round(as.numeric(fit_36$mean), 3)))
Mes Pronóstico
15 125.660
16 126.421
17 127.182
autoplot(fit_36) + labs(title = "Índice de precios de alimentos - Holt", x = "Mes", y = "Índice")

Conclusión. El índice de precios de alimentos sube de forma prácticamente lineal durante todo el periodo observado, sin reversiones ni componente estacional visible, así que los valores relativamente altos de \(\alpha\) y \(\beta\) (0.5 y 0.5) son apropiados: el modelo se adapta rápido, pero aquí no hay ruido que “sobre-reaccionar”. La tendencia final se ubica en torno a 0.76 puntos mensuales, lo que da pronósticos de 125.66, 126.42 y 127.18 para los meses 15 a 17 — es decir, un ritmo inflacionario constante que, de mantenerse las condiciones actuales, parece la lectura más plausible de corto plazo.


8. Ejercicio 19.37 — Profit Margins

Modelo: Holt, \(\alpha = 0.6\), \(\beta = 0.6\), horizonte de 2 años.

margen <- c(8.4, 7.4, 7.4, 7.2, 6.3, 7.9, 7.7, 7.1, 8.5, 7.0, 5.7)

fit_37 <- holt(margen, alpha = 0.6, beta = 0.6, initial = "simple", h = 2)

kable(data.frame(Año = 1:11, Observado = margen, Nivel = round(fitted(fit_37), 3)))
Año Observado Nivel
1 8.4 7.400
2 7.4 7.360
3 7.4 6.758
4 7.2 6.749
5 6.3 6.787
6 7.9 6.087
7 7.7 7.420
8 7.1 7.934
9 8.5 7.479
10 7.0 8.505
11 5.7 7.473
kable(data.frame(Año = 12:13, Pronóstico = round(as.numeric(fit_37$mean), 3)))
Año Pronóstico
12 5.642
13 4.875
autoplot(fit_37) + labs(title = "Margen de beneficio - Holt", x = "Año", y = "Margen (%)")

Conclusión. A diferencia de los ejercicios anteriores, aquí la tendencia estimada termina siendo negativa: el margen cae de 8.5% en el año 9 a 5.7% en el año 11, y con \(\alpha=\beta=0.6\) el modelo pondera fuertemente ese deterioro reciente. El resultado son pronósticos decrecientes de 5.64% y 4.88% para los años 12 y 13. Conviene tomar esta proyección con cautela porque Holt extrapola la pendiente de forma lineal e indefinida: si la caída obedece a un choque puntual (un gasto extraordinario, por ejemplo) el modelo subestimaría el margen futuro, mientras que si la presión sobre costos o precios se mantiene, el deterioro proyectado sería incluso optimista.


9. Ejercicio 19.38 — Quarterly Earnings (Holt-Winters estacional)

Modelo: Holt-Winters multiplicativo, \(\alpha = 0.6\), \(\beta = 0.5\), \(\gamma = 0.4\), \(L = 4\), horizonte de 8 trimestres.

ventas_38 <- ts(
  c(0.786, 0.668, 0.863, 0.807, 0.802, 0.670, 0.885, 0.805,
    0.579, 0.423, 0.904, 0.851, 0.430, 0.409, 1.120, 0.958,
    0.680, 0.460, 1.190, 0.830, 0.766, 0.440, 1.020, 0.630,
    0.690, 0.600, 1.130, 0.680),
  frequency = 4
)

fit_38 <- hw(ventas_38, alpha = 0.6, beta = 0.5, gamma = 0.4,
             seasonal = "multiplicative", initial = "simple", h = 8)

kable(data.frame(Trimestre = time(ventas_38), Observado = as.numeric(ventas_38),
                  Nivel = round(as.numeric(fitted(fit_38)), 3)))
Trimestre Observado Nivel
1.00 0.786 0.788
1.25 0.668 0.670
1.50 0.863 0.865
1.75 0.807 0.808
2.00 0.802 0.785
2.25 0.670 0.680
2.50 0.885 0.873
2.75 0.805 0.828
3.00 0.579 0.797
3.25 0.423 0.502
3.50 0.904 0.489
3.75 0.851 0.697
4.00 0.430 0.755
4.25 0.409 0.458
4.50 1.120 0.706
4.75 0.958 0.736
5.00 0.680 0.644
5.25 0.460 0.751
5.50 1.190 1.351
5.75 0.830 0.794
6.00 0.766 0.471
6.25 0.440 0.597
6.50 1.020 1.373
6.75 0.630 0.772
7.00 0.690 0.432
7.25 0.600 0.350
7.50 1.130 1.551
7.75 0.680 1.022
kable(data.frame(Trimestre = time(fit_38$mean), Pronóstico = round(as.numeric(fit_38$mean), 3)))
Trimestre Pronóstico
8.00 0.768
8.25 0.448
8.50 0.780
8.75 0.522
9.00 0.646
9.25 0.367
9.50 0.620
9.75 0.399
autoplot(fit_38) + labs(title = "Quarterly Earnings - Holt-Winters estacional", x = "Trimestre", y = "Beneficio")

Conclusión. Los índices estacionales estimados confirman un patrón muy marcado dentro del año: el tercer trimestre es sistemáticamente el más fuerte y el segundo el más débil, un ciclo que se repite con regularidad en los siete años de historia. El nivel de la serie, en cambio, no muestra una tendencia clara de largo plazo —sube y baja según el año—, por lo que las diferencias entre los dos años proyectados (8 y 9) se explican casi enteramente por la componente estacional y no por crecimiento estructural. Como el modelo pondera fuertemente lo reciente (\(\alpha=0.6\), \(\gamma=0.4\)), conviene interpretar el nivel proyectado como una foto del comportamiento de los últimos ciclos más que como una extrapolación robusta a mediano plazo.


10. Ejercicio 19.39 — Ventas trimestrales (Holt-Winters estacional)

Modelo: Holt-Winters multiplicativo, \(\alpha = 0.5\), \(\beta = 0.4\), \(\gamma = 0.3\), \(L = 4\), horizonte de 8 trimestres.

ventas_39 <- ts(
  c(271, 199, 240, 255, 341, 246, 245, 275, 351, 283, 353, 292,
    401, 282, 306, 291, 370, 242, 281, 274, 356, 245, 304, 279),
  frequency = 4
)

fit_39 <- hw(ventas_39, alpha = 0.5, beta = 0.4, gamma = 0.3,
             seasonal = "multiplicative", initial = "simple", h = 8)

kable(data.frame(Trimestre = time(ventas_39), Observado = as.numeric(ventas_39),
                  Nivel = round(as.numeric(fitted(fit_39)), 2)))
Trimestre Observado Nivel
1.00 271 280.97
1.25 199 208.52
1.50 240 250.51
1.75 255 263.41
2.00 341 273.75
2.25 246 235.75
2.50 245 306.26
2.75 275 297.14
3.00 351 324.89
3.25 283 236.21
3.50 353 304.45
3.75 292 390.21
4.00 401 414.70
4.25 282 294.75
4.50 306 320.41
4.75 291 304.33
5.00 370 374.71
5.25 242 260.34
5.50 281 268.69
5.75 274 262.01
6.00 356 340.20
6.25 245 241.81
6.50 304 277.81
6.75 279 288.38
kable(data.frame(Trimestre = time(fit_39$mean), Pronóstico = round(as.numeric(fit_39$mean), 2)))
Trimestre Pronóstico
7.00 368.76
7.25 257.27
7.50 304.24
7.75 288.52
8.00 381.35
8.25 266.00
8.50 314.51
8.75 298.21
autoplot(fit_39) + labs(title = "Ventas trimestrales - Holt-Winters estacional", x = "Trimestre", y = "Ventas")

Conclusión. El patrón estacional es muy nítido: el primer trimestre de cada año concentra sistemáticamente el mayor volumen de ventas (bastante por encima del promedio), mientras que el segundo trimestre es, con diferencia, el más flojo. A nivel de tendencia, la serie muestra un crecimiento fuerte en los primeros años que luego se estabiliza en los últimos ciclos, de modo que el nivel final queda prácticamente plano. Como resultado, los pronósticos para los ocho trimestres siguientes (años 7 y 8) básicamente replican el mismo patrón estacional sobre un nivel base casi constante, sin un crecimiento adicional relevante — lectura consistente con una empresa que, tras un periodo de expansión, entró en una fase de ventas maduras/estabilizadas.