# CSS-ML: inicializa via mínimos quadrados condicionais, depois refina por MV.
# Mais robusto numericamente que ML puro para certos candidatos.
ajustar_sarima <- function(ordens, serie = co2) {
tryCatch(
Arima(serie,
order = ordens[1:3],
seasonal = list(order = ordens[4:6], period = 12),
method = "CSS-ML"),
error = function(e) {
# fallback para CSS se CSS-ML também falhar
tryCatch(
Arima(serie,
order = ordens[1:3],
seasonal = list(order = ordens[4:6], period = 12),
method = "CSS"),
error = function(e2) NULL
)
}
)
}
candidatos <- list(
"SARIMA(0,1,1)(0,1,1)[12]" = c(0,1,1,0,1,1),
"SARIMA(1,1,1)(0,1,1)[12]" = c(1,1,1,0,1,1),
"SARIMA(0,1,1)(1,1,1)[12]" = c(0,1,1,1,1,1),
"SARIMA(1,1,1)(1,1,1)[12]" = c(1,1,1,1,1,1),
"SARIMA(2,1,1)(0,1,1)[12]" = c(2,1,1,0,1,1),
"SARIMA(0,1,2)(0,1,1)[12]" = c(0,1,2,0,1,1),
"SARIMA(1,1,0)(0,1,1)[12]" = c(1,1,0,0,1,1)
)
fits <- lapply(candidatos, ajustar_sarima)
# Remover modelos que falharam
fits <- Filter(Negate(is.null), fits)
tab_comp <- map_dfr(names(fits), function(nm) {
f <- fits[[nm]]
tibble(
Modelo = nm,
k = length(f$coef),
LogLik = round(f$loglik, 2),
AIC = round(f$aic, 2),
AICc = round(f$aicc, 2),
BIC = round(f$bic, 2)
)
}) |>
arrange(AICc) |>
mutate(
dAIC = round(AIC - min(AIC), 2),
dAICc = round(AICc - min(AICc), 2),
dBIC = round(BIC - min(BIC), 2)
)
tab_comp |>
gt() |>
tab_header(
title = md("**Tabela 2.** Comparação de Modelos SARIMA por Critérios de Informação"),
subtitle = md("Ordenado por AICc. $\\Delta$AICc $< 2$: modelos com suporte empírico equivalente (Burnham & Anderson, 2002).")
) |>
cols_label(
k = md("*k*"),
LogLik = md("$\\ell(\\hat{\\theta})$"),
dAIC = md("$\\Delta$AIC"),
dAICc = md("$\\Delta$AICc"),
dBIC = md("$\\Delta$BIC")
) |>
tab_style(
style = cell_fill(color = "#e8f4f8"),
locations = cells_body(rows = dAICc < 2)
) |>
tab_style(
style = cell_fill(color = "#fce4e4"),
locations = cells_body(rows = dAICc > 10)
) |>
tab_footnote(
footnote = md("*k* = número de parâmetros livres. Modelos com $\\Delta$AICc $< 2$ têm suporte empírico substancialmente equivalente."),
locations = cells_column_labels(columns = k)
)