# Build pcode-to-name lookup from polygon table (all admin-1, not just those with SEAS5 data)
df_admin_names <- tbl(pg_con(), "polygon") |>
mutate(across(pcode, as.character)) |>
filter(adm_level == 1, pcode %in% CANDIDATE_PCODES) |>
select(pcode, name) |>
collect()
pcode_to_name <- setNames(df_admin_names$name, df_admin_names$pcode)
relabel_config <- function(config_name) {
# "GTM: GT20+GT16" → "GTM: Chiquimula + Alta Verapaz"
parts <- str_split(config_name, ": ", n = 2)[[1]]
prefix <- parts[1]
pcodes <- str_split(parts[2], "\\+")[[1]]
names <- ifelse(pcodes %in% names(pcode_to_name), pcode_to_name[pcodes], pcodes)
paste0(prefix, ": ", paste(names, collapse = " + "))
}
# Define AOI configurations to compare
aoi_configs <- list(
# Guatemala
"GTM: GT20" = c("GT20"),
"GTM: GT20+GT16" = c("GT20", "GT16"),
"GTM: GT20+GT19" = c("GT20", "GT19"),
"GTM: GT20+GT02" = c("GT20", "GT02"),
"GTM: GT20+GT21+GT02+GT19" = c("GT20", "GT21", "GT02", "GT19"),
"GTM: GT20+GT21+GT02" = c("GT20", "GT21", "GT02"),
"GTM: GT16" = c("GT16"),
"GTM: GT15" = c("GT15"),
"GTM: GT14" = c("GT14"),
"GTM: GT14+GT15" = c("GT14", "GT15"),
# Honduras
"HND: HN07+HN08" = c("HN07", "HN08"),
# El Salvador
"SLV: SV01+SV12" = c("SV01", "SV12"),
"SLV: SV01+SV12+SV13" = c("SV01", "SV12", "SV13"),
"SLV: SV01+SV12+SV13+SV05" = c("SV01", "SV12", "SV13", "SV05")
)
# Relabel config names to use admin names
names(aoi_configs) <- map_chr(names(aoi_configs), relabel_config)
# Build weighted-mean aggregated datasets for each config
aggregate_config <- function(pcodes, config_name) {
df_fcst <- df_seas5_seasonal |>
filter(pcode %in% pcodes) |>
left_join(df_weights |> select(pcode, seas5_n_upsampled_pixels), by = "pcode")
df_obs <- df_era5_seasonal |>
filter(pcode %in% pcodes) |>
left_join(df_weights |> select(pcode, seas5_n_upsampled_pixels), by = "pcode")
df_joined <- df_fcst |>
left_join(
df_obs |> select(pcode, year, window, obs_mm),
by = c("pcode", "year", "window")
) |>
filter(!is.na(obs_mm)) |>
group_by(year, window, leadtime, issued_date) |>
summarise(
fcst_mm = weighted.mean(fcst_mm, w = seas5_n_upsampled_pixels),
obs_mm = weighted.mean(obs_mm, w = seas5_n_upsampled_pixels),
.groups = "drop"
) |>
mutate(aoi_config = config_name)
df_joined
}
df_all_configs <- imap_dfr(aoi_configs, ~aggregate_config(.x, .y))
# Add country-level configs
df_country_joined <- df_seas5_country_seasonal |>
left_join(
df_era5_country_seasonal |> select(pcode, year, window, obs_mm),
by = c("pcode", "year", "window")
) |>
filter(!is.na(obs_mm)) |>
mutate(
aoi_config = case_when(
iso3 == "GTM" ~ "GTM: Country",
iso3 == "HND" ~ "HND: Country",
iso3 == "SLV" ~ "SLV: Country"
)
)
df_all_configs <- bind_rows(df_all_configs, df_country_joined)