Introduction

  • Question 1 asks for the expected maximum annual temperature between 2020 and 2100 in the Democratic Republic of the Congo, at 95% confidence, and whether this significantly differs from the expected maximum annual temperature between 1880 and 1960. The dataset is comprised of both historic temperatures and Earth System Model predictions.
  • Question 2 asks for the year in which the Democratic Republic of the Congo’s climate permanently departs from the climate window it has been in for the last 10,000 years. The point of departure is defined as the point after which it will experience a year comparable to the stable period in human history only once in a hundred years.

The underlying message is to understand how ongoing climate inaction is pushing us beyond the relative climate stability experienced throughout the Holocene over the past 10,000 years. For the most populated countries on Earth, this has even greater consequences for future human and ecological well-being.


Data loading & basic checks

Loading data

# setting the working directory and loading the data
setwd("~/Library/CloudStorage/OneDrive-UniversiteitLeiden/Quantitative Research Skills/Assignments")
temperatureDRC <- read.csv("./GFDL_temperature_Democratic Republic of the Congo.csv")

# checking the 1,2,3
str(temperatureDRC) # 463,848 monthly observations of mean temperature (in K) for 1850-2100 in DRC
## 'data.frame':    463848 obs. of  4 variables:
##  $ year: int  1850 1850 1850 1850 1850 1850 1850 1850 1850 1850 ...
##  $ mon : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ day : int  16 16 16 16 16 16 16 16 16 16 ...
##  $ temp: num  296 294 295 296 296 ...
head(temperatureDRC, 15) # checking first 15 observations to ensure data loaded correctly
##    year mon day     temp
## 1  1850   1  16 296.4053
## 2  1850   1  16 294.1421
## 3  1850   1  16 294.9741
## 4  1850   1  16 295.8656
## 5  1850   1  16 296.0283
## 6  1850   1  16 296.2125
## 7  1850   1  16 296.2301
## 8  1850   1  16 296.2278
## 9  1850   1  16 295.2651
## 10 1850   1  16 295.6245
## 11 1850   1  16 295.8370
## 12 1850   1  16 296.1259
## 13 1850   1  16 295.5696
## 14 1850   1  16 294.8364
## 15 1850   1  16 293.5648
summary(temperatureDRC) # checking maximum and minimum, quantiles and mean of data
##       year           mon             day             temp      
##  Min.   :1850   Min.   : 1.00   Min.   :15.00   Min.   :284.6  
##  1st Qu.:1912   1st Qu.: 3.75   1st Qu.:15.00   1st Qu.:294.7  
##  Median :1975   Median : 6.50   Median :16.00   Median :296.1  
##  Mean   :1975   Mean   : 6.50   Mean   :15.71   Mean   :296.3  
##  3rd Qu.:2038   3rd Qu.: 9.25   3rd Qu.:16.00   3rd Qu.:297.8  
##  Max.   :2100   Max.   :12.00   Max.   :16.00   Max.   :310.3
#         $year                 $tempCel              
#       min. 1850       min. 11.42    median: 22.92
#       max. 2100       max: 37.11    mean: 23.12      
#       (251 years)     (25.69 range)
sum(is.na(temperatureDRC)) # checking for missing values (none)                       
## [1] 0
# checking number of observations per year to ensure equal "sample size"
tapply(
  temperatureDRC$temp, 
  temperatureDRC$year, 
  length
  ) # 1,848 observations per year
## 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 
## 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 
## 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848 1848
# creating separate column with temperature converted from Kelvin to degrees Celsius
temperatureDRC$tempCel <- temperatureDRC$temp - 273.15

Data overview

The Democratic Republic of the Congo temperature dataset comprises 463,848 monthly surface temperature observations recorded in degrees Kelvin, spanning 251 years from 1850 to 2100. With 1,848 observations per year, the dataset captures spatial variation across multiple geographical regions within the country. No missing values were detected, ensuring complete data coverage for further analysis.


Q1 — Maximum annual temperature analysis

Goal: Estimating the maximal annual temperature between 2020 and 2100 with 95% confidence, and evaluating whether this significantly differs from that recorded between 1880 and 1960.

Step 1 — Formulating hypotheses

  • H0: The mean annual maximum temperature between 2020-2100 does not differ from that between 1880-1960.
  • H1: The mean annual maximum temperature between 2020-2100 differs from that between 1880-1960.

These hypotheses test whether projected climate change will produce statistically significant warming in maximum annual temperatures, with the baseline period (1880-1960) - part of the Holocene - representing relatively stable pre-industrial/early industrial conditions, while the projected period (2020-2100) includes the expected effects of continued greenhouse gas emissions on surface temperature under current Earth System Models. Given scientific consensus on anthropogenic global warming, we expect significantly higher maximum temperatures in the projected period.

Step 2 — Exploring distribution

# calculating annual max temperatures for entire time period
annualMaxtemps <- tapply(
  temperatureDRC$tempCel, 
  temperatureDRC$year, 
  max
  ) 
class(temperatureDRC$year) # checking whether years are indeed understood as integers
## [1] "integer"
annualMax <- data.frame(
  year=as.numeric(names(annualMaxtemps)), 
  temp=annualMaxtemps, 
  row.names=NULL # forces sequential numbering instead of using years (1-251)
  )

head(annualMax) # checking that everything went smoothly
##   year     temp
## 1 1850 30.06445
## 2 1851 29.10064
## 3 1852 30.15811
## 4 1853 31.35342
## 5 1854 28.28671
## 6 1855 28.95077
knitr::kable(summary(annualMax)) # getting first impression of distribution
year temp
Min. :1850 Min. :27.78
1st Qu.:1912 1st Qu.:29.61
Median :1975 Median :30.39
Mean :1975 Mean :31.19
3rd Qu.:2038 3rd Qu.:32.42
Max. :2100 Max. :37.11
hist(
  annualMax$temp, 
  main="Distribution of Annual Max. Temperatures in DRC",
  font.main=4,
  xlab=bquote("Temperature"~C^o), 
  col="steelblue",
  breaks=sqrt(50)
  ) 

# the data seems to be relatively right-skewed! probably due projected climate change by 2100

Step 4 — Defining baseline and future periods

# already calculated baseline and future references earlier
head(baselineMax) # first 6 values of baseline reference period
##    year     temp
## 31 1880 28.59225
## 32 1881 30.75802
## 33 1882 30.22021
## 34 1883 29.27068
## 35 1884 28.05459
## 36 1885 27.80682
head(futureMax) # first 6 values of future reference period
##     year     temp
## 171 2020 31.73800
## 172 2021 31.78597
## 173 2022 33.29171
## 174 2023 32.17281
## 175 2024 31.85131
## 176 2025 32.35327
# calculating standard errors for both reference periods
baselineMaxSe <- sd(baselineMax$temp)/sqrt(length(baselineMax$temp))
futureMaxSe <- sd(futureMax$temp)/sqrt(length(futureMax$temp))

# calculating 95% confidence intervals (the range of maximal annual temperatures we should expect)
baselineMaxCI <- baselineMaxMu + c(-1.96,1.96)*baselineMaxSe # alternatively: t.test(baselineMax$temp)
#       - maximal temps. range between 29.5-29.9 degrees Celsius (range = 0.4) 95% of the time
futureMaxCI <- futureMaxMu + c(-1.96,1.96)*futureMaxSe # alternatively: t.test(futureMax$temp)
#       - maximal temps. range between 33.4-34.2 degrees Celsius (wider range ->  0.8) 95% of the time

# collecting all calculations in a neat data.frame
MuSeCi <- data.frame(
  "Baseline Maximal"=c("Mean"=baselineMaxMu, "Standard Error"=baselineMaxSe, "Lower 95% CI"=baselineMaxCI[1], "Upper 95% CI"=baselineMaxCI[2]), 
  "Future Maximal"=c("Mean"=futureMaxMu, "Standard Error"=futureMaxSe, "Lower 95% CI"=futureMaxCI[1], "Upper 95% CI"=futureMaxCI[2])
  )
knitr::kable(MuSeCi)
Baseline.Maximal Future.Maximal
Mean 29.7320145 33.8152623
Standard Error 0.1001185 0.1892606
Lower 95% CI 29.5357823 33.4443116
Upper 95% CI 29.9282467 34.1862131

Step 5 — T-test assumptions & results

Running a two-samples t-test to check whether there is a significant difference between average maximal (mean max.) temperatures in the future versus the baseline reference periods. Findings of a difference could suggest the observed maximal temperature change may be attributed to anthropogenic climate change pushing us into a new climate window with more frequent hot temperatures.

# t-tests (next steps) assume: 
#     - independence
#     - sample size
#     - normality
#     - equal variances

# testing for independence and sample size -> based on study design:
#     - independent temperature observations recorded in different regions
#     - same number of observations per sample (N=81)

# testing for normality
#   1. boxplots
boxplot(baselineMax$temp, futureMax$temp, 
        main="Distributions of Reference Time Periods",
        font.main=4,
        ylab="Maximal Temperature"~C^o, 
        xlab="Time", 
        names=c("1880-1960","2020-2100"),
        col="steelblue"
        ) 

#       - future reference period much higher median and greater variability
#       - both distributions roughly symmetric without major outliers
#   2. histograms
par(mfrow=c(1,2), oma=c(0,0,2,0))
hist(baselineMax$temp,
     main="Baseline Max. (1880-1960)",
     font.main=4,
     xlab=bquote("Maximal Temperature"~C^o), 
     col="steelblue",
     breaks=sqrt(20)
     ) 
hist(futureMax$temp,
     main="Future Max. (2020-2100)",
     font.main=4,
     xlab=bquote("Maximal Temperature"~C^o), 
     col="steelblue",
     breaks=sqrt(20)
     ) 
mtext("Distribution of Annual Max. Temperatures in Reference Periods", side=3, cex=1.2, font=4, outer=TRUE)

#       - both appear approximately normal, though future distribution is wider and shifted right
#   3. qqplots
par(mfrow=c(1,2), oma=c(0,0,2,0)) 
car::qqPlot(
  baselineMax$temp, 
  col="steelblue", # confidence envelope
  main="Baseline Max. (1880-1960)", 
  ylab="Sample Quantiles",
  xlab="Theoretical Quantiles"
  ) 
## [1] 56  7
car::qqPlot(
  futureMax$temp, 
  col="steelblue", 
  main="Future Max. (2020-2100)", 
  ylab="Sample Quantiles",
  xlab="Theoretical Quantiles"
  )
## [1]  8 76
mtext("Normal Q-Q Plots", side=3, cex=1.2, font=4, outer=TRUE)

#       - points mostly scattered around horizontal line for both reference periods
#       - future period fits normal distribution slightly better
#       - baseline period has some tail deviations but within acceptable range
#   4. Shapiro-Wilk test
shapiro.test(baselineMax$temp)
## 
##  Shapiro-Wilk normality test
## 
## data:  baselineMax$temp
## W = 0.97567, p-value = 0.1257
shapiro.test(futureMax$temp)
## 
##  Shapiro-Wilk normality test
## 
## data:  futureMax$temp
## W = 0.97827, p-value = 0.1842
#       - baseline: P = 0.1257 (not significant)
#       - future: P = 0.1842 (also not significant)

# testing for equal variances
#   1. F-test (computes ratio of the two variances)
var.test(baselineMax$temp, futureMax$temp)
## 
##  F test to compare two variances
## 
## data:  baselineMax$temp and futureMax$temp
## F = 0.27984, num df = 80, denom df = 80, p-value = 3.752e-08
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.1799744 0.4351165
## sample estimates:
## ratio of variances 
##          0.2798389
#       - P =  3.752e-08 (highly significant)
#       - variance ratio indicates that baseline variance is only 28% of future variance
#       - 95% confidence interval does not include 1
#   2. Levene's test
maxTemp <- data.frame(
  temperature = c(baselineMax$temp, futureMax$temp),
  period = c(rep("Baseline Max", 81), rep("Future Max", 81)) # creates grouping factor by period
)
library(car)
leveneTest(temperature~period, data=maxTemp) # median-based approach (more robust than F-test)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value    Pr(>F)    
## group   1  36.097 1.223e-08 ***
##       160                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#       - P = 1.223e-08 (highly significant)
#       - same conclusion: reject homogeneity of variance assumption

# running two-sample t-test to check for significant difference 
# 
t.test(baselineMax$temp, futureMax$temp, var.equal=FALSE) 
## 
##  Welch Two Sample t-test
## 
## data:  baselineMax$temp and futureMax$temp
## t = -19.071, df = 121.52, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.507117 -3.659378
## sample estimates:
## mean of x mean of y 
##  29.73201  33.81526
# setting to unequal variances given earlier tests
#       - P < 2.2e-16 (highly significant) meaning there is a significant difference in maximal temps. (not random!)
#       - t = -19.071 standard errors difference between the two means relative the variability (quite far)
#       - 95% confidence that baseline maximal temperatures fall between -4.507117 and -3.659378 lower than future maximal temperatures on average

Reflect: The statistical evidence for increased maximum temperatures is exceptionally strong. The Welch two-sample t-test revealed a highly significant difference (t = -19.071, p < 2.2e-16) between baseline and future maximum temperatures, with an effect size of 4.1°C—representing a substantial 14% increase above historical levels. The 95% confidence interval (-4.51 to -3.66°C) indicates we can be highly confident that future maximum temperatures will be 3.7-4.5°C higher than the baseline period. The statistical assumptions were adequately met. Normality was satisfied for both periods (Shapiro-Wilk p-values > 0.05), and the large sample sizes (n=81 each) provide robustness. The significant variance inequality (F-test p = 3.752e-08) was appropriately handled using Welch’s t-test, which doesn’t assume equal variances. The baseline variance being only 28% of future variance suggests increasing temperature volatility alongside the mean shift. The magnitude of this difference (4.1°C) is climatologically substantial—representing a shift from the 99th percentile of historical maximums becoming typical future conditions. The extremely low p-value and narrow confidence intervals reflect the systematic nature of this change rather than random variation. However, these projections depend entirely on the Earth System Models and assumed emission trajectories, representing projected rather than observed differences.RetryClaude can make mistakes. Please double-check responses.


Q2 — Permanent departure year

Goal: Calculating the year in which the Democratic Republic of the Congo’s climate permanently departs from the climate window it has been in for the last 10,000 years.

Step 1 — Compute baseline threshold

# calculating annual mean temperatures for entire time period
annualTemperature <- tapply(
  temperatureDRC$tempCel, 
  temperatureDRC$year, 
  mean
  )
annualTemp <- data.frame(
  year=as.numeric(names(annualTemperature)), 
  temp=annualTemperature, 
  row.names=NULL # forces sequential numbering instead of using years (1-251)
  )

# calculating the departure margin for baseline period
baseline <- subset(annualTemp, year>=1880&year<=1960)
TDep <- quantile(baseline$temp, prob=c(0.01,0.99)) 
#       - departure margin: 21.1-22.7 degrees Celsius
#       - if future temperatures fall outside this range, they're so extreme they would only occur 1% of the time under historical climate conditions

Step 2 — Identifying departure year

# permanent departure = the point after which DRC will experience a year comparable to the relatively stable surface temperature period in human history only once in a hundred years (i.e. 99%)

# looking for first year where temperatures NEVER go back below 27.3°C
depTYear1 <- tail(annualTemp$year[annualTemp$temp <= 22.7], 1) + 1 
# last occurrence 
depTYear1
## [1] 2016
# another method to verify correct departure year
depTYear2 <- rev(annualTemp$year)[which(rev(annualTemp$temp <= 22.7))[1]]+1 
# first occurrence in reversed dataset
depTYear2
## [1] 2016
# another method thanks to AI using sapply, which and all as recommended
depTest <- sapply(1:length(annualTemp$temp > 22.7), function(x){
  all((annualTemp$temp > 22.7)[x:length(annualTemp$temp > 22.7)])
})
depTYear3 <- annualTemp$year[which(depTest)[1]]
depTYear3
## [1] 2016
# departure year: 2016! (all methods)

Step 3 — Visualizing departure

# calculating temp. averages for baseline and future reference periods
statistics <- function(x){
  mean <- mean(x)
  se <- sd(x)/sqrt(length(x))
  CI <- mean(x) + c(-1.96,1.96)*se
  return(c("Mean" = mean, "Se" = se, "Lower 95% CI" = CI[1], "Upper 95% CI" = CI[2]))
}
baselineStats <- data.frame(statistics(baseline$temp))
knitr::kable(baselineStats)
statistics.baseline.temp.
Mean 22.1007493
Se 0.0376108
Lower 95% CI 22.0270321
Upper 95% CI 22.1744665
future <- subset(annualTemp, year>=2020&year<=2100)
futureStats <- data.frame(statistics(future$temp))
knitr::kable(futureStats)
statistics.future.temp.
Mean 25.0130732
Se 0.1379151
Lower 95% CI 24.7427595
Upper 95% CI 25.2833868
# creating a dot plot using earlier values (see MuSeCi)
plot(
  temp~year, 
  data=c(annualTemp, annualMax), 
  type="l",
  lwd=c(2.5,2),
  pch=16,
  main="Average Temperature 1880-2100 in DRC", 
  font.main=4,
  cex=1.4,
  cex.lab=1.2,
  ylab=bquote("Temperature"~C^o), 
  xlab="Year", 
  col=c("darkblue","darkred")
  ) 

# adding the overall time period mean, and baseline and future reference lines
abline(v=seq(1850, 2100, by = 10), col="lightgrey", lwd=1,lty=3)
abline(
  h=c(baselineStats["Mean",], futureStats["Mean",]),
  col=c("lightgreen", "lightpink"), 
  lty=2, 
  lwd=1.5
  )
abline(v=depTYear1, col="purple", lwd=2, lty=3)

#adding baseline period confidence envelope (1880-1960)
polygon(c(1850, 2100, 2100, 1850), 
        c(22.02703213, 22.02703213, 
          22.17446652, 22.17446652),
        col=rgb(0, 1, 0, 0.1), border=NA)  # Semi-transparent blue

# adding future period confidence envelope (2020-2100)
polygon(c(1850, 2100, 2100, 1850), 
        c(24.7427595, 24.7427595, 
          25.2833868, 25.2833868),
        col=rgb(1, 0, 0, 0.1), border=NA) 

# adding departure threshold confidence envelope (2020-2100)
polygon(c(1850, 2100, 2100, 1850), 
        c(21.1, 21.1, 
          22.7, 22.7),
        col=rgb(0.8, 0.8, 0.8, 0.3), border=NA) 

# adding a legend for clarity on all reference lines
legend(
  "topleft", 
  legend=c("Annual temp.", "Average baseline temp.", "Average future temp.", "Departure threshold", "Departure year (2016)"),
  col=c("darkblue", "lightgreen", "darkred","grey", "purple"), 
  lwd=2, 
  lty=2, 
  cex=1.2,
  bty="n")

# adding error bars using AI because we never did this in class 
# calculate a rolling standard error for 5-year windows
rollingSe <- function(x,n=5) {
  sapply(1:length(x), function(i) {
    start <- max(1, i - n/2)
    end <- min(length(x), i + n/2)
    sd(x[start:end]) / sqrt(end - start + 1)
  })
}
# calculating rolling SE for entire data period
annualSe <- rollingSe(annualTemp$temp)

# adding error bars to each point based on above
for(i in 1:length(annualMax$year)) {
  arrows(annualTemp$year[i], annualTemp$temp[i] - annualSe[i], 
         annualTemp$year[i], annualTemp$temp[i] + annualSe[i],
         angle=90, code=3, length=0.01, col="black", lwd=1.5)
}

# adding points separately so they're on top
points(annualTemp$temp, annualTemp$year, pch=16, col="black")
text(2016, 27, "2016", col="purple", cex=1.2)

# calculating rate of increase between 2016 and 2100
annualTRate2016to2100 <- ((mean(annualTemp$temp[annualTemp$year == 2100]))-(mean(annualTemp$temp[annualTemp$year == 2016])))/(2100-2016)
annualTRate2016to2100 # temperature projected to increase by 0.04°C annually, or 0.4°C per decade
## [1] 0.04048607

Reflect: The 2016 departure year represents a statistically robust finding, confirmed through multiple computational approaches. This threshold crossing is based on mean annual temperatures permanently exceeding 22.7°C (the 99th percentile of 1880-1960 baseline data). Using the upper extreme (99th percentile) ensures that departure represents truly exceptional conditions relative to the reference period. The 2016 timing aligns with accelerating global warming trends and suggests DRC crossed into a fundamentally different climate regime. The graph shows dramatic acceleration post-2016, suggesting it is more than normal climate variability. Rather, it hints at a systematic shift beyond the temperature range of the relatively stable baseline period, with temperatures now consistently operating in what was previously the extreme upper tail of the distribution. However, several limitations warrant consideration. The 1880-1960 baseline covers only 0.8% of the claimed 10,000-year Holocene period, and already includes early industrial warming. The “permanent departure” finding assumes continued warming trends as projected by the models - temperatures could theoretically return below this threshold.


Press release

Write a short release communicating (i) the change in expected annual maximum temperature and (ii) the departure year. Reflect uncertainty and assumptions. Avoid jargon; be precise. This helps you internalize your results. You may later be asked to judge whether a press release fairly communicates an analysis.

Democratic Republic of Congo’s climate permanently shifts beyond historical range

The Democratic Republic of Congo crossed a critical climate threshold in 2016, when average temperatures permanently exceeded the stable Holocene climate window of the last 10,000 years.

Departure occurred when temperatures exceeded the 1880-1960 baseline range (21.1-22.7°C). Average temperatures will continue rising at 0.04°C yearly through 2100. This drives corresponding increases in maximum temperatures, which will average 33.8°C (±0.4°C) between 2020-2100 — a substantial 4.1°C increase above the 1880-1960 baseline maximum of 29.7°C. Individual years could reach temperatures as high as 37°C by 2100. Results reflect country-wide averages and may vary regionally.

Projections rely on Earth System Models assuming emissions under current trajectories, indicating unprecedented heat conditions with implications for public health, agriculture and infrastructure.