O século XXI está testemunhando a ascensão das mudanças climáticas como um desafio significativo devido aos seus impactos ambientais e socioeconômicos devastadores e condições climáticas extremas tornaram-se mais frequentes e severas nas últimas décadas como resultado da atividade humana. De acordo com as projeções climáticas do sexto Relatório de Avaliação (AR6) do Painel Intergovernamental sobre Mudanças Climáticas (IPCC) derivadas de diferentes modelos climáticos globais do Projeto de Intercomparação de Modelos Acoplados Fase 6 (CMIP6), a temperatura da superfície global nas duas primeiras décadas do século XXI (2001-2020) foi cerca de 1 °C (faixa de 0,84-1,10 °C) superior à do período pré-industrial (1850-1900). Como consequência, são esperados efeitos ainda mais severos e irreversíveis, entre eles uma maior ocorrência de eventos extremos de chuva, colocando em risco especialmente para as sociedades mais vulneráveis, que podem não ter os recursos necessários para lidar e/ou se adaptar rapidamente a ela.
A região Nordeste do Brasil é a região semiárida mais densamente povoada do mundo e sua população é altamente vulnerável devido o desenvolvimento econômico baixo, onde cerca de 45% da população vive na pobreza. Nessa região, projetam-se reduções na precipitação total, acompanhadas de um aumento em eventos de chuva intensa e maior aridez, intensificando a severidade das secas na região semiárida. Assim, compreender os efeitos das mudanças climáticas nessa região é essencial para que ações de adaptação e mitigação sejam tomadas.
Em estudos de mudanças climáticas, os modelos climáticos globais são instrumentos frequentemente utilizados para pesquisar o sistema climático mundial, abrangendo períodos históricos e projetados. A nova geração de Modelos de Circulação Geral, que inclui o CMIP6, utilizou um novo conjunto de cenários SSP para concentrações e um novo ano de início, e os modelos climáticos globais foram atualizados com novas versões, utilizando de Shared Socioeconomic Pathways (SSPs) para considerar aspectos sociais, econômicos e tecnológicos que podem impactar as emissões, resultando em uma compreensão mais completa de possíveis cenários futuros. Os cinco cenários (SSP1–1.9, SSP1–2.6, SSP2–4.5, SSP3–7.0 e SSP5–8.5), preveem um aumento de temperatura de 1,5 °C no futuro próximo (2021–2040) e de 3,3–5,7 °C no futuro distante (2081–2100) no cenário de emissão mais extremo.
No entanto, os dados oriundos de modelos climáticos geralmente possuem erros sistemáticos, e é necessário realizar o procedimento de correção de tendência dos dados de saída dos modelos climáticos.
O objetivo desse projeto é corrigir esses dados de precipitação a partir de dados observados da estção meteorológica do INMET localizada no munícipio de Arcoverde-PE para ser aplicado à estudos de modelagem hidrológica na bacia representativa do Alto Ipanema, semiárido de Pernambuco.
O estudo utilizou um conjunto de dados provenientes de dois Modelos Climáticos de Circulação Global, o MIROC6, disponibilizados pelo CLIMBra – Climate Change Dataset for Brazil, que fornece as projeções dos modelos climáticos tanto em sua forma bruta quanto com correção de viés. Por tanto, nesse estudo optou-se por utilizar o dado bruto disponível na plataforma, disponível no formato de grid, com uma resolução espacial de 0,25º x0,25º, para que pudesse ser aplicado outro método de correção de viés.
Os pacotes a seguir são necessários para a execução do código desenvolvido nesse projeto.
| Pacotes | Utilização |
|---|---|
| library(knitr) | Formatação de tabelas e saída em documentos RMarkdown com a função kable |
| library(kableExtra) | Estilização avançada de tabelas (funções como kable_styling, column_spec, etc.) |
| library(qmap) | Correção de viés em séries temporais com métodos como fitQmapRQUANT |
| library(dplyr) | Manipulação de dados (filter, mutate, group_by, summarise, etc.) |
| library(lubridate) | Manipulação de datas com funções como month, year, ymd |
| library(ggplot2) | Criação de gráficos com a gramática do ggplot2 |
| library(ncdf4) | Leitura e manipulação de arquivos NetCDF (funções open.nc, var.get.nc, print.nc) |
| library(writexl) | Exportação de dados para arquivos Excel (.xlsx) com a função write_xlsx |
| library(utils) | Visualização de data frames com a função View() |
| library(base) | Funções básicas do R como as.Date, data.frame, abs, which.min, cat |
Os dados da precipitação do período histórico (1980 a 2013) para o modelo climático MIROC6 foram baixados pelo CLIMBRA e carregados no RStudio. Os dados baixados do dataset vem no formato .netCDF, onde mapeia os dados de precipitação diária tanto para o período histórico (1980 a 2013), quanto para o período futuro (2015 a 2100). Dessa forma, para análise exploratória dos dados é necessário utilizar o pacote ncdf4 para fazer a leitura e a extração desses dados.
mod_hist <- nc_open("MIROC6-pr-hist.nc")
A base de dados utilizada neste projeto está armazenada no formato NetCDF e corresponde à variável climática de precipitação total diária (pr), proveniente do modelo MIROC6 no cenário histórico, conforme o experimento CMIP6. A grade espacial é composta por 168 pontos de longitude e 162 de latitude, totalizando 27.216 coordenadas espaciais distintas. A dimensão temporal é composta por 12.419 registros diários, cobrindo um longo período a partir de 1º de janeiro de 1980. As variáveis contidas no arquivo incluem: longitude (lon), latitude (lat), tempo (time) e precipitação (pr), sendo esta última medida em milímetros (mm).
Para extrair os dados do modelo, é necessário informar as coordenadas geográficas da estação meteorológica de interesse. No caso deste estudo, a estação do INMET localizada em Arcoverde encontra-se dentro de um pixel com resolução espacial de 0,25º x 0,25º. Portanto, é preciso identificar e selecionar o pixel mais próximo às coordenadas da estação para garantir maior representatividade dos dados.
Além disso, deve-se definir o intervalo temporal a ser analisado. Neste trabalho, será considerado todo o período disponível no conjunto de dados, de 1980 a 2013. Esse intervalo de aproximadamente 30 anos é amplamente adotado em estudos de caracterização climatológica, por permitir uma compreensão robusta dos padrões e do comportamento hidrológico da região.
# Ler as variáveis de latitude, longitude e tempo
lat <- ncvar_get(mod_hist, "lat")
lon <- ncvar_get(mod_hist, "lon")
tempo <- ncvar_get(mod_hist, "time")
# Definir a data de início do modelo
start_date <- as.Date("1980-01-01")
timestamps <- as.Date(tempo, origin = start_date)
# Coordenadas da estação meteorológica
lat_alvo <- -8.4336111
lon_alvo <- -37.0552777
# Encontrar os índices mais próximos
lat_index <- which.min(abs(lat - lat_alvo))
lon_index <- which.min(abs(lon - lon_alvo))
# Verificação das coordenadas realmente lidas
cat("Latitude selecionada:", lat[lat_index], "\n")
## Latitude selecionada: -8.375
cat("Longitude selecionada:", lon[lon_index], "\n")
## Longitude selecionada: -37.125
# Ler apenas a série temporal para o ponto desejado
pcp_serie <- ncvar_get(mod_hist, "pr",
start = c(lon_index, lat_index, 1),
count = c(1, 1, -1))
# Criar dataframe com a série temporal
df_mod_hist <- data.frame(
data = timestamps,
latitude = lat[lat_index],
longitude = lon[lon_index],
precipitacao = pcp_serie
)
head(df_mod_hist)
## data latitude longitude precipitacao
## 1 1980-01-01 -8.375 -37.125 2.429550
## 2 1980-01-02 -8.375 -37.125 3.311334
## 3 1980-01-03 -8.375 -37.125 3.601833
## 4 1980-01-04 -8.375 -37.125 2.990139
## 5 1980-01-05 -8.375 -37.125 0.000000
## 6 1980-01-06 -8.375 -37.125 7.105043
# Fechar o arquivo NetCDF
nc_close(mod_hist)
#View(df_mod_hist)
head(df_mod_hist)
## data latitude longitude precipitacao
## 1 1980-01-01 -8.375 -37.125 2.429550
## 2 1980-01-02 -8.375 -37.125 3.311334
## 3 1980-01-03 -8.375 -37.125 3.601833
## 4 1980-01-04 -8.375 -37.125 2.990139
## 5 1980-01-05 -8.375 -37.125 0.000000
## 6 1980-01-06 -8.375 -37.125 7.105043
Para a correção de viés é necessário que haja dados observados de precipitação para que o método de correção consiga corrigir a série histórica do modelo climático. Para isso, nesse projeto foi utilizado os dados de precipitação da estação do INMET de Arcoverde-PE (estação 82890) para o mesmo período de dados 1980 a 2013. Para a modelagem, os dados climáticos muitas vezes apresentam falhas que são indicadas pelo valor de -99. Dessa forma, a primeira etapa é identificar se há celulas preenchidas com esse valor.
df_obs_hist <- read.csv("observed-data.csv")
df_obs_hist[df_obs_hist == -99] <- NA
head(df_obs_hist)
## data prec
## 1 1/1/1980 0.0
## 2 1/2/1980 0.0
## 3 1/3/1980 0.0
## 4 1/4/1980 2.8
## 5 1/5/1980 4.3
## 6 1/6/1980 0.0
Da mesma forma que foram extraídos os dados climáticos históricos, foram extraídos os dados para as projeções futuras do MIROC6 SSP2 - 4.5 para o período entre 2025 a 2100.
mod_fut <- nc_open("MIROC6-pr-ssp245-interp.nc")
# Ler as variáveis de latitude, longitude e tempo
lat <- ncvar_get(mod_fut, "lat")
lon <- ncvar_get(mod_fut, "lon")
tempo <- ncvar_get(mod_fut, "time")
# Definir a data de início do modelo
start_date <- as.Date("2025-01-01")
timestamps <- as.Date(tempo, origin = start_date)
# Coordenadas da estação meteorológica
lat_alvo <- -8.4336111
lon_alvo <- -37.0552777
# Encontrar os índices mais próximos
lat_index <- which.min(abs(lat - lat_alvo))
lon_index <- which.min(abs(lon - lon_alvo))
# Verificação das coordenadas realmente lidas
cat("Latitude selecionada:", lat[lat_index], "\n")
## Latitude selecionada: -8.375
cat("Longitude selecionada:", lon[lon_index], "\n")
## Longitude selecionada: -37.125
# Ler apenas a série temporal para o ponto desejado
pcp_serie <- ncvar_get(mod_fut, "pr",
start = c(lon_index, lat_index, 1),
count = c(1, 1, -1))
# Criar dataframe com a série temporal
df_mod_fut <- data.frame(
data = timestamps,
latitude = lat[lat_index],
longitude = lon[lon_index],
precipitacao = pcp_serie
)
head(df_mod_fut)
## data latitude longitude precipitacao
## 1 2025-01-01 -8.375 -37.125 0.28818125
## 2 2025-01-02 -8.375 -37.125 0.82440889
## 3 2025-01-03 -8.375 -37.125 0.16202177
## 4 2025-01-04 -8.375 -37.125 0.52063739
## 5 2025-01-05 -8.375 -37.125 0.63976359
## 6 2025-01-06 -8.375 -37.125 0.09917699
# Fechar o arquivo NetCDF
nc_close(mod_fut)
Para realizar a correção de viés foi usado o método Quantile Mapping (QM), conhecido por sua eficácia na correção de dados de modelos climáticos.Esse método implementa uma técnica de redução de escala por meio do método de mapeamento quantil. Para isso foi utilizado o pacote qmap. Nesse processo, os dados de entrada no código foram os dados observados referentes ao período de 1980 a 2013, os dados referentes ao período histórico simulado pelo modelo MIROC6 e os dados climáticos futuros para o cenário SSP2.4-5. O resultado consistiu em dados climáticos futuros corrigidos.
library(qmap)
library(dplyr)
library(lubridate)
# Carregar os dados
setwd("A:/UFRPE/RCAD/cenariosfuturos")
obs_hist <- read.csv("observed-data.csv", na.strings = c("-99")) # dados observados históricos
mod_hist <- read.csv("MIROC6-1980-2013.csv") # modelo no mesmo período
mod_fut <- read.csv("MIROC6-pr-ssp245-2025-2100.csv") # projeção futura
# Converter colunas de data
obs_hist$data <- as.Date(obs_hist$data, format = "%m/%d/%Y")
mod_hist$data <- as.Date(mod_hist$data)
mod_fut$data <- as.Date(mod_fut$data)
# 3. Criar coluna de mês para agrupar
obs_hist$mes <- month(obs_hist$data)
mod_hist$mes <- month(mod_hist$data)
mod_fut$mes <- month(mod_fut$data)
# Inicializar as colunas dos dados corrigidos
mod_hist$valor_corrigido <- NA
mod_fut$valor_corrigido <- NA
# Loop mensal para ajustar correção e aplicar nos dados históricos e futuros
for (m in 1:12) {
# Subconjuntos dos dados do mês m
obs_m <- obs_hist %>% filter(mes == m)
mod_hist_m <- mod_hist %>% filter(mes == m)
mod_fut_m <- mod_fut %>% filter(mes == m)
if (nrow(obs_m) > 30 & nrow(mod_hist_m) > 30) {
# Ajuste do quantile mapping no histórico
ajuste <- fitQmapRQUANT(
obs = obs_m$prec,
mod = mod_hist_m$precipitacao,
qstep = 0.01,
wet.day = TRUE
)
if (is.null(ajuste)) {
message("Ajuste nulo no mês ", m)
} else {
# Correção para dados históricos
correcao_hist <- doQmapRQUANT(
mod = mod_hist_m$precipitacao,
fit = ajuste,
fobj = ajuste,
x = mod_hist_m$precipitacao
)
idx_hist <- which(mod_hist$mes == m)
mod_hist$valor_corrigido[idx_hist] <- correcao_hist
# Correção para dados futuros
correcao_fut <- doQmapRQUANT(
mod = mod_fut_m$precipitacao,
fit = ajuste,
fobj = ajuste,
x = mod_hist_m$precipitacao
)
idx_fut <- which(mod_fut$mes == m)
mod_fut$valor_corrigido[idx_fut] <- correcao_fut
}
}
}
head(mod_fut)
## data latitude longitude precipitacao mes valor_corrigido
## 1 2025-01-01 -8.375 -37.125 2.7001174 1 0.000000
## 2 2025-01-02 -8.375 -37.125 2.5885489 1 0.000000
## 3 2025-01-03 -8.375 -37.125 1.4309349 1 0.000000
## 4 2025-01-04 -8.375 -37.125 2.5878303 1 0.000000
## 5 2025-01-05 -8.375 -37.125 1.4683005 1 0.000000
## 6 2025-01-06 -8.375 -37.125 0.9699494 1 3.202017
head(mod_hist)
## data latitude longitude precipitacao mes valor_corrigido
## 1 1980-01-01 -8.375 -37.125 4.3405204 1 0.000000
## 2 1980-01-02 -8.375 -37.125 5.5772266 1 0.000000
## 3 1980-01-03 -8.375 -37.125 5.8890891 1 0.000000
## 4 1980-01-04 -8.375 -37.125 5.1917620 1 0.000000
## 5 1980-01-05 -8.375 -37.125 0.8704752 1 0.000000
## 6 1980-01-06 -8.375 -37.125 9.2201557 1 3.202017
# 6. Remover NA dos dados corrigidos
mod_hist <- mod_hist %>% filter(!is.na(valor_corrigido))
mod_fut <- mod_fut %>% filter(!is.na(valor_corrigido))
# Criar dataframe para histórico observado, bruto e corrigido
historico_comp <- data.frame(
data = mod_hist$data,
Observado = obs_hist$prec[match(mod_hist$data, obs_hist$data)],
Modelo_Bruto = mod_hist$precipitacao,
Modelo_Corrigido = mod_hist$valor_corrigido
)
# Calcular médias mensais para histórico
mensal_hist_bruto <- historico_comp %>%
mutate(mes = month(data), ano = year(data)) %>%
group_by(mes) %>%
summarise(media_bruto = mean(Modelo_Bruto, na.rm = TRUE))
print(mensal_hist_bruto)
## # A tibble: 12 × 2
## mes media_bruto
## <dbl> <dbl>
## 1 1 3.96
## 2 2 6.34
## 3 3 8.55
## 4 4 4.77
## 5 5 0.940
## 6 6 0.459
## 7 7 0.393
## 8 8 0.318
## 9 9 0.240
## 10 10 0.259
## 11 11 1.45
## 12 12 2.96
mensal_hist_corr <- historico_comp %>%
mutate(mes = month(data), ano = year(data)) %>%
group_by(mes) %>%
summarise(media_corrigido = mean(Modelo_Corrigido, na.rm = TRUE))
print(mensal_hist_corr)
## # A tibble: 12 × 2
## mes media_corrigido
## <dbl> <dbl>
## 1 1 1.99
## 2 2 2.25
## 3 3 3.45
## 4 4 2.83
## 5 5 2.69
## 6 6 2.81
## 7 7 2.53
## 8 8 1.90
## 9 9 0.614
## 10 10 0.424
## 11 11 0.554
## 12 12 0.941
mensal_obs <- historico_comp %>%
mutate(mes = month(data), ano = year(data)) %>%
group_by(mes) %>%
summarise(media_obs = mean(Observado, na.rm = TRUE))
print(mensal_obs)
## # A tibble: 12 × 2
## mes media_obs
## <dbl> <dbl>
## 1 1 1.97
## 2 2 2.24
## 3 3 3.44
## 4 4 2.82
## 5 5 2.65
## 6 6 2.82
## 7 7 2.54
## 8 8 1.90
## 9 9 0.608
## 10 10 0.425
## 11 11 0.549
## 12 12 0.926
Para avaliar o desempenho do modelo MIROC6 antes e após a correção de viés, foi realizada a comparação entre os dados observados, os dados brutos do modelo e os dados corrigidos por Quantile Mapping (QM). A média mensal da precipitação foi calculada para cada uma das três séries (observada, bruta e corrigida), permitindo a visualização da efetividade do ajuste.
A tabela abaixo mostra essas estatisticas das médias mensais, destacando as diferenças entre o modelo bruto e os dados observados, bem como a aproximação obtida após a correção. Nota-se que a aplicação do QM contribuiu significativamente para reduzir os desvios sistemáticos presentes nos dados simulados, resultando em bons indice de ajuste.
| Mês | Média Obs | Média Hist. Bruto | Média Hist. Corrigido | PBIAS Bruto (%) | PBIAS Corrigido (%) |
|---|---|---|---|---|---|
| Jan | 1.9726221 | 3.9635701 | 1.9857460 | 93.73210 | -8.1630476 |
| Feb | 2.2375940 | 6.3434862 | 2.2488098 | 184.25515 | 2.3447073 |
| Mar | 3.4423171 | 8.5533259 | 3.4538480 | 170.56610 | 16.1208664 |
| Apr | 2.8245690 | 4.7674416 | 2.8251101 | 67.34154 | -4.3330494 |
| May | 2.6463784 | 0.9402165 | 2.6907037 | -63.44738 | 6.2964546 |
| Jun | 2.8165948 | 0.4592991 | 2.8063014 | -83.95607 | -2.8594156 |
| Jul | 2.5425813 | 0.3932864 | 2.5331313 | -85.00557 | -7.1072446 |
| Aug | 1.8963567 | 0.3183898 | 1.8973638 | -83.19325 | -0.7064006 |
| Sep | 0.6079840 | 0.2396329 | 0.6135195 | -60.46614 | 1.7156582 |
| Oct | 0.4245393 | 0.2589991 | 0.4242036 | -39.24253 | -1.4660468 |
| Nov | 0.5490196 | 1.4485868 | 0.5536590 | 163.84973 | 0.8450317 |
| Dec | 0.9263314 | 2.9632071 | 0.9409769 | 225.64884 | 5.5881721 |
A análise da Tabela evidencia que o modelo MIROC6, em sua forma bruta, apresenta uma superestimação significativa da precipitação nos primeiros meses do ano, com destaque para fevereiro (+184,26%), março (+170,57%) e dezembro (+225,65%). Esses desvios são acompanhados por altos valores de RMSE, indicando não apenas viés sistemático, mas também elevada dispersão dos erros em relação aos dados observados. Após a aplicação da correção de viés, observa-se uma redução expressiva nos valores de PBIAS ao longo dos meses, com uma aproximação mais consistente dos valores simulados em relação aos observados. Por exemplo, em janeiro o PBIAS cai de +93,73% para -8,16%, em julho de -85,01% para -7,11% e em agosto de -83,19% para -0,71%. Esses resultados demonstram que a correção foi eficaz em alinhar as médias mensais do modelo com os dados observados, reduzindo substancialmente os erros sistemáticos presentes na simulação bruta.
O gráfico evidencia as variações mensais da precipitação acumulada média
para o modelo bruto, o modelo corrigido e os dados observados, mostrando
que o modelo bruto apresenta viés significativo, superestimando a
precipitação no início do ano e subestimando no meio do ano. A correção
aplicada, provavelmente via quantile mapping, reduz esses erros
sistemáticos, alinhando o modelo corrigido mais próximo dos valores
observados e corrigindo picos exagerados, especialmente em março. Além
disso, as séries apresentam coerência nos meses de baixa precipitação
típicos do inverno da região. A clareza visual do gráfico facilita a
identificação dessas diferenças, reforçando a importância da correção de
viés para garantir a confiabilidade das projeções em estudos
hidrológicos e de gestão de recursos hídricos.
O gráfico de linhas reforça visualmente os achados da tabela. A curva em vermelho, que representa os dados do modelo bruto, apresenta um pico acentuado de precipitação nos primeiros meses do ano, não observado nas séries preta (observado) e azul (corrigido).
Já a curva azul (modelo corrigido) acompanha muito melhor o padrão sazonal observado (linha preta), principalmente nos meses de maior precipitação (jan–jun), e também nas estiagens (jul–nov), indicando uma melhora significativa na representação da sazonalidade climática.
O gráfico da Precipitação Acumulada Mensal Média (2025–2100) evidencia os impactos da aplicação da correção de viés sobre os dados futuros simulados pelo modelo MIROC6 (cenário SSP2-4.5).
Observa-se que os valores do modelo bruto (linha vermelha) apresentam uma acentuada superestimação da precipitação nos meses iniciais do ano, especialmente em março, com totais mensais médios ultrapassando os 220 mm, além de valores artificialmente baixos entre maio e outubro, com precipitação praticamente nula em alguns meses. Após a correção (linha azul), o comportamento da série se torna consideravelmente mais coerente, com uma distribuição mensal mais uniforme e valores compatíveis com os padrões climáticos regionais esperados. A precipitação corrigida mantém um pico no primeiro trimestre, porém em níveis mais realistas (em torno de 100–120 mm), e valores mais equilibrados no restante do ano. Esse ajuste reduz drasticamente os extremos não representativos do modelo bruto, mostrando que a correção de viés foi eficaz para suavizar a superestimação e reconstruir a sazonalidade típica da precipitação ao longo do ano, tornando os dados futuros mais confiáveis para análises e tomadas de decisão em planejamento hídrico.
O gráfico de boxplots da precipitação mensal corrigida para o modelo MIROC6 sob o cenário SSP2-4.5 apresenta a variabilidade e tendência sazonal da precipitação ao longo de três períodos distintos: curto prazo (2025–2047), médio prazo (2048–2073) e longo prazo (2074–2100). Observa-se que os meses de fevereiro a maio concentram os maiores volumes médios de precipitação, com destaque para março, que apresenta os maiores extremos, alcançando valores acima de 600 mm em alguns anos.
Ao comparar os três horizontes temporais, nota-se uma relativa estabilidade nos valores medianos de precipitação mensal, especialmente nos meses chuvosos. Entretanto, a variabilidade interanual tende a ser maior no curto e longo prazo, como indicado pelas caixas mais alongadas e pela presença de vários outliers. Essa característica pode estar associada ao aumento da frequência de eventos extremos, mesmo com médias mensais semelhantes.
Nos meses mais secos (setembro a novembro), os valores de precipitação permanecem baixos nos três períodos, com pouca dispersão, reforçando o padrão sazonal típico da região. Em geral, a correção de viés permitiu gerar séries futuras mais realistas, revelando que embora não haja tendência clara de aumento ou redução das medianas mensais de precipitação ao longo dos anos, a variabilidade e os extremos merecem atenção especial para fins de planejamento e adaptação climática.
A aplicação de uma técnica de correção de viés foi eficaz em reduzir tanto o PBIAS quanto o RMSE na maioria dos meses. Isso evidencia que, embora os modelos climáticos como o MIROC6 tenham limitações sistemáticas (superestimando ou subestimando chuvas), métodos estatísticos de correção podem melhorar substancialmente sua representatividade das condições observadas, tornando-os mais adequados para aplicações hidrológicas e de planejamento.