# =============================================================================
#  Compter les naissances : fréquence, ratio, proportion, prévalence, incidence
#  (cumulée et densité), risque, probabilité, taux, intensité et calendrier
#
#  Données : Enquête démographique et de santé RDC 2023-2024 (EDS-RDC III),
#            fichier Femmes (Individual Recode) au format Stata.
#  Auteur  : Guerschom Mugisho — version 2 (octobre 2026)
#
#  Seul le package « haven » est indispensable. Si « jsonlite » est installé,
#  le script écrit aussi le fichier JSON qui alimente les graphiques de la page web.
#  Tous les résultats sont pondérés (v005 / 1 000 000).
# =============================================================================

# install.packages(c("haven", "jsonlite"))
library(haven)

# ---- 0. Paramètres ----------------------------------------------------------
fichier        <- "DATA2023.dta"     # chemin vers le fichier Femmes de l'EDS
dossier_sortie <- "."                # où écrire les tableaux, la figure et le JSON

# ---- 1. Lecture des données -------------------------------------------------
ir <- read_dta(fichier,
               col_select = c(caseid, v005, v008, v011, v013, v025, v201, v211,
                              v213, v214, starts_with("b3_"), starts_with("b4_")))
ir <- zap_labels(ir)

n      <- nrow(ir)
w      <- ir$v005 / 1e6              # poids d'échantillonnage
v008   <- ir$v008                    # date de l'entretien (code siècle-mois, CMC)
v011   <- ir$v011                    # date de naissance de la femme (CMC)
v211   <- ir$v211                    # date de la première naissance (CMC ; NA si aucune)
grp    <- ir$v013                    # groupe d'âges à l'enquête : 1 = 15-19 ... 7 = 45-49
milieu <- ir$v025                    # 1 = urbain, 2 = rural
ages   <- c("15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49")

b3_cols <- grep("^b3_[0-9]+$", names(ir), value = TRUE)   # dates de naissance des enfants
b4_cols <- grep("^b4_[0-9]+$", names(ir), value = TRUE)   # sexe des enfants (1 = garçon, 2 = fille)
B <- as.matrix(ir[, b3_cols]); storage.mode(B) <- "double"
S <- as.matrix(ir[, b4_cols]); storage.mode(S) <- "double"
mois_avant <- v008 - B              # ancienneté de chaque naissance, en mois

wmean <- function(x, w) { ok <- !is.na(x); sum(x[ok] * w[ok]) / sum(w[ok]) }
wmean_by <- function(x, w, g) sapply(1:7, function(k) wmean(x[g == k], w[g == k]))

cat("Femmes enquêtées :", n, "\n")

# =============================================================================
# 2. TAUX PAR ÂGE (densité d'incidence) — méthode standard des EDS
#    Période : 1 à 36 mois avant l'entretien. Chaque femme contribue, mois par
#    mois, au groupe d'âges qu'elle a à ce moment-là ; chaque naissance est
#    classée selon l'âge de la mère à l'accouchement.
# =============================================================================
taux_par_age <- function(periode = 36, filtre = rep(TRUE, n)) {
  naissances <- numeric(7); annees_femmes <- numeric(7); effectif <- numeric(7)
  for (m in 1:periode) {
    cmc <- v008 - m
    g   <- ((cmc - v011) %/% 12) %/% 5 - 2          # 15-19 -> 1, ..., 45-49 -> 7
    ok  <- g >= 1 & g <= 7 & filtre
    fg  <- factor(g[ok], levels = 1:7)
    e   <- tapply(w[ok] / 12, fg, sum); e[is.na(e)] <- 0
    nb  <- rowSums(B == cmc, na.rm = TRUE)
    b   <- tapply(w[ok] * nb[ok], fg, sum); b[is.na(b)] <- 0
    k   <- tapply(nb[ok], fg, sum); k[is.na(k)] <- 0
    annees_femmes <- annees_femmes + as.numeric(e)
    naissances    <- naissances + as.numeric(b)
    effectif      <- effectif + as.numeric(k)
  }
  list(taux = naissances / annees_femmes, naissances = naissances,
       annees_femmes = annees_femmes, effectif = effectif)
}
t36 <- taux_par_age(36)
taux_ens <- sum(t36$naissances) / sum(t36$annees_femmes)

# =============================================================================
# 3. FRÉQUENCES : naissances des 3 dernières années selon l'âge de la mère
#    fréquence absolue = un effectif ; fréquence relative = une part du total
# =============================================================================
freq_abs <- t36$effectif                              # naissances observées dans l'échantillon
freq_rel <- 100 * t36$naissances / sum(t36$naissances) # répartition pondérée (%)

# =============================================================================
# 4. RATIO et PROPORTION : le sexe des naissances des 5 dernières années
#    ratio      = garçons / filles (le numérateur n'est pas dans le dénominateur)
#    proportion = garçons / (garçons + filles) (le numérateur en fait partie)
# =============================================================================
dans60  <- mois_avant >= 0 & mois_avant <= 59
garcons <- sum((w * (dans60 & S == 1))[], na.rm = TRUE)
filles  <- sum((w * (dans60 & S == 2))[], na.rm = TRUE)
rapport_masculinite <- 100 * garcons / filles
proportion_garcons  <- 100 * garcons / (garcons + filles)

# =============================================================================
# 5. PRÉVALENCE (un état, à une date) et INCIDENCE CUMULÉE (un événement, sur 12 mois)
# =============================================================================
enceinte  <- as.numeric(ir$v213 == 1)
nb12      <- rowSums(mois_avant >= 1 & mois_avant <= 12, na.rm = TRUE)
au_moins1 <- as.numeric(nb12 > 0)
prev_age  <- wmean_by(enceinte, w, grp);  prev_ens <- wmean(enceinte, w)
inc_age   <- wmean_by(au_moins1, w, grp); inc_ens  <- wmean(au_moins1, w)
naiss12   <- wmean(nb12, w)                # naissances par femme en 12 mois

# =============================================================================
# 6. PREMIÈRE NAISSANCE : densité d'incidence, probabilité, incidence cumulée (risque)
#    Âges simples 12-49, période 1 à 36 mois avant l'entretien. Une femme est
#    « à risque » tant qu'elle n'a pas encore eu de premier enfant.
# =============================================================================
a_simples <- 12:49
evts <- numeric(length(a_simples)); annees <- numeric(length(a_simples))
for (m in 1:36) {
  cmc    <- v008 - m
  a      <- (cmc - v011) %/% 12
  risque <- a >= 12 & a <= 49 & (is.na(v211) | v211 >= cmc)
  fa     <- factor(a[risque], levels = a_simples)
  e      <- tapply(w[risque] / 12, fa, sum); e[is.na(e)] <- 0
  premiere <- risque & !is.na(v211) & v211 == cmc
  fp     <- factor(a[premiere], levels = a_simples)
  d      <- tapply(w[premiere], fp, sum); d[is.na(d)] <- 0
  annees <- annees + as.numeric(e); evts <- evts + as.numeric(d)
}
densite       <- evts / annees                 # densité d'incidence (par année-femme)
probabilite   <- 1 - exp(-densite)             # probabilité d'avoir un 1er enfant dans l'année d'âge
incid_cumulee <- 1 - cumprod(1 - probabilite)  # risque d'avoir eu un 1er enfant à la fin de chaque âge
somme_dens    <- cumsum(densite)               # ce qu'on obtiendrait en additionnant les taux (à tort)
age_median_1re <- a_simples[which(incid_cumulee >= 0.5)[1]] + 1
jamais_50 <- 100 * (1 - incid_cumulee[length(incid_cumulee)])

# =============================================================================
# 7. INTENSITÉ et CALENDRIER, par milieu de résidence
#    intensité  = ISF = 5 x somme des taux ;
#    calendrier = âge moyen à la maternité et part des naissances déjà atteinte
# =============================================================================
centres <- c(17.5, 22.5, 27.5, 32.5, 37.5, 42.5, 47.5)
calend <- lapply(list(Ensemble = rep(TRUE, n), Urbain = milieu == 1, Rural = milieu == 2),
  function(f) {
    t <- taux_par_age(36, f)$taux
    list(taux = 1000 * t, isf = 5 * sum(t),
         age_moyen = sum(centres * t) / sum(t),
         part_cumulee = 100 * cumsum(t) / sum(t),
         cumul_enfants = 5 * cumsum(t))
  })
parite_45_49 <- wmean(ir$v201[grp == 7], w[grp == 7])

# =============================================================================
# 8. LIENS MATHÉMATIQUES
# =============================================================================
D_mois <- 12 * prev_ens / ((1 - prev_ens) * taux_ens)     # (a) P/(1-P) = T x D
inc_attendue <- taux_ens * 1                               # (b) I ≈ T x t, t = 1 an
isf_verif <- 5 * sum(t36$taux)                             # (c) ISF = 5 x somme des taux

# =============================================================================
# 9. RÉSULTATS
# =============================================================================
tab_age <- data.frame(
  age = c(ages, "Ensemble"),
  frequence_absolue = c(freq_abs, sum(freq_abs)),
  frequence_relative_pct = round(c(freq_rel, 100), 1),
  prevalence_pct = round(100 * c(prev_age, prev_ens), 1),
  incidence_cumulee_12m_pct = round(100 * c(inc_age, inc_ens), 1),
  taux_pour1000 = round(1000 * c(t36$taux, taux_ens), 1),
  intensite_cumulee = round(c(calend$Ensemble$cumul_enfants, calend$Ensemble$isf), 2)
)
print(tab_age, row.names = FALSE)

tab_premiere <- data.frame(age = a_simples,
  densite_pour1000 = round(1000 * densite, 1),
  probabilite_pct = round(100 * probabilite, 1),
  incidence_cumulee_pct = round(100 * incid_cumulee, 1),
  somme_densites_pct = round(100 * somme_dens, 1))

cat("\n---- Synthèse ----\n")
cat(sprintf("Naissances observées (3 ans)        : %d\n", as.integer(sum(freq_abs))))
cat(sprintf("Rapport de masculinité à la naissance : %.1f garçons pour 100 filles\n", rapport_masculinite))
cat(sprintf("Proportion de garçons                 : %.1f %%\n", proportion_garcons))
cat(sprintf("Prévalence (enceintes)                : %.1f %%\n", 100 * prev_ens))
cat(sprintf("Incidence cumulée sur 12 mois         : %.1f %% (%.1f naissances pour 100 femmes)\n", 100 * inc_ens, 100 * naiss12))
cat(sprintf("Taux (densité d'incidence) 15-49 ans  : %.1f pour 1 000 années-femmes\n", 1000 * taux_ens))
cat(sprintf("Âge médian à la 1re naissance (moment): %d ans ; jamais mère à 50 ans : %.1f %%\n", age_median_1re, jamais_50))
for (k in names(calend)) cat(sprintf("%-8s ISF %.2f ; âge moyen à la maternité %.1f ans\n", k, calend[[k]]$isf, calend[[k]]$age_moyen))
cat(sprintf("Parité moyenne des 45-49 ans          : %.2f\n", parite_45_49))
cat(sprintf("(a) Durée implicite de grossesse      : %.1f mois\n", D_mois))
cat(sprintf("(b) Incidence attendue T x 1 an       : %.1f %% (observée : %.1f naissances pour 100 femmes)\n", 100 * inc_attendue, 100 * naiss12))
cat(sprintf("(c) ISF = 5 x somme des taux          : %.2f\n", isf_verif))

write.csv(tab_age, file.path(dossier_sortie, "indicateurs_par_age_RDC2023.csv"), row.names = FALSE)
write.csv(tab_premiere, file.path(dossier_sortie, "premiere_naissance_RDC2023.csv"), row.names = FALSE)

# ---- Export JSON pour la page web (facultatif) -------------------------------
if (requireNamespace("jsonlite", quietly = TRUE)) {
  donnees <- list(
    ages = ages, taux = 1000 * t36$taux, taux_ensemble = 1000 * taux_ens,
    isf = calend$Ensemble$isf,
    freq_abs_echantillon = freq_abs, freq_rel_pct = freq_rel,
    freq_total_echantillon = sum(freq_abs),
    rapport_masculinite = rapport_masculinite, proportion_garcons = proportion_garcons,
    prevalence = 100 * prev_age, prevalence_ensemble = 100 * prev_ens,
    incidence12 = 100 * inc_age, incidence12_ensemble = 100 * inc_ens,
    naiss12_pour100 = 100 * naiss12, duree_implicite_mois = D_mois,
    pn_ages = a_simples, pn_densite = 1000 * densite,
    pn_incidence_cumulee = 100 * incid_cumulee, pn_somme_densites = 100 * somme_dens,
    pn_age_median = age_median_1re, pn_jamais_50ans_pct = jamais_50,
    calendrier = calend, parite_45_49 = parite_45_49)
  jsonlite::write_json(donnees, file.path(dossier_sortie, "donnees_page.json"),
                       auto_unbox = TRUE, digits = 6, pretty = TRUE)
}

# ---- Figure : prévalence, incidence cumulée et taux par âge ------------------
png(file.path(dossier_sortie, "figure_prevalence_incidence_taux.png"), width = 1800, height = 1100, res = 200)
par(mar = c(4.5, 4.5, 2, 1))
y <- cbind(100 * prev_age, 100 * inc_age, 100 * t36$taux)
cols <- c("#0e5f70", "#c26a1a", "#7c2f4c")
matplot(1:7, y, type = "b", pch = 16, lty = 1, lwd = 2, col = cols, xaxt = "n",
        xlab = "Groupe d'âges", ylab = "Pour 100 femmes (ou années-femmes)",
        main = "Fécondité en RDC (EDS 2023-2024)")
axis(1, at = 1:7, labels = ages)
legend("topright", bty = "n", lwd = 2, pch = 16, col = cols,
       legend = c("Prévalence : enceintes le jour de l'enquête",
                  "Incidence cumulée : ont accouché dans les 12 mois",
                  "Taux : naissances pour 100 années-femmes"))
dev.off()
