years <- 1950:2100
age_levels <- c("<5", "5-14", "15-24", "25-34", "35-44", "45-54", "55-64", ">65")
population_age_composition <- expand.grid(
Time = years,
Group = age_levels,
KEEP.OUT.ATTRS = FALSE,
stringsAsFactors = FALSE
)
t <- (population_age_composition$Time - min(years)) / (max(years) - min(years))
group <- population_age_composition$Group
base <- ifelse(group == "<5", 0.14 - 0.05 * t,
ifelse(group == "5-14", 0.20 - 0.06 * t,
ifelse(group == "15-24", 0.17 - 0.03 * t,
ifelse(group == "25-34", 0.14 - 0.01 * t,
ifelse(group == "35-44", 0.12 + 0.01 * t,
ifelse(group == "45-54", 0.10 + 0.03 * t,
ifelse(group == "55-64", 0.07 + 0.04 * t, 0.06 + 0.07 * t)
)
)
)
)
)
)
phase <- match(group, age_levels)
share_raw <- pmax(base + 0.01 * sin(t * 2 * pi + phase), 0.01)
share <- share_raw / ave(share_raw, population_age_composition$Time, FUN = sum)
total <- 2500 + 8000 * t
population_age_composition$Value <- total * share
write.csv(
population_age_composition[c("Time", "Group", "Value")],
"population_age_composition.csv",
row.names = FALSE
)