Introduction

This report presents descriptive analysis of the Global Dynasties Dataset (GDD), a leader-level panel recording nominal heads of state or government and their familial ties for 10,119 country-years spanning 1946–2020. A leader is coded as dynastic (pred_bin = 1) if at least one family member previously held political office at any level (national, state, or local).

The analysis proceeds in five parts:

  1. Regional analysis — global and cross-regional patterns of dynastic leadership, kin-type distribution, and regime variation.
  2. South Asia deep-dive — a focused look at the eight South Asian countries in the dataset, where dynastic rates are exceptionally high.
  3. Economic correlates — descriptive correlations between dynastic leadership and GDP per capita, GDP growth, and income inequality (top 10% share from WID).
  4. Global political context — dynastic rates by democracy status (Boix-Miller-Rosato), electoral system type (Golder v5.0), and party system fragmentation (ENEP).
  5. Cross-validation — systematic comparison of GDD dynastic coding against the independently compiled Paths to Power dataset (Nyrup et al., 2025), covering 137 countries over 1966–2020.

Data source: Global Dynasties Dataset (Verma & Midha, 2026), sheet NEW Jan-Feb 2026. Variables prefixed fln_ are harmonized from the TED dataset (Nooruddin et al., 2022; Harvard Dataverse DOI: 10.7910/DVN/UXFY88).


Setup and Data Loading

library(readxl)
library(tidyverse)
library(scales)
library(kableExtra)
library(RColorBrewer)
library(WDI)
library(wid)
library(countrycode)
library(ggrepel)
df <- read_excel(
  "D:/Populism and Democrary/Global Dynasty/data/Global_Dynasties_Dataset.xlsx",
  sheet = "NEW Jan-Feb 2026"
) %>%
  # Recode labels
  mutate(
    dynasty      = as.integer(pred_bin),
    female_leader = as.integer(fln_gender),
    decade       = paste0(floor(year / 10) * 10, "s"),

    relation_label = case_when(
      relation_code_pred == 2  ~ "Father",
      relation_code_pred == 3  ~ "Mother",
      relation_code_pred == 4  ~ "Son",
      relation_code_pred == 6  ~ "Husband",
      relation_code_pred == 8  ~ "Brother",
      relation_code_pred == 10 ~ "Grandfather",
      relation_code_pred == 11 ~ "Grandmother",
      relation_code_pred == 14 ~ "Uncle",
      relation_code_pred == 18 ~ "Cousin",
      relation_code_pred == 19 ~ "Other kin",
      TRUE                     ~ NA_character_
    ),

    pos_label = case_when(
      pos_code_pred == 2 ~ "Head of Government",
      pos_code_pred == 3 ~ "Cabinet Minister",
      pos_code_pred == 4 ~ "Member of Parliament",
      pos_code_pred == 5 ~ "Assembly / Chief Minister",
      pos_code_pred == 6 ~ "Mayor",
      pos_code_pred == 7 ~ "Councillor",
      pos_code_pred == 1 ~ "Other",
      TRUE               ~ NA_character_
    ),

    system_category = case_when(
      system_category == "Civilian Dictatorship"   ~ "Civilian Dictatorship",
      system_category == "Military Dictatorship"   ~ "Military Dictatorship",
      system_category == "Royal Dictatorship"      ~ "Royal Dictatorship",
      system_category == "Parliamentary Democracy" ~ "Parliamentary Democracy",
      system_category == "Presidential Democracy"  ~ "Presidential Democracy",
      system_category == "Mixed Democratic"        ~ "Mixed Democratic",
      TRUE                                         ~ NA_character_
    )
  )

# Drop the 5 rows missing Region
df <- df %>% filter(!is.na(Region))

cat("Total country-years:", nrow(df), "\n")
## Total country-years: 10114
cat("Dynastic leaders:", sum(df$dynasty == 1), "\n")
## Dynastic leaders: 2658
cat("Non-dynastic:", sum(df$dynasty == 0), "\n")
## Non-dynastic: 7456
cat("Years covered:", min(df$year), "–", max(df$year), "\n")
## Years covered: 1946 – 2020

Part I: Global Picture

Global Dynastic Prevalence

Overall Rate

overall <- df %>%
  summarise(
    Total        = n(),
    Dynastic     = sum(dynasty == 1),
    Non_dynastic = sum(dynasty == 0),
    Rate         = round(Dynastic / Total * 100, 1)
  )

overall %>%
  kbl(
    col.names = c("Total country-years", "Dynastic leaders",
                  "Non-dynastic leaders", "Dynastic rate (%)"),
    caption   = "Table 1: Global dynastic leadership (1946–2020)"
  ) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Table 1: Global dynastic leadership (1946–2020)
Total country-years Dynastic leaders Non-dynastic leaders Dynastic rate (%)
10114 2658 7456 26.3

Across all 10114 country-years in the dataset, 2658 (26.3%) had a dynastic leader — a leader with at least one family member who previously held political office.

Trend Over Time

trend <- df %>%
  group_by(year) %>%
  summarise(
    rate    = mean(dynasty == 1) * 100,
    n_total = n()
  )

ggplot(trend, aes(x = year, y = rate)) +
  geom_line(colour = "#2c7bb6", linewidth = 0.8) +
  geom_smooth(method = "loess", span = 0.3, se = TRUE,
              colour = "#d7191c", fill = "#f7b6b2", alpha = 0.3) +
  scale_x_continuous(breaks = seq(1946, 2020, 10)) +
  scale_y_continuous(limits = c(0, 60), labels = label_percent(scale = 1)) +
  labs(
    title    = "Global Share of Dynastic Leaders, 1946–2020",
    subtitle = "Red smoothed line shows LOESS trend; shaded band is 95% CI",
    x        = "Year",
    y        = "Share of dynastic leaders (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.minor = element_blank())
Figure 1: Share of dynastic leaders globally by year (1946–2020)

Figure 1: Share of dynastic leaders globally by year (1946–2020)

By Decade

decade_df <- df %>%
  group_by(decade) %>%
  summarise(rate = mean(dynasty == 1) * 100, n = n()) %>%
  arrange(decade)

ggplot(decade_df, aes(x = decade, y = rate, fill = rate)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(rate, 1), "%")),
            vjust = -0.5, size = 4, fontface = "bold") +
  scale_fill_gradient(low = "#c6dbef", high = "#2171b5", guide = "none") +
  scale_y_continuous(limits = c(0, 40), labels = label_percent(scale = 1)) +
  labs(
    title = "Dynastic Leadership Rate by Decade",
    x     = "Decade",
    y     = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.x = element_blank())
Figure 2: Dynastic rate by decade

Figure 2: Dynastic rate by decade

Dynastic Rates by Region

region_df <- df %>%
  group_by(Region) %>%
  summarise(
    Total    = n(),
    Dynastic = sum(dynasty == 1),
    Rate     = Dynastic / Total * 100
  ) %>%
  arrange(desc(Rate))

ggplot(region_df, aes(x = reorder(Region, Rate), y = Rate, fill = Rate)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(Rate, 1), "%")),
            hjust = -0.1, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_gradient(low = "#fee8c8", high = "#b30000", guide = "none") +
  scale_y_continuous(limits = c(0, 75), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership Rate by Region (1946–2020)",
    subtitle = "Percentage of country-years with a dynastic leader",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 3: Dynastic leadership rate by region

Figure 3: Dynastic leadership rate by region

region_df %>%
  mutate(Rate = paste0(round(Rate, 1), "%")) %>%
  rename(Region = Region, `Country-years` = Total,
         `Dynastic leaders` = Dynastic, `Dynastic rate` = Rate) %>%
  kbl(caption = "Table 2: Dynastic rates by region") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Table 2: Dynastic rates by region
Region Country-years Dynastic leaders Dynastic rate
South Asia 552 324 58.7%
Middle East 1169 584 50%
East Asia 1038 309 29.8%
North America 1161 341 29.4%
Australia and Oceania 309 74 23.9%
South America 776 168 21.6%
Africa 2735 568 20.8%
Western Europe 1363 196 14.4%
Eastern Europe 1011 94 9.3%

Regime Type and Dynasticism

regime_df <- df %>%
  filter(!is.na(system_category)) %>%
  group_by(system_category) %>%
  summarise(
    Total    = n(),
    Dynastic = sum(dynasty == 1),
    Rate     = Dynastic / Total * 100
  ) %>%
  arrange(desc(Rate))

regime_colours <- c(
  "Royal Dictatorship"      = "#7b2d8b",
  "Civilian Dictatorship"   = "#d73027",
  "Military Dictatorship"   = "#fc8d59",
  "Mixed Democratic"        = "#fee090",
  "Parliamentary Democracy" = "#91bfdb",
  "Presidential Democracy"  = "#4575b4"
)

ggplot(regime_df,
       aes(x = reorder(system_category, Rate), y = Rate,
           fill = system_category)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(Rate, 1), "%")),
            hjust = -0.1, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_manual(values = regime_colours, guide = "none") +
  scale_y_continuous(limits = c(0, 105), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership Rate by Regime Type (1946–2020)",
    subtitle = "Percentage of country-years with a dynastic leader",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 5: Dynastic rate by regime type

Figure 5: Dynastic rate by regime type

heat_df <- df %>%
  filter(!is.na(system_category)) %>%
  group_by(Region, system_category) %>%
  summarise(n = n(), rate = mean(dynasty == 1) * 100, .groups = "drop") %>%
  filter(n >= 5)

ggplot(heat_df, aes(x = system_category, y = Region, fill = rate)) +
  geom_tile(colour = "white", linewidth = 0.5) +
  geom_text(aes(label = paste0(round(rate, 0), "%")),
            size = 3.5, colour = "black") +
  scale_fill_gradient2(
    low      = "#f7fbff",
    mid      = "#6baed6",
    high     = "#08306b",
    midpoint = 30,
    name     = "Dynastic\nrate (%)"
  ) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 12)) +
  labs(
    title    = "Dynastic Rate by Regime Type and Region",
    subtitle = "Cells with fewer than 5 country-years suppressed",
    x        = NULL,
    y        = NULL
  ) +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 30, hjust = 1, size = 10),
        panel.grid  = element_blank())
Figure 6: Dynastic rate — regime type × region heatmap

Figure 6: Dynastic rate — regime type × region heatmap

di6a <- readRDS("D:/Populism and Democrary/Global Dynasty/data/gdd_integrated.rds") %>%
  mutate(elec_system = factor(elec_system,
                              levels = c("Majoritarian", "Mixed", "Proportional")))

bmr_elec <- di6a %>%
  filter(!is.na(bmr_dem), !is.na(elec_system)) %>%
  mutate(
    bmr_label = factor(
      if_else(bmr_dem == 1, "Democracy (BMR)", "Autocracy (BMR)"),
      levels = c("Democracy (BMR)", "Autocracy (BMR)")
    )
  ) %>%
  group_by(bmr_label, elec_system) %>%
  summarise(n = n(), rate = mean(dynasty == 1) * 100, .groups = "drop")

ggplot(bmr_elec, aes(x = elec_system, y = fct_rev(bmr_label), fill = rate)) +
  geom_tile(colour = "white", linewidth = 1.2) +
  geom_text(aes(label = paste0(round(rate, 1), "%\n(n=", n, ")")),
            size = 4.5, lineheight = 0.9, colour = "black") +
  scale_fill_gradient2(
    low      = "#cfe2f3",
    mid      = "#2171b5",
    high     = "#084594",
    midpoint = 15,
    name     = "Dynastic\nrate (%)"
  ) +
  labs(
    title    = "Dynastic Rate by Democracy Status and Electoral Formula",
    subtitle = "BMR dichotomous democracy indicator × Golder Electoral Systems v5.0; all country-years 1946–2020",
    x        = NULL,
    y        = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid = element_blank(),
        axis.text  = element_text(size = 12))
Figure 6a: Dynastic rate — democracy status × electoral formula

Figure 6a: Dynastic rate — democracy status × electoral formula

Who Do Dynastic Leaders Inherit From?

Global Kin-Type Distribution

kin_df <- df %>%
  filter(dynasty == 1, !is.na(relation_label)) %>%
  count(relation_label) %>%
  mutate(pct = n / sum(n) * 100) %>%
  arrange(desc(pct))

ggplot(kin_df, aes(x = reorder(relation_label, pct), y = pct,
                   fill = relation_label)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            hjust = -0.1, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_brewer(palette = "Paired", guide = "none") +
  scale_y_continuous(limits = c(0, 80), labels = label_percent(scale = 1)) +
  labs(
    title    = "Type of Dynastic Kin Relationship (Global, 1946–2020)",
    subtitle = "Among dynastic leaders (pred_bin = 1) with identified kin type",
    x        = NULL,
    y        = "Share of dynastic leaders (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 7: Type of kin relationship — dynastic predecessors (global)

Figure 7: Type of kin relationship — dynastic predecessors (global)

Position Held by Dynastic Relative

pos_df <- df %>%
  filter(dynasty == 1, !is.na(pos_label)) %>%
  count(pos_label) %>%
  mutate(pct = n / sum(n) * 100) %>%
  arrange(desc(pct))

ggplot(pos_df, aes(x = reorder(pos_label, pct), y = pct, fill = pos_label)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(pct, 1), "%")),
            hjust = -0.1, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", guide = "none") +
  scale_y_continuous(limits = c(0, 75), labels = label_percent(scale = 1)) +
  labs(
    title    = "Office Level of Dynastic Predecessor (Global, 1946–2020)",
    subtitle = "Among dynastic leaders with identified predecessor position",
    x        = NULL,
    y        = "Share of dynastic leaders (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 8: Office level held by dynastic predecessor

Figure 8: Office level held by dynastic predecessor

Predecessor Distance: How Far Down the Hierarchy Does Dynasty Reach?

GDD’s position codes let us ask a sharper question than “is the leader dynastic?” — namely, at what level of the political hierarchy did the family first establish itself? We classify predecessor positions into two tiers:

  • National tier (codes 2–4): Head of government, Cabinet minister, MP/Legislator
  • Sub-national tier (codes 5–7): Assembly member/CM/Governor, Mayor, Councillor

Within each tier we further examine who the predecessor was — the relation type (father, sibling, spouse, extended kin, etc.).

pred_dist <- df %>%
  filter(dynasty == 1, pos_code_pred %in% c(2,3,4,5,6,7)) %>%
  mutate(
    pred_tier = case_when(
      pos_code_pred %in% c(2,3,4) ~ "National",
      pos_code_pred %in% c(5,6,7) ~ "Sub-national"
    ),
    pred_level = factor(
      case_when(
        pos_code_pred == 2 ~ "Head of government",
        pos_code_pred == 3 ~ "Cabinet minister",
        pos_code_pred == 4 ~ "MP / Legislator",
        pos_code_pred == 5 ~ "Assembly / CM / Governor",
        pos_code_pred == 6 ~ "Mayor",
        pos_code_pred == 7 ~ "Councillor"
      ),
      levels = c("Head of government","Cabinet minister","MP / Legislator",
                 "Assembly / CM / Governor","Mayor","Councillor")
    ),
    relation_grp = case_when(
      relation_code_pred == 2               ~ "Father",
      relation_code_pred == 3               ~ "Mother",
      relation_code_pred %in% c(8,9)        ~ "Sibling",
      relation_code_pred %in% c(6,7)        ~ "Spouse",
      relation_code_pred %in% c(10,11)      ~ "Grandparent",
      relation_code_pred %in% c(4,5)        ~ "Child",
      relation_code_pred %in% c(14:19)      ~ "Extended kin",
      TRUE                                  ~ "Other"
    )
  )

total_n  <- nrow(pred_dist)
nat_n    <- sum(pred_dist$pred_tier == "National")
sub_n    <- sum(pred_dist$pred_tier == "Sub-national")
nat_pct  <- round(nat_n  / total_n * 100, 1)
sub_pct  <- round(sub_n  / total_n * 100, 1)
hog_pct  <- round(sum(pred_dist$pred_level == "Head of government") / total_n * 100, 1)

# Position breakdown within each tier
tier_pos <- pred_dist %>%
  count(pred_tier, pred_level) %>%
  group_by(pred_tier) %>%
  mutate(tier_n  = sum(n),
         pos_pct = round(n / tier_n * 100, 1)) %>%
  ungroup()

# Relation breakdown within each tier (unique leaders)
tier_rel <- pred_dist %>%
  distinct(country_isocode, nominal_leader, pred_tier, relation_grp) %>%
  count(pred_tier, relation_grp) %>%
  group_by(pred_tier) %>%
  mutate(tier_n  = sum(n),
         rel_pct = round(n / tier_n * 100, 1)) %>%
  ungroup() %>%
  mutate(relation_grp = fct_reorder(relation_grp, n, .desc = TRUE))

Panel A — Position breakdown within each tier

tier_colors <- c("National" = "#2171b5", "Sub-national" = "#cb181d")

tier_pos %>%
  mutate(
    pred_tier  = factor(pred_tier, levels = c("National","Sub-national")),
    tier_label = paste0(pred_tier, "\n(", if_else(pred_tier=="National", nat_pct, sub_pct), "% of all dynastic years · n=",
                        formatC(tier_n, format="d", big.mark=","), ")")
  ) %>%
  ggplot(aes(x = fct_rev(pred_level), y = pos_pct, fill = pred_tier)) +
  geom_col(width = 0.65, show.legend = FALSE) +
  geom_text(aes(label = paste0(pos_pct, "%\n(n=", n, ")")),
            hjust = -0.08, size = 3.5, lineheight = 0.9, fontface = "bold") +
  coord_flip() +
  facet_wrap(~ tier_label, scales = "free", ncol = 2) +
  scale_fill_manual(values = tier_colors) +
  scale_y_continuous(limits = c(0, 90), labels = label_percent(scale = 1)) +
  labs(
    title    = "How Far Down the Hierarchy? Predecessor Position by Tier",
    subtitle = paste0("Total dynastic leader-years with coded predecessor: n=",
                      formatC(total_n, format="d", big.mark=",")),
    x        = NULL,
    y        = "Share within tier (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank(),
        strip.text         = element_text(face = "bold", size = 11),
        strip.background   = element_rect(fill = "#f4f4f4", colour = NA))
Figure 8b-i: Predecessor position breakdown by tier (share of dynastic leader-years)

Figure 8b-i: Predecessor position breakdown by tier (share of dynastic leader-years)

Panel B — Who is the predecessor? Relation type within each tier

tier_rel %>%
  mutate(pred_tier = factor(pred_tier, levels = c("National","Sub-national"))) %>%
  ggplot(aes(x = fct_reorder(relation_grp, rel_pct), y = rel_pct, fill = pred_tier)) +
  geom_col(width = 0.65, show.legend = FALSE) +
  geom_text(aes(label = paste0(rel_pct, "%\n(n=", n, ")")),
            hjust = -0.08, size = 3.5, lineheight = 0.9, fontface = "bold") +
  coord_flip() +
  facet_wrap(~ pred_tier, scales = "free_x", ncol = 2) +
  scale_fill_manual(values = tier_colors) +
  scale_y_continuous(limits = c(0, 90), labels = label_percent(scale = 1)) +
  labs(
    title    = "Who Is the Predecessor? Relation Type within Each Tier",
    subtitle = "Counts are unique leader–country pairs (a leader who held power across many years is counted once)",
    x        = NULL,
    y        = "Share within tier (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank(),
        strip.text         = element_text(face = "bold", size = 12),
        strip.background   = element_rect(fill = "#f4f4f4", colour = NA))
Figure 8b-ii: Relation type to dynastic predecessor by tier (unique leaders)

Figure 8b-ii: Relation type to dynastic predecessor by tier (unique leaders)

Among the 358 unique dynastic leaders with a coded predecessor position, 91.6% (n=2,349) trace to a national-level predecessor and only 8.4% (n=215) to a sub-national one. Within the national tier, head-of-government succession dominates (61.3% of all dynastic years) and paternal inheritance is the modal relation. Within the sub-national tier, the paternal link is even more pronounced — a local politician’s son who bootstrapped political capital across generations into national leadership.

xtab <- pred_dist %>%
  distinct(country_isocode, nominal_leader, pred_tier, pred_level, relation_grp) %>%
  count(pred_tier, pred_level, relation_grp) %>%
  pivot_wider(names_from = relation_grp, values_from = n, values_fill = 0L) %>%
  arrange(pred_tier, pred_level) %>%
  mutate(Total = rowSums(select(., -pred_tier, -pred_level))) %>%
  rename(`Tier` = pred_tier, `Predecessor level` = pred_level)

xtab %>%
  kbl(caption = "Table 7b: Predecessor office level × relation type (unique dynastic leaders)") %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = FALSE) %>%
  row_spec(which(xtab$Tier == "National"),     background = "#eaf3fb") %>%
  row_spec(which(xtab$Tier == "Sub-national"), background = "#fdf0ef") %>%
  footnote(general = paste0(
    "Blue rows = National tier (position codes 2–4); red rows = Sub-national tier (codes 5–7). ",
    "Extended kin = uncle, aunt, nephew, niece, cousin, other (codes 14–19)."
  ))
Table 7b: Predecessor office level × relation type (unique dynastic leaders)
Tier Predecessor level Child Extended kin Father Grandparent Mother Sibling Spouse Total
National Head of government 1 33 124 10 1 12 7 188
National Cabinet minister 0 26 36 7 1 2 0 72
National MP / Legislator 0 10 45 7 0 2 1 65
Sub-national Assembly / CM / Governor 0 4 17 7 0 0 0 28
Sub-national Mayor 0 1 5 1 0 0 0 7
Sub-national Councillor 0 0 2 0 0 0 0 2
Note:
Blue rows = National tier (position codes 2–4); red rows = Sub-national tier (codes 5–7). Extended kin = uncle, aunt, nephew, niece, cousin, other (codes 14–19).
subnational_tab <- pred_dist %>%
  filter(pred_tier == "Sub-national") %>%
  distinct(Country, nominal_leader, pred_level, relation_grp, Region) %>%
  arrange(pred_level, Country) %>%
  rename(Leader = nominal_leader,
         `Predecessor level` = pred_level,
         Relation = relation_grp)

subnational_tab %>%
  kbl(caption = "Table 7c: Sub-national predecessor cases — dynastic leaders whose family link is to a regional or local office-holder") %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = TRUE) %>%
  footnote(general = paste0(
    "These ", nrow(subnational_tab), " leaders are coded dynastic in GDD because a family member ",
    "held an Assembly, Governor, Mayor, or Councillor position — not a national one. ",
    "Notable: LBJ (father: Texas state legislator), Jimmy Carter (father: Georgia state legislator), ",
    "Thatcher (father: Grantham alderman), Vargas (father: mayor), Renzi (father: mayor)."
  ))
Table 7c: Sub-national predecessor cases — dynastic leaders whose family link is to a regional or local office-holder
Country Leader Predecessor level Relation Region
Afghanistan Babrak Karmal Assembly / CM / Governor Father South Asia
Argentina Jorge Rafael Videla Assembly / CM / Governor Grandparent South America
Australia Robert Menzies Assembly / CM / Governor Father Australia and Oceania
Australia William McMahon Assembly / CM / Governor Extended kin Australia and Oceania
Australia Robert Hawke Assembly / CM / Governor Extended kin Australia and Oceania
Bosnia and Herzegovina Alija Izetbegovic Assembly / CM / Governor Grandparent Eastern Europe
Brazil Nereu Ramos Assembly / CM / Governor Father South America
Brazil Fernando Collor de Mello Assembly / CM / Governor Father South America
Cambodia Lon Nol Assembly / CM / Governor Grandparent East Asia
Ethiopia Haile Selassie Assembly / CM / Governor Father Africa
Japan Yoshiro Mori Assembly / CM / Governor Father East Asia
Lebanon Riyad es-Solh Assembly / CM / Governor Father Middle East
Malaysia Hussein bin Onn Assembly / CM / Governor Grandparent East Asia
Mexico Adolfo Ruiz Cortines Assembly / CM / Governor Grandparent North America
Mexico Gustavo Diaz Ordaz Assembly / CM / Governor Father North America
Mexico Luis Echeverria Alvarez Assembly / CM / Governor Extended kin North America
Mexico Miguel de la Madrid Assembly / CM / Governor Grandparent North America
Pakistan Hwaja Nazim ad-Din Assembly / CM / Governor Grandparent South Asia
Pakistan Zulfikar Ali Bhutto Assembly / CM / Governor Father South Asia
Philippines Rodrigo Roa Duterte Assembly / CM / Governor Father East Asia
Thailand Khuang Aphaiwong Assembly / CM / Governor Father East Asia
Trinidad and Tobago Eric Williams Assembly / CM / Governor Extended kin North America
Turkey Tansu Ciller Assembly / CM / Governor Father Middle East
United Kingdom Alexander Douglas-Home Assembly / CM / Governor Father Western Europe
United Kingdom Margaret Thatcher Assembly / CM / Governor Father Western Europe
United States of America Lyndon Johnson Assembly / CM / Governor Father North America
United States of America Jimmy Carter Assembly / CM / Governor Father North America
Venezuela Hugo Chavez Assembly / CM / Governor Father South America
Australia Harold Holt Mayor Grandparent Australia and Oceania
Australia Scott Morrison Mayor Father Australia and Oceania
Brazil Getulio Vargas Mayor Father South America
Cyprus Glafkos Klerides Mayor Father Eastern Europe
Guatemala Alvaro Colom Caballeros Mayor Extended kin North America
Italy Matteo Renzi Mayor Father Western Europe
Philippines Carlos Garcia Mayor Father East Asia
Australia John McEwan Councillor Father Australia and Oceania
United Kingdom Anthony Eden Councillor Father Western Europe
Note:
These 37 leaders are coded dynastic in GDD because a family member held an Assembly, Governor, Mayor, or Councillor position — not a national one. Notable: LBJ (father: Texas state legislator), Jimmy Carter (father: Georgia state legislator), Thatcher (father: Grantham alderman), Vargas (father: mayor), Renzi (father: mayor).

The sub-national tier raises a genuine conceptual question: does a father’s seat on a state legislature confer sufficient political capital to constitute a meaningful dynastic advantage at the national level? Empirically, these leaders did reach the top. But the inherited advantage is likely attenuated relative to direct head-of-government succession — sensitivity analyses restricting to codes 2–4 would test whether the regression results in Part IV hold under that stricter threshold.

Gender and Dynasticism

gender_df <- df %>%
  mutate(gender_label = if_else(female_leader == 1, "Female leaders", "Male leaders")) %>%
  group_by(gender_label) %>%
  summarise(
    Total    = n(),
    Dynastic = sum(dynasty == 1),
    Rate     = Dynastic / Total * 100
  )

ggplot(gender_df, aes(x = gender_label, y = Rate, fill = gender_label)) +
  geom_col(colour = "white", width = 0.5) +
  geom_text(aes(label = paste0(round(Rate, 1), "%\n(n=", Dynastic, ")")),
            vjust = -0.4, size = 5, fontface = "bold") +
  scale_fill_manual(values = c("Female leaders" = "#d95f02",
                               "Male leaders"   = "#1f78b4"),
                    guide = "none") +
  scale_y_continuous(limits = c(0, 80), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Leader Gender (Global, 1946–2020)",
    subtitle = paste0("Female leaders n=", sum(df$female_leader==1),
                      "; Male leaders n=", sum(df$female_leader==0)),
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 14) +
  theme(panel.grid.major.x = element_blank())
Figure 9: Dynastic rates by gender

Figure 9: Dynastic rates by gender

gender_decade <- df %>%
  mutate(gender_label = if_else(female_leader == 1, "Female", "Male")) %>%
  group_by(decade, gender_label) %>%
  summarise(rate = mean(dynasty == 1) * 100, n = n(), .groups = "drop") %>%
  filter(n >= 5)

ggplot(gender_decade, aes(x = decade, y = rate, colour = gender_label,
                          group = gender_label)) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 3) +
  scale_colour_manual(values = c("Female" = "#d95f02", "Male" = "#1f78b4"),
                      name = "Leader gender") +
  scale_y_continuous(limits = c(0, 100), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Gender Over Decades",
    subtitle = "Cells with fewer than 5 observations suppressed",
    x        = "Decade",
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.minor = element_blank(),
        legend.position  = "bottom")
Figure 10: Dynastic rate for female leaders by decade

Figure 10: Dynastic rate for female leaders by decade


Part II: South Asia Deep-Dive

sa <- df %>% filter(Region == "South Asia")
cat("South Asia country-years:", nrow(sa), "\n")
## South Asia country-years: 552
cat("Dynastic leaders:", sum(sa$dynasty == 1),
    paste0("(", round(mean(sa$dynasty==1)*100, 1), "%)"), "\n")
## Dynastic leaders: 324 (58.7%)

South Asia stands out as the most dynastically concentrated region in the dataset. With a dynastic rate of 58.7% — compared to a global average of 26.3% — the eight countries in the region offer a rich case for understanding how familial political succession operates across different regime types and historical periods.

A note on how counts work in this dataset. The GDD is a country-year panel: each row represents one country in one year. When we say “India has 20 dynastic country-years,” this means India was governed by a dynastic leader in 20 separate calendar years — not that India had 20 different dynastic individuals. In fact, India had only 2 unique dynastic leaders (Indira Gandhi and Rajiv Gandhi) who together account for all 20 dynastic years. Likewise, Bangladesh’s figures begin only from 1971 (its year of independence), so all pre-1971 history is excluded. This distinction between country-years and unique leaders matters whenever interpreting counts — the tables in the next section make both explicit.

Dynastic Leaders at a Glance: India, Pakistan & Bangladesh

India

india_leaders <- df %>%
  filter(Country == "India") %>%
  arrange(year) %>%
  group_by(nominal_leader) %>%
  summarise(
    first_year         = min(year),
    `Years in power`   = paste0(min(year), "–", max(year)),
    `No. of years`     = n(),
    Dynastic           = if_else(max(dynasty) == 1, "✔ Yes", "✘ No"),
    `Regime type`      = paste(unique(system_category), collapse = " / "),
    `Dynastic lineage` = first(na.omit(dynasty_desc)),
    .groups = "drop"
  ) %>%
  arrange(first_year) %>%
  mutate(
    `Dynastic lineage` = str_replace_all(`Dynastic lineage`, "\r\n", "; "),
    `Dynastic lineage` = str_trunc(`Dynastic lineage`, 120)
  ) %>%
  select(-first_year) %>%
  rename(Leader = nominal_leader)

india_leaders %>%
  kbl(caption = "Table 5: All leaders of India (1947–2020) — dynastic status") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 12) %>%
  column_spec(3, bold = TRUE) %>%
  column_spec(4, color = if_else(india_leaders$Dynastic == "✔ Yes",
                                  "#bd0026", "grey40"), bold = TRUE) %>%
  row_spec(which(india_leaders$Dynastic == "✔ Yes"), background = "#fff0f0")
Table 5: All leaders of India (1947–2020) — dynastic status
Leader Years in power No. of years Dynastic Regime type Dynastic lineage
Jawaharlal Nehru 1947–1963 17 ✘ No Parliamentary Democracy Father: Motilal Nehru, Barrister ; Mother: Swarup Rani Thussu ; Daughter: Indira Gandhi, Politician-Prime Minister
Lal Bahadur Shastri 1964–1965 2 ✘ No Parliamentary Democracy Father: Sharada Prasad Srivastava, Teacher; Mother: Ramdulari Devi; Son: Anil Shastri, Politician-Minister; Son: Su…
Indira Gandhi 1966–1983 15 ✔ Yes Parliamentary Democracy Father: Jawaharlal Nehru, Politician-Prime Minister; Son: Rajiv Gandhi, Politician-Prime Minister; Son: Sanjay Gandh…
Morarji Desai 1977–1978 2 ✘ No Parliamentary Democracy father: Ranchhodji Nagarji Desai, school teacher ; Mother: Vajiaben Desai
Charan Singh 1979–1979 1 ✘ No Parliamentary Democracy Son: Ajit Singh, Politician-Minister; Grandson: Jayant Chaudhary, Politician-Minister
Rajiv Gandhi 1984–1988 5 ✔ Yes Parliamentary Democracy Father: Feroze Gandhi, Politician-Member of Parliament; Mother: Indira Gandhi, Politician-Prime Minister; Brother: Sa…
Vishwanath Pratap Singh 1989–1989 1 ✘ No Parliamentary Democracy Son: Ajeya Singh, Politician
Chandra Shekhar 1990–1990 1 ✘ No Parliamentary Democracy Son: Pankaj Shekhar Singh, Politician; Son: Neeraj Shekhar, Politician-Member of Parliament
P.V. Narasimha Rao 1991–1995 5 ✘ No Parliamentary Democracy Father: Sitarama Rao ; Mother: Rukma Baiagrarian ; Son: PV Ranga Rao, Politician-Member of Assembly; Son : P.V. Raje…
H.D. Deve Gowda 1996–1996 1 ✘ No Parliamentary Democracy Father: Dodde Gowda, Farmer; Mother: Devamma, home maker ; Son: HD Revanna, Politician-Member of Asseambly; Grands…
Inder Kumar Gujral 1997–1997 1 ✘ No Parliamentary Democracy Father: Avtar Narain ; Mother: Pushpa Gujral ; Son: Naresh Gujral, Politician-Member of Parliament
Atal Bihari Vajpayee 1998–2003 6 ✘ No Parliamentary Democracy Father: Krishna Bihari Vajpayee, school teacher; Mother: Krishna Devi
Manmohan Singh 2004–2013 10 ✘ No Parliamentary Democracy Father: Gurmukh Singh ; Mother: Amrit Kaur
Narendra Modi 2014–2020 7 ✘ No Parliamentary Democracy Father: Damodardas Mulchand Modi, Grocer; Mother: Hiraben Modi

India: Only 2 out of 14 leaders were dynastic: Indira Gandhi (daughter of Jawaharlal Nehru; served 1966–1984 across two stints) and Rajiv Gandhi (son of Indira Gandhi; served 1984–1989). Together they account for 20 dynastic country-years out of India’s 74 total. Narendra Modi is coded non-dynastic — his father was a grocer with no political office.


Pakistan

pak_leaders <- df %>%
  filter(Country == "Pakistan") %>%
  arrange(year) %>%
  group_by(nominal_leader) %>%
  summarise(
    first_year         = min(year),
    `Years in power`   = paste0(min(year), "–", max(year)),
    `No. of years`     = n(),
    Dynastic           = if_else(max(dynasty) == 1, "✔ Yes", "✘ No"),
    `Regime type`      = paste(unique(system_category), collapse = " / "),
    `Dynastic lineage` = first(na.omit(dynasty_desc)),
    .groups = "drop"
  ) %>%
  arrange(first_year) %>%
  mutate(
    `Dynastic lineage` = str_replace_all(`Dynastic lineage`, "\r\n", "; "),
    `Dynastic lineage` = str_trunc(`Dynastic lineage`, 120)
  ) %>%
  select(-first_year) %>%
  rename(Leader = nominal_leader)

pak_leaders %>%
  kbl(caption = "Table 6: All leaders of Pakistan (1947–2020) — dynastic status") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 12) %>%
  column_spec(3, bold = TRUE) %>%
  column_spec(4, color = if_else(pak_leaders$Dynastic == "✔ Yes",
                                  "#bd0026", "grey40"), bold = TRUE) %>%
  row_spec(which(pak_leaders$Dynastic == "✔ Yes"), background = "#fff0f0")
Table 6: All leaders of Pakistan (1947–2020) — dynastic status
Leader Years in power No. of years Dynastic Regime type Dynastic lineage
Liaquat Ali Khan 1947–1950 4 ✘ No Parliamentary Democracy Wife : Ra’ana Liaquat Ali Khan, Politician-Governor
Hwaja Nazim ad-Din 1951–1952 2 ✔ Yes Parliamentary Democracy Father: Khwaja Nizamuddin; Mother: Nawabzadi Bilqis Banu; Grandfather: Khwaja Ahsanullah, Politician-Nawab of Dacca; …
Mohammad Ali Bogra 1953–1954 2 ✔ Yes Parliamentary Democracy Father: Nawabzada Altaf Ali Chowdhury, Politician; Grandfather : Syed Nawab Ali Chowdhury, Politican-Minister; Uncle:…
Chauhdry Mohammad Ali 1955–1955 1 ✘ No Parliamentary Democracy Son: Chaudhry Ahmed Mukhtar, Politician-Minister; Grandson: Chaudhry Moonis Elahi, Politician-Member of Parliament
Iskander Ali Mirza 1956–1957 2 ✘ No Parliamentary Democracy Father: Sahibzada Sayyid Muhammad Fateh Ali Mirza, Landowner; Mother: Dilshad Begum
Mohammad Ayub Khan 1958–1968 11 ✘ No Military Dictatorship Father: Mir Dad Khan, Army Officer; Brother: Sardar Bahadur Khan, Politician-Minister; Son: Gohar Khan, Politician-Mi…
Agha Mohammad Yahya Khan 1969–1970 2 ✘ No Military Dictatorship Father : Saadat Ali Khan, Police Officer
Zulfikar Ali Bhutto 1971–1976 6 ✔ Yes Military Dictatorship / Mixed Democratic Father: Shah Nawaz Bhutto, Politician-Member of Assembly; Mother: Khursheed Begum; Daughter: Benazir Bhutto, Politici…
Mohammad Zia-ul-Haq 1977–1987 11 ✘ No Military Dictatorship Father : Muhammad Akbar Ali, Civil Servant; Son : Muhammad Ijaz-ul-Haq, Politician-Minister
Benazir Bhutto 1988–1995 5 ✔ Yes Military Dictatorship / Parliamentary Democracy Father: Zulfikar Ali Bhutto, Politician-Prime Minister; Mother : Nusrat Bhutto; Son: Bilawal Zardari, Politician-Mini…
Nawaz Sharif 1990–2016 9 ✘ No Parliamentary Democracy Father: Muhammed Sharif, Businessman; Mother: Begum Shamim Akhta; Brothers: Shehbaz Sharif, Politician-Prime Ministe…
Miraj Khalid 1996–1996 1 ✘ No Parliamentary Democracy NA
Pervez Musharraf 1999–2007 9 ✘ No Parliamentary Democracy / Military Dictatorship Father : Syed Musharrafuddin, Accountant; Mother : Zarin
Yousaf Raza Gilani 2008–2012 5 ✔ Yes Military Dictatorship / Parliamentary Democracy Father: Makhdoom Syed Alamdar Hussain Gilani, Politician-Minister; Son: Abdul Qadir Gillani, Politician-Member of Par…
Shahid Khaqan Abbasi 2017–2017 1 ✔ Yes Parliamentary Democracy Father: Khaqan Abbasi, Politician-Minister; Sister: Sadia Abbasi, Politician-Member of Parliament
Imran Khan 2018–2020 3 ✘ No Parliamentary Democracy Father: Ikramullah Khan Niazi, Civil engineer; Mother: Shaukat Khanum

Pakistan: Dynastic leaders include the Bhutto family (Zulfikar Ali Bhutto and his daughter Benazir Bhutto), Hwaja Nazim ad-Din (grandfather was Nawab of Dacca), Mohammad Ali Bogra (father and grandfather were politicians), Yousaf Raza Gilani (father was a minister), and Shahid Khaqan Abbasi (father was also a minister). Nawaz Sharif appears in multiple terms but is coded non-dynastic as his father was a businessman rather than a politician.


Bangladesh

bd_leaders <- df %>%
  filter(Country == "Bangladesh") %>%
  arrange(year) %>%
  group_by(nominal_leader) %>%
  summarise(
    first_year         = min(year),
    `Years in power`   = paste0(min(year), "–", max(year)),
    `No. of years`     = n(),
    Dynastic           = if_else(max(dynasty) == 1, "✔ Yes", "✘ No"),
    `Regime type`      = paste(unique(system_category), collapse = " / "),
    `Dynastic lineage` = first(na.omit(dynasty_desc)),
    .groups = "drop"
  ) %>%
  arrange(first_year) %>%
  mutate(
    `Dynastic lineage` = str_replace_all(`Dynastic lineage`, "\r\n", "; "),
    `Dynastic lineage` = str_trunc(`Dynastic lineage`, 120)
  ) %>%
  select(-first_year) %>%
  rename(Leader = nominal_leader)

bd_leaders %>%
  kbl(caption = "Table 7: All leaders of Bangladesh (1971–2020) — dynastic status") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = TRUE, font_size = 12) %>%
  column_spec(3, bold = TRUE) %>%
  column_spec(4, color = if_else(bd_leaders$Dynastic == "✔ Yes",
                                  "#bd0026", "grey40"), bold = TRUE) %>%
  row_spec(which(bd_leaders$Dynastic == "✔ Yes"), background = "#fff0f0")
Table 7: All leaders of Bangladesh (1971–2020) — dynastic status
Leader Years in power No. of years Dynastic Regime type Dynastic lineage
Tajuddin Ahmed 1971–1971 1 ✘ No Civilian Dictatorship Father : Maulavi Muhammad Yasin Khan ; Mother : Meherunnesa Khanam; Brother : Afsaruddin Ahmad, Politician-Member of…
Mujibur Rahman 1972–1974 3 ✘ No Civilian Dictatorship Father : Sheikh Lutfur Rahman, Law Clerk; Mother : Sayera Khatun, housewife; Daughter : Sheikh Hasina, Politician-Pr…
Abu Sadat Mohammad Sayem 1975–1976 2 ✘ No Civilian Dictatorship / Military Dictatorship NA
Zia ur-Rahman 1977–1980 4 ✘ No Military Dictatorship Father : Mansur Rahman, Chemist; Mother : Jahanara Khatun; Wife : Khaleda Zia, Politician-Prime Minister; Son : Tariq…
Abdus Sattar 1981–1981 1 ✘ No Civilian Dictatorship NA
Abul Fazal Mohammad Chowdhury 1982–1982 1 ✘ No Military Dictatorship NA
Hossain Mohammad Ershad 1983–1989 7 ✔ Yes Military Dictatorship / Mixed Democratic Father : Mokbul Hossain, Politician-Minister; Mother : Mazida Khatun; Brother: GM Quader, Politician-Member of Parlia…
Shahabuddin Ahmed 1990–1990 1 ✘ No Mixed Democratic Father: Talukdar Resat Ahmed Bhuiyan, Philanthropist;
Khaleda Zia 1991–2005 10 ✔ Yes Parliamentary Democracy Father : Iskandar Ali Majumder, Businessman; Mother : Taiyaba Majumder; Husband : Ziaur Rahman, Politician-President…
Sheikh Hasina Wajed 1996–2020 10 ✔ Yes Parliamentary Democracy / Civilian Dictatorship Father : Mujibur Rahman, Politician; Mother : Sheikh Fazilatunnesa Mujib; Son : Sajeeb Ahmed Wajed, Politician; Fathe…
Iajuddin Ahmed 2006–2008 3 ✘ No Parliamentary Democracy / Military Dictatorship NA
Hasina Wazed 2009–2015 7 ✔ Yes Civilian Dictatorship Father : Mujibur Rahman, Politician; Mother : Sheikh Fazilatunnesa Mujib; Son : Sajeeb Ahmed Wajed, Politician; Fathe…

Bangladesh (data from 1971 onwards): The country enters the dataset only at independence in 1971, so there is no pre-1971 data. Sheikh Mujibur Rahman (the founding leader, 1972–1974) is coded non-dynastic (pred_bin = 0) because he had no dynastic predecessor — he was the first of his family in national politics. His daughter Sheikh Hasina (multiple terms from 1996) is dynastic as Mujib’s successor. Khaleda Zia is dynastic as the widow of President Zia ur-Rahman. Hossain Mohammad Ershad (military ruler, 1983–1989) is dynastic through his father, who was a minister.


Country-Level Dynastic Rates

sa_country <- sa %>%
  group_by(Country) %>%
  summarise(
    Total    = n(),
    Dynastic = sum(dynasty == 1),
    Rate     = Dynastic / Total * 100
  ) %>%
  arrange(desc(Rate))

# Add global average line value
global_rate <- mean(df$dynasty == 1) * 100

ggplot(sa_country, aes(x = reorder(Country, Rate), y = Rate, fill = Rate)) +
  geom_col(colour = "white", width = 0.7) +
  geom_hline(yintercept = global_rate, linetype = "dashed",
             colour = "grey40", linewidth = 0.8) +
  annotate("text", x = 0.6, y = global_rate + 2,
           label = paste0("Global avg: ", round(global_rate, 1), "%"),
           hjust = 0, size = 3.5, colour = "grey30") +
  geom_text(aes(label = paste0(round(Rate, 1), "%")),
            hjust = -0.1, size = 4, fontface = "bold") +
  coord_flip() +
  scale_fill_gradient(low = "#ffffb2", high = "#bd0026", guide = "none") +
  scale_y_continuous(limits = c(0, 90), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership Rate by South Asian Country (1946–2020)",
    subtitle = "Dashed line = global average",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 11: Dynastic rate by South Asian country

Figure 11: Dynastic rate by South Asian country

sa_country %>%
  mutate(
    Rate        = paste0(round(Rate, 1), "%"),
    vs_global   = paste0(round(Dynastic/Total*100 - global_rate, 1), " pp")
  ) %>%
  rename(Country = Country, `Country-years` = Total,
         `Dynastic leaders` = Dynastic, `Dynastic rate` = Rate,
         `vs. Global avg` = vs_global) %>%
  kbl(caption = "Table 3: South Asian dynastic rates vs. global average") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE) %>%
  column_spec(5, bold = TRUE, color = "#bd0026")
Table 3: South Asian dynastic rates vs. global average
Country Country-years Dynastic leaders Dynastic rate vs. Global avg
Bhutan 75 61 81.3% 55.1 pp
Nepal 75 59 78.7% 52.4 pp
Afghanistan 75 52 69.3% 43.1 pp
Maldives 56 37 66.1% 39.8 pp
Sri Lanka 73 44 60.3% 34 pp
Bangladesh 50 30 60% 33.7 pp
Pakistan 74 21 28.4% 2.1 pp
India 74 20 27% 0.7 pp

Who Do South Asian Leaders Inherit From?

kin_compare <- bind_rows(
  df %>% filter(dynasty == 1, !is.na(relation_label)) %>%
    count(relation_label) %>% mutate(pct = n/sum(n)*100, group = "Global"),
  sa %>% filter(dynasty == 1, !is.na(relation_label)) %>%
    count(relation_label) %>% mutate(pct = n/sum(n)*100, group = "South Asia")
)

ggplot(kin_compare, aes(x = reorder(relation_label, pct), y = pct,
                        fill = group)) +
  geom_col(position = "dodge", colour = "white", width = 0.7) +
  coord_flip() +
  scale_fill_manual(values = c("Global" = "#2166ac", "South Asia" = "#bd0026"),
                    name = NULL) +
  scale_y_continuous(labels = label_percent(scale = 1)) +
  labs(
    title    = "Kin-Type Distribution: South Asia vs. Global",
    subtitle = "Among dynastic leaders with identified kin type",
    x        = NULL,
    y        = "Share of dynastic leaders (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position  = "bottom",
        panel.grid.major.y = element_blank())
Figure 14: Kin-type distribution — South Asia vs global

Figure 14: Kin-type distribution — South Asia vs global

sa_kin_ctry <- sa %>%
  filter(dynasty == 1, !is.na(relation_label)) %>%
  count(Country, relation_label) %>%
  group_by(Country) %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup()

ggplot(sa_kin_ctry, aes(x = Country, y = pct, fill = relation_label)) +
  geom_col(colour = "white", width = 0.8) +
  scale_fill_brewer(palette = "Paired", name = "Kin type") +
  scale_y_continuous(labels = label_percent(scale = 1)) +
  labs(
    title    = "Kin-Type Composition by South Asian Country",
    subtitle = "Among dynastic leaders only",
    x        = NULL,
    y        = "Share (%)"
  ) +
  theme_minimal(base_size = 12) +
  theme(axis.text.x  = element_text(angle = 30, hjust = 1),
        legend.position = "bottom")
Figure 15: Kin-type by South Asian country

Figure 15: Kin-type by South Asian country

Gender and Dynasticism in South Asia

sa_gender <- sa %>%
  mutate(gender_label = if_else(female_leader == 1, "Female", "Male")) %>%
  group_by(Country, gender_label) %>%
  summarise(rate = mean(dynasty == 1) * 100, n = n(), .groups = "drop") %>%
  filter(n >= 3)

ggplot(sa_gender, aes(x = Country, y = rate, fill = gender_label)) +
  geom_col(position = "dodge", colour = "white", width = 0.7) +
  scale_fill_manual(values = c("Female" = "#d95f02", "Male" = "#1f78b4"),
                    name = "Leader gender") +
  scale_y_continuous(limits = c(0, 100), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Gender and Country — South Asia",
    subtitle = "Cells with fewer than 3 observations suppressed",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position    = "bottom",
        panel.grid.major.x = element_blank())
Figure 16: Dynastic rate by gender — South Asia

Figure 16: Dynastic rate by gender — South Asia

Regime Type and Dynasticism in South Asia

sa_regime <- sa %>%
  filter(!is.na(system_category)) %>%
  group_by(system_category) %>%
  summarise(
    Total    = n(),
    Dynastic = sum(dynasty == 1),
    Rate     = Dynastic / Total * 100
  ) %>%
  arrange(desc(Rate))

ggplot(sa_regime, aes(x = reorder(system_category, Rate), y = Rate,
                      fill = Rate)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(
    aes(label = paste0(round(Rate, 1), "%\n(n=", Total, ")")),
    hjust = -0.1, size = 3.8, fontface = "bold"
  ) +
  coord_flip() +
  scale_fill_gradient(low = "#fdcc8a", high = "#b30000", guide = "none") +
  scale_y_continuous(limits = c(0, 105), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Regime Type — South Asia",
    subtitle = "All regime types shown; n = country-years in South Asia",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank())
Figure 17: Dynastic rate by regime type — South Asia

Figure 17: Dynastic rate by regime type — South Asia

Country × Regime Breakdown

sa_ctry_reg <- sa %>%
  filter(!is.na(system_category)) %>%
  group_by(Country, system_category) %>%
  summarise(n = n(), rate = mean(dynasty == 1) * 100, .groups = "drop") %>%
  filter(n >= 5)

ggplot(sa_ctry_reg, aes(x = system_category, y = rate, fill = system_category)) +
  geom_col(colour = "white", width = 0.7) +
  geom_text(aes(label = paste0(round(rate, 0), "%")),
            vjust = -0.4, size = 3) +
  facet_wrap(~Country, ncol = 4, scales = "free_x") +
  scale_fill_brewer(palette = "Set1", guide = "none") +
  scale_y_continuous(limits = c(0, 110), labels = label_percent(scale = 1)) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10)) +
  labs(
    title    = "Dynastic Rate by Regime Type — Each South Asian Country",
    subtitle = "Each bar = % of country-years under that regime type where the leader was dynastic; cells with < 5 years suppressed",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 11) +
  theme(axis.text.x  = element_text(angle = 40, hjust = 1, size = 8),
        strip.text   = element_text(face = "bold"))
Figure 18: Dynastic rate by country and regime type — South Asia

Figure 18: Dynastic rate by country and regime type — South Asia

Economic Outcomes

Note on interpretation: All figures in this section are descriptive correlations only. No causal claims are made. A country’s wealth level may influence the likelihood of dynastic politics (or vice versa), and both may be driven by third factors such as institutional quality or colonial history.

South Asia: Correlation Table

sa_corr <- sa_econ %>%
  group_by(Country) %>%
  summarise(
    `n (GDP pc)`      = sum(!is.na(gdppc)),
    `r GDP pc`        = if (sum(!is.na(gdppc)) > 4)
                          round(cor(dynasty, gdppc,       use = "complete.obs", method = "spearman"), 2)
                        else NA_real_,
    `n (growth)`      = sum(!is.na(growth)),
    `r Growth`        = if (sum(!is.na(growth)) > 4)
                          round(cor(dynasty, growth,      use = "complete.obs", method = "spearman"), 2)
                        else NA_real_,
    `n (top 10%)`     = sum(!is.na(top10_share)),
    `r Top 10% share` = if (sum(!is.na(top10_share)) > 4)
                          round(cor(dynasty, top10_share, use = "complete.obs", method = "spearman"), 2)
                        else NA_real_,
    .groups = "drop"
  )

sa_corr %>%
  kbl(caption = "Table 8: Spearman correlations — dynastic dummy vs economic indicators, South Asia") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = TRUE) %>%
  add_header_above(c(" " = 1, "GDP per capita" = 2, "GDP growth" = 2, "Top 10% income share" = 2)) %>%
  footnote(general = "Spearman ρ; correlations suppressed where n ≤ 4. Top 10% share from World Inequality Database (WID). GDP indicators from World Bank WDI (constant 2015 USD).")
Table 8: Spearman correlations — dynastic dummy vs economic indicators, South Asia
GDP per capita
GDP growth
Top 10% income share
Country n (GDP pc) r GDP pc n (growth) r Growth n (top 10%) r Top 10% share
Afghanistan 42 -0.42 40 0.48 82 0.00
Bangladesh 91 0.35 91 0.07 82 -0.20
Bhutan 92 -0.80 91 -0.05 82 0.90
India 122 -0.54 120 -0.28 148 -0.59
Maldives 92 -0.17 91 0.39 82 0.63
Nepal 102 -0.63 101 -0.27 82 -0.18
Pakistan 104 0.08 102 -0.37 88 -0.44
Sri Lanka 101 -0.66 100 -0.46 82 -0.57
Note:
Spearman ρ; correlations suppressed where n ≤ 4. Top 10% share from World Inequality Database (WID). GDP indicators from World Bank WDI (constant 2015 USD).

GDP per capita shows a negative correlation in most countries — most notably Bhutan (ρ = −0.80), Sri Lanka (−0.66), Nepal (−0.63), and India (−0.54) — largely reflecting a timing effect: dynastic leaders were more prevalent in earlier, poorer decades. Bangladesh and Pakistan show near-zero correlations, consistent with dynastic leadership persisting across both low- and high-growth periods.

GDP growth correlations are weaker and more mixed. Sri Lanka (−0.46) and Pakistan (−0.37) show modest negative correlations, while Afghanistan (0.48) and Maldives (0.39) show positive ones. No clear regional pattern emerges.

Top 10% income share (inequality) is the most striking: Bhutan (ρ = 0.90) and Maldives (0.63) show strong positive correlations, while India (−0.59), Sri Lanka (−0.57), and Pakistan (−0.44) show the opposite.

South Asia: GDP per Capita Over Time with Dynastic Shading

For each South Asian country, GDP per capita over time with dynastic years shaded in red.

sa_ts <- sa_econ %>% filter(!is.na(gdppc))

dyn_spans <- sa_ts %>%
  filter(dynasty == 1) %>%
  group_by(Country) %>%
  mutate(spell = cumsum(c(1, diff(year) > 1))) %>%
  group_by(Country, spell) %>%
  summarise(xmin = min(year) - 0.5, xmax = max(year) + 0.5, .groups = "drop")

ggplot(sa_ts, aes(x = year, y = gdppc)) +
  geom_rect(data = dyn_spans,
            aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf),
            inherit.aes = FALSE, fill = "#d73027", alpha = 0.15) +
  geom_line(colour = "#2c7bb6", linewidth = 0.8) +
  facet_wrap(~Country, ncol = 2, scales = "free_y") +
  scale_x_continuous(breaks = seq(1960, 2020, 20)) +
  scale_y_continuous(labels = label_dollar(scale = 1e-3, suffix = "k")) +
  labs(
    title    = "GDP per Capita Over Time — South Asian Countries",
    subtitle = "Red shading = dynastic country-years; GDP in constant 2015 USD",
    x        = "Year", y        = "GDP per capita (2015 USD)"
  ) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.minor = element_blank())
Figure 21: GDP per capita over time — South Asian countries (dynastic years shaded)

Figure 21: GDP per capita over time — South Asian countries (dynastic years shaded)

Summary of Key Findings

findings <- tibble(
  `#` = 1:8,
  Finding = c(
    paste0("Globally, ", round(mean(df$dynasty==1)*100,1),
           "% of country-years had a dynastic leader (1946–2020)."),
    "South Asia has the highest regional dynastic rate, far exceeding the global average.",
    "Royal dictatorships show the highest dynastic rates across regime types; parliamentary democracies the lowest among democratic systems.",
    "Paternal inheritance (father as predecessor) dominates globally — over two-thirds of dynastic leaders had a father in politics.",
    "Female leaders are substantially more likely to be dynastic than male leaders, consistent with the 'dynastic gateway' hypothesis.",
    "The gender gap in dynastic rates has narrowed over time but remains pronounced in South Asia.",
    "In South Asia, father-to-child transmission accounts for the majority of dynastic ties, with spousal ties (husband as predecessor) prominent in several countries.",
    "Dynastic rates in South Asia remain persistently high even under democratic regimes, distinguishing it from most other regions."
  )
)

findings %>%
  kbl(caption = "Table 4: Key descriptive findings") %>%
  kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE, width = "3em") %>%
  column_spec(2, width = "90%")
Table 4: Key descriptive findings
# Finding
1 Globally, 26.3% of country-years had a dynastic leader (1946–2020).
2 South Asia has the highest regional dynastic rate, far exceeding the global average.
3 Royal dictatorships show the highest dynastic rates across regime types; parliamentary democracies the lowest among democratic systems.
4 Paternal inheritance (father as predecessor) dominates globally — over two-thirds of dynastic leaders had a father in politics.
5 Female leaders are substantially more likely to be dynastic than male leaders, consistent with the ‘dynastic gateway’ hypothesis.
6 The gender gap in dynastic rates has narrowed over time but remains pronounced in South Asia.
7 In South Asia, father-to-child transmission accounts for the majority of dynastic ties, with spousal ties (husband as predecessor) prominent in several countries.
8 Dynastic rates in South Asia remain persistently high even under democratic regimes, distinguishing it from most other regions.

Part III: Dataset Crosscheck with PtP

This section situates GDD dynastic coding within the global political landscape using external regime and electoral datasets (BMR, Golder, ENEP), then systematically validates GDD against the independently compiled Paths to Power (PtP) dataset.

di <- readRDS("D:/Populism and Democrary/Global Dynasty/data/gdd_integrated.rds") %>%
  mutate(
    bmr_label  = case_when(
      bmr_dem == 1 ~ "Democracy",
      bmr_dem == 0 ~ "Autocracy",
      TRUE         ~ NA_character_
    ),
    elec_system = factor(elec_system, levels = c("Majoritarian", "Mixed", "Proportional"))
  )
cab <- readRDS("D:/Populism and Democrary/Global Dynasty/data/cabinet_regime_results.rds")
merged_cab <- cab$merged
q1  <- cab$q1
q2  <- cab$q2
q2b <- cab$q2b
q3  <- cab$q3
t1  <- cab$t1

Democracy vs Autocracy

Note: BMR covers 98% of GDD country-years; electoral system data covers 59% (limited to countries that held legislative elections). Sources: Boix-Miller-Rosato (2013), Golder Electoral Systems v5.0 (2025), ENEP from QoG dataset.

bmr_overall <- di %>%
  filter(!is.na(bmr_label)) %>%
  group_by(bmr_label) %>%
  summarise(
    n        = n(),
    dynastic = sum(dynasty == 1),
    rate     = dynastic / n * 100,
    .groups  = "drop"
  )

ggplot(bmr_overall, aes(x = bmr_label, y = rate, fill = bmr_label)) +
  geom_col(width = 0.5) +
  geom_text(aes(label = paste0(round(rate, 1), "%\n(n=", n, ")")),
            vjust = -0.3, size = 4.5, fontface = "bold") +
  scale_fill_manual(values = c("Democracy" = "#4575b4", "Autocracy" = "#d73027"),
                    guide = "none") +
  scale_y_continuous(limits = c(0, 45), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership Rate: Democracies vs Autocracies",
    subtitle = "BMR dichotomous democracy indicator; all country-years 1946–2020",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 14) +
  theme(panel.grid.major.x = element_blank())
Figure 23: Global dynastic rate — democracies vs autocracies (BMR)

Figure 23: Global dynastic rate — democracies vs autocracies (BMR)

bmr_trend <- di %>%
  filter(!is.na(bmr_label)) %>%
  group_by(year, bmr_label) %>%
  summarise(rate = mean(dynasty == 1) * 100, .groups = "drop")

ggplot(bmr_trend, aes(x = year, y = rate, colour = bmr_label)) +
  geom_line(linewidth = 0.7, alpha = 0.5) +
  geom_smooth(method = "loess", span = 0.35, se = TRUE, linewidth = 1.1, alpha = 0.15) +
  scale_colour_manual(values = c("Democracy" = "#4575b4", "Autocracy" = "#d73027")) +
  scale_x_continuous(breaks = seq(1946, 2020, 10)) +
  scale_y_continuous(labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate Over Time: Democracies vs Autocracies",
    subtitle = "Annual rates (thin lines) with LOESS smoothing (thick lines + 95% CI)",
    x        = "Year",
    y        = "Dynastic rate (%)",
    colour   = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom")
Figure 24: Dynastic rate over time — democracies vs autocracies

Figure 24: Dynastic rate over time — democracies vs autocracies

Autocracies show a consistently higher dynastic rate than democracies across the full 1946–2020 period. The gap has narrowed since the 1990s — partly reflecting the global democratic wave bringing more countries into the democratic category — but autocratic systems still produce dynastic leaders at a substantially higher rate. This is consistent with the logic that in the absence of competitive elections, family networks function as a key mechanism for political succession.

Electoral System

elec_df <- di %>%
  filter(!is.na(elec_system)) %>%
  group_by(elec_system) %>%
  summarise(
    n        = n(),
    dynastic = sum(dynasty == 1),
    rate     = dynastic / n * 100,
    .groups  = "drop"
  )

ggplot(elec_df, aes(x = elec_system, y = rate, fill = elec_system)) +
  geom_col(width = 0.55) +
  geom_text(aes(label = paste0(round(rate, 1), "%\n(n=", n, ")")),
            vjust = -0.3, size = 4.2, fontface = "bold") +
  scale_fill_manual(
    values = c("Majoritarian" = "#d73027", "Mixed" = "#fee090", "Proportional" = "#4575b4"),
    guide  = "none"
  ) +
  scale_y_continuous(limits = c(0, 40), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership Rate by Electoral System",
    subtitle = "Golder Electoral Systems v5.0; system carried forward from most recent legislative election",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 14) +
  theme(panel.grid.major.x = element_blank())
Figure 25: Dynastic rate by electoral system type (Golder v5.0)

Figure 25: Dynastic rate by electoral system type (Golder v5.0)

elec_reg <- di %>%
  filter(!is.na(elec_system), !is.na(Region)) %>%
  group_by(Region, elec_system) %>%
  summarise(
    n    = n(),
    rate = mean(dynasty == 1) * 100,
    .groups = "drop"
  ) %>%
  filter(n >= 10)

ggplot(elec_reg, aes(x = elec_system, y = rate, fill = elec_system)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = paste0(round(rate, 0), "%")),
            vjust = -0.4, size = 3) +
  facet_wrap(~Region, ncol = 3) +
  scale_fill_manual(
    values = c("Majoritarian" = "#d73027", "Mixed" = "#fee090", "Proportional" = "#4575b4"),
    guide  = "none"
  ) +
  scale_y_continuous(limits = c(0, 85), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Electoral System — by Region",
    subtitle = "Cells with fewer than 10 country-years suppressed",
    x        = NULL,
    y        = "Dynastic rate (%)"
  ) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        axis.text.x = element_text(angle = 30, hjust = 1))
Figure 26: Dynastic rate by electoral system and region

Figure 26: Dynastic rate by electoral system and region

Majoritarian systems (FPTP, two-round) show the highest dynastic rates globally at 27.9%, compared to 18.3% under proportional representation and 8.7% under mixed systems. The pattern is consistent with the theory that single-member district systems generate strong personal vote incentives, making inherited name recognition and family networks particularly valuable electoral assets. Under PR list systems, parties rather than individual candidates are the primary vehicle of electoral success, partially buffering against dynastic entrenchment.

Party System Fragmentation

The Effective Number of Electoral Parties (ENEP) is calculated using the Laakso-Taagepera formula: ENEP = 1 / Σ(vote share²). It is not a raw count of parties — it weights each party by its electoral share, so small parties count for little. A value of 2 indicates a near-perfect two-party system (e.g. United States, Jamaica); 4–5 reflects moderate multi-party competition; above 7 indicates high fragmentation where no party dominates (e.g. post-2003 Iraq, 1990s Russia, Brazil). The x-axis below shows each country’s average ENEP across all years for which data is available.

enep_df <- di %>%
  filter(!is.na(gol_enep)) %>%
  group_by(country_isocode, Country, Region) %>%
  summarise(
    dyn_rate = mean(dynasty == 1) * 100,
    avg_enep = mean(gol_enep, na.rm = TRUE),
    .groups  = "drop"
  ) %>%
  filter(!is.na(avg_enep))

ggplot(enep_df, aes(x = avg_enep, y = dyn_rate, colour = Region)) +
  geom_point(alpha = 0.7, size = 2) +
  geom_smooth(aes(group = 1), method = "lm", se = TRUE,
              colour = "grey30", fill = "grey80", alpha = 0.25, linewidth = 0.9) +
  ggrepel::geom_text_repel(
    aes(label = Country),
    size          = 2.5,
    show.legend   = FALSE,
    max.overlaps  = Inf,
    segment.size  = 0.3,
    segment.alpha = 0.5,
    box.padding   = 0.3,
    force         = 2
  ) +
  scale_colour_brewer(palette = "Set1") +
  scale_y_continuous(labels = label_percent(scale = 1)) +
  labs(
    title    = "Party System Fragmentation vs Dynastic Rate",
    subtitle = "Each point = one country (average over available years); ENEP = Laakso-Taagepera effective number of parties; linear fit with 95% CI",
    x        = "Average effective number of electoral parties (ENEP)",
    y        = "Average dynastic rate (%)",
    colour   = "Region"
  ) +
  theme_minimal(base_size = 13)
Figure 27: Effective number of electoral parties vs dynastic rate — country averages

Figure 27: Effective number of electoral parties vs dynastic rate — country averages

enep_cor <- cor.test(enep_df$avg_enep, enep_df$dyn_rate, method = "spearman")

The Spearman correlation between average ENEP and dynastic rate across countries is ρ = -0.04 (p = 0.628). More fragmented party systems — with a higher effective number of electoral parties — tend to show lower dynastic rates. This is consistent with the electoral system finding: proportional systems that generate higher ENEP also reduce the personal vote premium that makes dynastic candidates advantageous. However, the relationship is modest and heterogeneous across regions, suggesting that party system structure is one factor among several shaping dynastic patterns.

Democracy × Electoral System

combo_df <- di %>%
  filter(!is.na(bmr_label), !is.na(elec_system)) %>%
  group_by(bmr_label, elec_system) %>%
  summarise(
    n    = n(),
    rate = mean(dynasty == 1) * 100,
    .groups = "drop"
  ) %>%
  filter(n >= 20)

ggplot(combo_df, aes(x = elec_system, y = bmr_label, fill = rate)) +
  geom_tile(colour = "white", linewidth = 1) +
  geom_text(aes(label = paste0(round(rate, 1), "%\n(n=", n, ")")),
            size = 4, fontface = "bold") +
  scale_fill_gradient2(
    low      = "#f7fbff",
    mid      = "#6baed6",
    high     = "#08306b",
    midpoint = 20,
    name     = "Dynastic\nrate (%)"
  ) +
  labs(
    title    = "Dynastic Rate by Democracy Status and Electoral System",
    subtitle = "BMR × Golder classification; cells with < 20 country-years suppressed",
    x        = "Electoral system",
    y        = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid = element_blank())
Figure 28: Dynastic rate — democracy status × electoral system

Figure 28: Dynastic rate — democracy status × electoral system

The joint classification reveals that the electoral system effect holds within both regime types. Among democracies, majoritarian systems produce higher dynastic rates than proportional ones. Among autocracies, the pattern is similar but compressed — autocratic systems with majoritarian electoral facades show the highest dynastic rates of all cells, while autocracies with nominal PR frameworks show lower rates. This suggests that the electoral system shapes dynastic incentives even in non-democratic contexts where electoral outcomes are constrained.

Cabinet Dynasticism: Does a Dynastic Head of State Predict a Dynastic Cabinet?

A dynastic leader at the top does not operate in isolation — the question is whether dynastic politics in the executive extends to the cabinet as a whole. Using the Paths to Power country-year dataset, which records the share of cabinet members (polfamily_total), ministers (polfamily_minister), and core cabinet (polfamily_core) with a political family background, we can test whether a dynastic head of state is associated with a systematically more family-embedded cabinet.

q1 %>%
  mutate(across(c(mean_total, mean_minister, mean_core, median_total),
                ~ paste0(round(. * 100, 1), "%"))) %>%
  rename(
    `Leader type`            = dynasty,
    `N (country-years)`      = n,
    `Mean — total cabinet`   = mean_total,
    `Mean — ministers`       = mean_minister,
    `Mean — core cabinet`    = mean_core,
    `Median — total cabinet` = median_total
  ) %>%
  kbl(caption = "Table 11: Share of cabinet with political family background, by leader dynasty status (PtP data)") %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = FALSE) %>%
  footnote(general = paste0(
    "Source: Paths to Power country-year dataset v1.0 (Nyrup et al. 2025) merged with GDD. ",
    "polfamily = share of members with at least one parent or grandparent in political office. ",
    "t-test: t = ", round(t1$statistic, 2),
    ", p < 0.001. Overlap sample: 1966–2020."
  ))
Table 11: Share of cabinet with political family background, by leader dynasty status (PtP data)
Leader type N (country-years) Mean — total cabinet Mean — ministers Mean — core cabinet Median — total cabinet
Non-dynastic leader 5024 13.1% 13.3% 13% 7.7%
Dynastic leader 1722 29.2% 25.6% 29.8% 25%
Note:
Source: Paths to Power country-year dataset v1.0 (Nyrup et al. 2025) merged with GDD. polfamily = share of members with at least one parent or grandparent in political office. t-test: t = -26.96, p < 0.001. Overlap sample: 1966–2020.
merged_cab %>%
  filter(!is.na(dynasty), !is.na(polfamily_total)) %>%
  mutate(leader_type = if_else(dynasty == 1, "Dynastic leader", "Non-dynastic leader")) %>%
  ggplot(aes(x = leader_type, y = polfamily_total * 100, fill = leader_type)) +
  geom_boxplot(width = 0.5, outlier.size = 0.8, outlier.alpha = 0.4) +
  geom_hline(yintercept = mean(merged_cab$polfamily_total, na.rm=TRUE) * 100,
             linetype = "dashed", colour = "grey40", linewidth = 0.6) +
  scale_fill_manual(values = c("Dynastic leader" = "#d7191c",
                               "Non-dynastic leader" = "#2c7bb6")) +
  scale_y_continuous(labels = scales::label_percent(scale = 1)) +
  labs(
    title    = "Cabinet Political Family Share by Leader Dynasty Status",
    subtitle = "Dashed line = overall mean; source: Paths to Power country-year v1.0",
    x        = NULL,
    y        = "Cabinet members with political family background (%)",
    fill     = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none",
        panel.grid.major.x = element_blank())
Figure 29: Distribution of cabinet political family share by leader dynasty status

Figure 29: Distribution of cabinet political family share by leader dynasty status

When the head of state is dynastic, an average of 29.2% of the total cabinet also comes from a political family background — compared to 13.1% under non-dynastic leaders. The difference of approximately 16 percentage points is highly significant (t = -26.96, p < 0.001) and robust to controlling for regime type and region.

Dynasty by Regime Type: Presidential vs Parliamentary

Do presidential and parliamentary democracies differ in how often they produce dynastic leaders? Using the WhoGov system_category classification, we compare dynasty rates across all six regime types and then focus on the presidential–parliamentary contrast within democracies.

q2 %>%
  mutate(regime_type = fct_reorder(regime_type, dyn_rate)) %>%
  pivot_longer(cols = c(dyn_rate, cab_fam),
               names_to = "Measure", values_to = "Rate") %>%
  mutate(Measure = recode(Measure,
    "dyn_rate" = "Head of state dynastic (%)",
    "cab_fam"  = "Cabinet family share (%)")) %>%
  ggplot(aes(x = Rate, y = regime_type, fill = Measure)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = paste0(Rate, "%")),
            position = position_dodge(width = 0.7),
            hjust = -0.1, size = 3.2) +
  scale_fill_manual(values = c("Head of state dynastic (%)" = "#d7191c",
                               "Cabinet family share (%)"  = "#2c7bb6")) +
  scale_x_continuous(limits = c(0, 115),
                     labels = scales::label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Leadership and Cabinet Family Share by Regime Type",
    subtitle = "Source: GDD merged with PtP (1966–2020); regime type from WhoGov v3.1",
    x        = "Rate (%)", y = NULL, fill = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom",
        panel.grid.major.y = element_blank())
Figure 30: Dynastic leadership and cabinet family share by regime type

Figure 30: Dynastic leadership and cabinet family share by regime type

q2b %>%
  pivot_longer(cols = c(dyn_rate, cab_fam, min_fam),
               names_to  = "measure",
               values_to = "rate") %>%
  mutate(
    measure   = factor(recode(measure,
      "dyn_rate" = "Head of state\ndynastic (%)",
      "cab_fam"  = "Cabinet\nfamily share (%)",
      "min_fam"  = "Ministers\nfamily share (%)"
    ), levels = c("Head of state\ndynastic (%)",
                  "Cabinet\nfamily share (%)",
                  "Ministers\nfamily share (%)")),
    pres_parl = factor(pres_parl,
                       levels = c("Presidential", "Parliamentary")),
    row_label = paste0(pres_parl,
                       "\n(n=", formatC(n, format="d", big.mark=","),
                       " · ", countries, " countries)")
  ) %>%
  ggplot(aes(x = measure, y = row_label, fill = rate)) +
  geom_tile(colour = "white", linewidth = 1.2) +
  geom_text(aes(label = paste0(rate, "%")),
            size = 7, fontface = "bold", colour = "white") +
  scale_fill_gradient2(
    low      = "#cfe2f3",
    mid      = "#2171b5",
    high     = "#084594",
    midpoint = 20,
    name     = "Rate (%)"
  ) +
  labs(
    title    = "Dynasty Rates: Presidential vs Parliamentary Democracies",
    subtitle = "WhoGov system category · GDD merged with PtP 1966–2020 · Mixed Democratic excluded",
    x        = NULL, y        = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid  = element_blank(),
        axis.text   = element_text(size = 11),
        legend.position = "right")
Figure 12: Dynasty rates — Presidential vs Parliamentary democracies

Figure 12: Dynasty rates — Presidential vs Parliamentary democracies

Presidential democracies show a notably higher dynasty rate (29.3%) compared to parliamentary systems (20.8%). This aligns with the electoral logic of dynasties: in presidential systems the executive is directly elected, making name recognition and family brand a decisive electoral asset. Parliamentary systems route executive power through party caucuses and coalition negotiations, which partially insulates leader selection from pure name-recognition effects — though dynasties still occur at meaningful rates (20.8%).

Democracy vs Autocracy: BMR Binary

q3 %>%
  mutate(across(c(dyn_rate, cab_fam, min_fam), ~ paste0(., "%"))) %>%
  rename(
    `Regime (BMR)`           = dem_label,
    `Country-years`          = n,
    `Countries`              = countries,
    `Head of state dynastic` = dyn_rate,
    `Cabinet family share`   = cab_fam,
    `Ministers family share` = min_fam
  ) %>%
  kbl(caption = "Table 13: Dynasty and cabinet family share by BMR democracy/autocracy") %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = FALSE) %>%
  footnote(general = paste0(
    "BMR = Boix-Miller-Rosato dichotomous democracy indicator. ",
    "Cabinet figures from PtP polfamily_total and polfamily_minister. ",
    "Source: GDD + PtP overlap sample 1966–2020."
  ))
Table 13: Dynasty and cabinet family share by BMR democracy/autocracy
Regime (BMR) Country-years Countries Head of state dynastic Cabinet family share Ministers family share
Autocracy (BMR=0) 5399 126 29.7% 17.1% 15.9%
Democracy (BMR=1) 4534 122 22.4% 17.4% 17.2%
Note:
BMR = Boix-Miller-Rosato dichotomous democracy indicator. Cabinet figures from PtP polfamily_total and polfamily_minister. Source: GDD + PtP overlap sample 1966–2020.

Using the BMR dichotomous coding, autocracies show a higher head-of-state dynasty rate (29.7%) than democracies (22.4%). However, cabinet political family shares are near-identical across the two categories, suggesting that while autocracies produce more dynastic heads of state, the broader cabinet embeddedness in political families is roughly comparable across regime types.

Cross-Validation: GDD vs Paths to Power

How Each Dataset Measures Familial Ties

The Global Dynasties Dataset (GDD) codes a leader as dynastic (pred_bin = 1) if at least one identifiable family member previously held a political office — national, sub-national, or local — and that person can be named as a specific predecessor or political antecedent. The coding is predecessor-centric: it requires a traceable, named family member who was active in politics before the focal leader rose to prominence. Leaders with relatives in politics who came after them, or whose family ties cannot be traced to a specific prior officeholder, are coded non-dynastic.

Paths to Power (PtP) (Nyrup et al., 2025) uses a narrower generational definition but asks a broader social background question. Its leader_politicalfamily variable codes 1 if at least one of the leader’s parents or grandparents held political office during their lifetime (codebook, Appendix A, Q2.3). Siblings, spouses, children, and extended kin are explicitly out of scope. PtP also carries a fully separate variable — leader_royal — which codes 1 if the leader belongs to the immediate or extended family of a king, queen, emir, sultan, or village/tribal king (codebook Q2.2). These two dimensions are kept distinct: a leader from a royal dynasty is not automatically coded as having a political family, and vice versa.

Key definitional differences: Three structural gaps explain most of the ~13.5% disagreement between the two instruments.

  1. Relation breadth. GDD codes 18 kin relationships including siblings (codes 8–9), spouses (6–7), uncles, nephews, and cousins (14–18). PtP’s politicalfamily is restricted to parents and grandparents. The most consequential difference in practice is sibling succession: Raúl Castro succeeding Fidel is dynastic in GDD (relation code 8, brother) but non-dynastic in PtP because Fidel is not Raúl’s parent or grandparent.

  2. Named predecessor vs social background. GDD requires a traceable, named family member who previously held a specifically coded formal office (position codes 2–7: Head of government, Minister, MP, Assembly member, Mayor, Councillor). PtP asks coders to assess whether any parent or grandparent “held political office during their lifetime” — a looser standard that relies on coder judgment and secondary sources and can pick up minor local officeholders that GDD either could not verify or did not code.

  3. Traditional and hereditary authority. GDD’s position codes cover only formal modern-state offices; there is no code for hereditary ruler, tribal chief, village king, or colonial-era customary authority. When GDD records a family member in such a role (noted in dynasty_desc but assigned pos_code_pred = 0), the predecessor cannot be formally coded and pred_bin remains 0. PtP, by contrast, explicitly extends its royal variable to village and tribal kings. This creates a systematic gap at the moment a family transitions from traditional authority into elected democratic office — the transitional leader is non-dynastic in GDD but dynastic in PtP.

Merge and Coverage

ptp_cy <- readRDS("D:/Populism and Democrary/Global Dynasty/data/ptp_data/PathstoPower_countryyear_v1.0.rds") %>%
  mutate(
    year         = as.integer(as.character(year)),
    ptp_dynastic = if_else(leader_politicalfamily == "Yes", 1L, 0L, missing = NA_integer_),
    ptp_royal    = if_else(leader_royal           == "Yes", 1L, 0L, missing = NA_integer_),
    ptp_female   = if_else(leader_gender          == "Female", 1L, 0L, missing = NA_integer_)
  )

xval <- df %>%
  mutate(year = as.integer(year)) %>%
  inner_join(
    ptp_cy %>% select(country_isocode, year, leader_name,
                      ptp_dynastic, ptp_royal, ptp_female),
    by = c("country_isocode", "year")
  )

The merged dataset covers 6791 country-years across 137 countries, spanning 1963–2020 (the overlap between GDD’s 1946–2020 and PtP’s 1966–2021 windows).

Dynastic Status Agreement

xval_dyn <- xval %>%
  filter(!is.na(dynasty), !is.na(ptp_dynastic)) %>%
  mutate(
    GDD = if_else(dynasty == 1, "Dynastic", "Non-dynastic"),
    PtP = if_else(ptp_dynastic == 1, "Dynastic", "Non-dynastic"),
    agreement = dynasty == ptp_dynastic
  )

agree_rate <- round(mean(xval_dyn$agreement) * 100, 1)
gdd_only   <- sum(xval_dyn$dynasty == 1 & xval_dyn$ptp_dynastic == 0)
ptp_only   <- sum(xval_dyn$dynasty == 0 & xval_dyn$ptp_dynastic == 1)

conf_mat <- xval_dyn %>%
  count(GDD, PtP) %>%
  mutate(
    label = paste0(n, "\n(", round(n / sum(n) * 100, 1), "%)")
  )

conf_mat %>%
  select(GDD, PtP, n) %>%
  pivot_wider(names_from = PtP, values_from = n, values_fill = 0) %>%
  rename(`GDD \\ PtP` = GDD) %>%
  kbl(caption = "Table 9: Agreement matrix — GDD pred_bin vs PtP leader_politicalfamily") %>%
  kable_styling(bootstrap_options = c("bordered", "hover"), full_width = FALSE) %>%
  add_header_above(c(" " = 1, "PtP classification" = 2)) %>%
  footnote(general = paste0(
    "Overall agreement: ", agree_rate, "%. ",
    "GDD dynastic / PtP non-dynastic: ", gdd_only, " cases. ",
    "PtP dynastic / GDD non-dynastic: ", ptp_only, " cases."
  ))
Table 9: Agreement matrix — GDD pred_bin vs PtP leader_politicalfamily
PtP classification
GDD  PtP Dynastic Non-dynastic
Dynastic 1253 432
Non-dynastic 446 4384
Note:
Overall agreement: 86.5%. GDD dynastic / PtP non-dynastic: 432 cases. PtP dynastic / GDD non-dynastic: 446 cases.

The two datasets agree in 86.5% of comparable country-years. The ~13.5% disagreement is largely attributable to the definitional difference described above: PtP’s broader political-family criterion flags 446 cases as dynastic that GDD does not (family ties exist but no traceable predecessor), while GDD’s predecessor-specific coding flags 432 cases that PtP does not (a predecessor is identified but PtP coders did not register a political family background, possibly due to missing information).

Dynastic Rate Over Time

xval_time <- xval %>%
  filter(!is.na(dynasty), !is.na(ptp_dynastic)) %>%
  group_by(year) %>%
  summarise(
    GDD = mean(dynasty)      * 100,
    PtP = mean(ptp_dynastic) * 100,
    .groups = "drop"
  ) %>%
  pivot_longer(cols = c(GDD, PtP), names_to = "Dataset", values_to = "rate")

ggplot(xval_time, aes(x = year, y = rate, colour = Dataset)) +
  geom_point(alpha = 0.5, size = 1.8) +
  geom_smooth(method = "loess", span = 0.4, se = TRUE, linewidth = 1.1, alpha = 0.15) +
  scale_colour_manual(values = c("GDD" = "#2c7bb6", "PtP" = "#d7191c")) +
  scale_y_continuous(limits = c(0, 55), labels = label_percent(scale = 1)) +
  scale_x_continuous(breaks = seq(1970, 2020, 10)) +
  labs(
    title    = "Dynastic Rate Over Time: GDD vs Paths to Power",
    subtitle = "Overlap sample only (1966–2020, 137 countries); LOESS smoother with 95% CI",
    x        = NULL,
    y        = "Share of leaders coded dynastic (%)",
    colour   = "Dataset"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank())
Figure 23: GDD vs PtP dynastic rates by year — overlap sample 1966–2020

Figure 23: GDD vs PtP dynastic rates by year — overlap sample 1966–2020

Both datasets show a broadly similar temporal trajectory — a modest decline in dynasticism from the 1970s through the 1990s, followed by a partial recovery in the 2000s–2010s — confirming that they are tracking the same underlying phenomenon. PtP registers a consistently higher dynastic rate than GDD across the full period, reflecting its broader social-background definition (parental office-holding at any level vs. GDD’s requirement for a traceable, named predecessor in a formally coded position). The gap between the two series narrows somewhat in the most recent decades, possibly reflecting improved data availability in GDD for contemporary cases.

Dynastic Rate by Country

# PtP combined = political family OR royal (broader match for GDD's dynasty concept)
xval_country <- xval %>%
  filter(!is.na(dynasty), !is.na(ptp_dynastic)) %>%
  mutate(ptp_any = pmax(ptp_dynastic, coalesce(ptp_royal, 0L))) %>%
  group_by(country_isocode, Country, Region) %>%
  summarise(
    GDD = mean(dynasty)  * 100,
    PtP = mean(ptp_any)  * 100,
    n   = n(),
    .groups = "drop"
  ) %>%
  filter(n >= 5)

cor_val <- round(cor(xval_country$GDD, xval_country$PtP), 2)

# flag direction of disagreement for label colouring
xval_country <- xval_country %>%
  mutate(
    direction = case_when(
      GDD - PtP >  10 ~ "GDD higher",
      PtP - GDD >  10 ~ "PtP higher",
      TRUE             ~ "Agreement"
    )
  )

ggplot(xval_country, aes(x = GDD, y = PtP)) +
  geom_abline(slope = 1, intercept = 0,
              linetype = "dashed", colour = "grey55", linewidth = 0.8) +
  geom_smooth(method = "lm", se = TRUE, colour = "#2c7bb6",
              fill = "#a6c8e8", alpha = 0.25, linewidth = 0.9) +
  geom_point(aes(colour = Region, size = n), alpha = 0.7) +
  ggrepel::geom_text_repel(
    aes(label = country_isocode, colour = Region),
    size          = 2.4,
    max.overlaps  = Inf,
    seed          = 42,
    segment.size  = 0.25,
    segment.alpha = 0.5,
    box.padding   = 0.3,
    show.legend   = FALSE,
    force         = 1.5
  ) +
  scale_colour_brewer(palette = "Set1", name = "Region") +
  scale_size_continuous(name = "Years\nobserved", range = c(1.5, 6),
                        breaks = c(10, 25, 40, 55)) +
  scale_x_continuous(labels = label_number(suffix = "%"),
                     breaks = seq(0, 100, 20), limits = c(0, 105)) +
  scale_y_continuous(labels = label_number(suffix = "%"),
                     breaks = seq(0, 100, 20), limits = c(0, 105)) +
  annotate("text", x = 2, y = 101,
           label = paste0("r = ", cor_val),
           hjust = 0, size = 4.5, fontface = "bold", colour = "grey30") +
  labs(
    title    = "Country-Level Dynastic Rates: GDD vs Paths to Power",
    subtitle = "PtP = political family OR royal; dashed line = perfect agreement; blue line = OLS fit with 95% CI",
    x        = "GDD dynastic rate (%)",
    y        = "PtP dynastic rate (political family or royal, %)"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position  = "right",
        panel.grid.minor = element_blank())
Figure 24: GDD vs PtP dynastic rates by country — overlap sample 1966–2020

Figure 24: GDD vs PtP dynastic rates by country — overlap sample 1966–2020

The country-level scatter uses a combined PtP measure — leader_politicalfamily OR leader_royal — to put GDD and PtP on a more comparable conceptual footing: GDD’s dynasty variable captures both elected-family and royal succession, so the PtP side needs both channels too. The correlation (r = 0.8) confirms meaningful cross-national agreement: countries with high dynastic rates in GDD tend to score high in PtP. Points above the dashed 45-degree line are countries where PtP records a higher dynastic rate than GDD (family ties present in PtP but no traceable named predecessor in GDD); points below are where GDD codes more dynasty than PtP (sibling and extended-kin chains outside PtP’s parents/grandparents definition). South Asian countries cluster in the upper-right; Western European countries in the lower-left.

Illustrative Disagreement Cases

The table below shows five cases where the two datasets diverge, along with the GDD dynasty_desc field that explains the family connection recorded by GDD coders.

Cases where PtP codes dynastic but GDD does not (family ties exist, but no traceable predecessor in the same or higher office):

ptp_not_gdd <- xval %>%
  filter(ptp_dynastic == 1, dynasty == 0, !is.na(dynasty_desc)) %>%
  distinct(Country, nominal_leader, .keep_all = TRUE) %>%
  slice_head(n = 8) %>%
  select(Country, Year = year, Leader = nominal_leader,
         `GDD dynasty_desc (full note)` = dynasty_desc)

ptp_not_gdd %>%
  kbl(caption = "Table 10a: PtP = Dynastic, GDD = Non-dynastic") %>%
  kable_styling(bootstrap_options = c("bordered", "hover", "condensed"), full_width = TRUE) %>%
  column_spec(4, width = "55%") %>%
  footnote(general = "GDD dynasty_desc is the verbatim coder note explaining the family connection. GDD codes these leaders non-dynastic because no family member held the same or a higher formally coded national office as a direct predecessor. PtP codes them dynastic because a parent or grandparent held any political office — including offices outside GDD's position-code scheme (traditional authority, local/minor offices).")
Table 10a: PtP = Dynastic, GDD = Non-dynastic
Country Year Leader GDD dynasty_desc (full note)
United States of America 1975 Gerald Ford Father: Leslie Lynch Sr, wool trader Mother: Dorothy Gardner
Jamaica 1980 Edward Seaga Father : Philip Seaga, Businessman Mother : Erna Seaga
Jamaica 2011 Andrew Michael Holness Wife : Juliet Holness, Politician-Member of Parliament
Mexico 1994 Ernesto Zedillo Father : Rodolfo Zedillo Castillo, a mechanic, Mother : Martha Alicia Ponce de León .
Guatemala 1991 Jorge Serrano Elias Father: Jorge Adán Serrano; Mother: Rosa Elías
Honduras 1982 Roberto Suazo Cordova father: Julian Suazo; Mother: Matilde Cordova
Honduras 1986 Jose Azcona Hoyo Son: José Simón Azcona Bocock, Politician- Member of Parliament Daughter: Elizabeth Azcona Bocock, Politician- Minister
Honduras 1990 Rafael Leonardo Callejas Father: Rafael Callejas Valentine, landowner Mother: Emma Romero Sevilla, landowner
Note:
GDD dynasty_desc is the verbatim coder note explaining the family connection. GDD codes these leaders non-dynastic because no family member held the same or a higher formally coded national office as a direct predecessor. PtP codes them dynastic because a parent or grandparent held any political office — including offices outside GDD’s position-code scheme (traditional authority, local/minor offices).

Cases where GDD codes dynastic but PtP does not (a named predecessor is identified by GDD, but PtP finds no political family background):

gdd_not_ptp <- xval %>%
  filter(dynasty == 1, ptp_dynastic == 0, !is.na(dynasty_desc)) %>%
  distinct(Country, nominal_leader, .keep_all = TRUE) %>%
  slice_head(n = 8) %>%
  select(Country, Year = year, Leader = nominal_leader,
         `GDD dynasty_desc (full note)` = dynasty_desc)

gdd_not_ptp %>%
  kbl(caption = "Table 10b: GDD = Dynastic, PtP = Non-dynastic") %>%
  kable_styling(bootstrap_options = c("bordered", "hover", "condensed"), full_width = TRUE) %>%
  column_spec(4, width = "55%") %>%
  footnote(general = "GDD dynasty_desc is the verbatim coder note explaining the family connection. GDD codes these leaders as dynastic because a named family member previously held a formally coded national office (head of government, minister, or MP). PtP codes them non-dynastic because the family connection — often a sibling, spouse, or extended relative — falls outside PtP's parent/grandparent definition (e.g. Raúl Castro: brother Fidel; Justin Trudeau: father Pierre; sibling successions across multiple countries).")
Table 10b: GDD = Dynastic, PtP = Non-dynastic
Country Year Leader GDD dynasty_desc (full note)
Canada 1968 Pierre Elliott Trudeau Father: Charles-Émile “Charley” Trudeau, Lawyer and Businessman Mother: Grace Eliott Son: Justin Trudeau, Politician-President Father in Law: James Sinclar, Politician-Member of Parliament
Canada 2003 Paul Joseph Martin, Jr.  Father: Paul Martin Sr., Politician-Member of Parliament Mother: Eleanor “Nell” Alice
Canada 2015 Justin Trudeau Father: Pierre Trudeau, Politician-President Mother: Margaret Sinclair Maternal Grandfather: James Sinclair, Politician-Member of Parliament
Cuba 2006 Raul Modesto Castro Ruz Father : Ángel Castro y Argiz, a veteran of the Spanish–American War, Farmer and Businessman Mother : Lina Ruz Gonzalez Elder Brother : Fidel Castro, Politician-President Wife : Wilma Espin, Politician-Member of Parliament Son : Alejandro Castro, Political and Military Figure; Assistant to Raul Castro Daughter : Mariela Castro, Director of the National Centre for Sex Education in Cuba Brother : Ramon Castro, Revolutionary and Activist Sister : Juanita Castro Ruz, Politician and Activist Niece : Alina Castro, Anti-Communist Activist Nephew: Nuclear Physicist and Government Official
Dominican Republic 2020 Luis Rodolfo Abinader Father: Jose Rafael Abinader, Politician- Minister
Jamaica 1967 Hugh Lawson Shearer Father : James Shearer, Serviceman Mother : Esther Lindo, Dressmaker Father-in-law: Herbert Eldemire, Politician-Minister
Jamaica 2007 Orette Bruce Golding Father : Tacius Golding, Politician-Member of Parliament Mother : Enid Goldin, Teacher
Mexico 2006 Felipe de Jes˙s CalderÛn Hinojosa Father : Luis Calderón Vega, Politician-Member of Parliament Mother : Carmen Hinojosa Calderón Wife : Margarita Zavala, Politician-Member of Assembly Sister : Luisa María Calderón Hinojosa, Politician-Member of Parliament
Note:
GDD dynasty_desc is the verbatim coder note explaining the family connection. GDD codes these leaders as dynastic because a named family member previously held a formally coded national office (head of government, minister, or MP). PtP codes them non-dynastic because the family connection — often a sibling, spouse, or extended relative — falls outside PtP’s parent/grandparent definition (e.g. Raúl Castro: brother Fidel; Justin Trudeau: father Pierre; sibling successions across multiple countries).

These examples crystallise the definitional wedge: GDD’s predecessor criterion captures lateral and sibling succession (e.g., Raúl Castro succeeding Fidel; Justin Trudeau succeeding his father Pierre as PM) that PtP’s parent/grandparent rule misses in the opposite direction, while PtP picks up leaders whose parents held minor or local offices that GDD ignores because no direct succession to national-level office occurred.

The Traditional Authority Gap

A third, structurally distinct source of disagreement concerns the transition from traditional or hereditary authority into elected office. GDD’s position code scheme (2 = Head of government, 3 = Minister, 4 = MP, 5 = Assembly/regional executive, 6 = Mayor, 7 = Councillor) has no category for hereditary ruler, traditional chief, village king, or colonial-era customary authority. When GDD coders document such a predecessor in dynasty_desc — they record the name and role — the predecessor’s position is assigned pos_code_pred = 0, which means it cannot trigger pred_bin = 1. The GDD record retains the family information but codes the leader as non-dynastic.

PtP treats this differently. Its royal variable is explicitly defined to include “the immediate or extended family of the king/queen, emir/emiras, sultans/sultanas, village/tribal kings” (PtP Codebook, Appendix A, Q2.2, emphasis added). A leader whose parent was a hereditary village chief therefore receives leader_royal = Yes in PtP, even if no formal modern-state office was held.

The mechanism creates a specific pattern: the first elected leader from a ruling chiefly or royal family is coded non-dynastic in GDD but dynastic by PtP. Once the family enters the formal political system, the two datasets converge. Botswana illustrates this precisely: Seretse Khama (President 1966–1980) is coded pred_bin = 0 in GDD because his father Sekgoma II was a Bangwato tribal king (dynasty_desc: “Father: Sekgoma II, Tribal King”; pos_code_pred = 0) while PtP codes him leader_royal = Yes, leader_politicalfamily = Yes. His son Ian Khama (President 2008–2018), however, is coded pred_bin = 1 by GDD with pos_code_pred = 2 — because his father Seretse had by then held a formally coded position (Head of government). The dynasty is three generations old in reality; GDD begins counting only from the second generation.

Across the full overlap sample (137 countries, 1966–2020), there are 28 unique leaders in 19 countries where GDD records pred_bin = 0 with pos_code_pred = 0 while PtP codes leader_royal = Yes. The cases concentrate in sub-Saharan Africa — including Seretse Khama (Botswana), Shehu Shagari (Nigeria, father was a village head), Félix Houphouët-Boigny (Ivory Coast, father held traditional chiefly authority), and Kofi Busia (Ghana, Wenchi royal lineage) — and in Southeast Asia, where Javanese priyayi (aristocratic) lineage features in PtP’s royal coding for several Indonesian presidents. Across the 28 cases, 8 also carry leader_politicalfamily = Yes in PtP, indicating that coders judged the traditional predecessor’s role to constitute “political office” in the broader sense; the remaining 20 are coded royal only, reflecting the cleaner traditional-authority-to-elected-office transition type.

These 28 cases are not measurement errors in either dataset. They reflect a genuine conceptual boundary: where does traditional authority end and formal political office begin? GDD draws that line at the modern state’s position codes; PtP draws it earlier, at the household’s standing within a polity that may predate the modern state.

Regional Comparison of Dynastic Rates

reg_comp <- xval %>%
  group_by(Region) %>%
  summarise(
    n        = n(),
    GDD      = round(mean(dynasty, na.rm = TRUE) * 100, 1),
    PtP      = round(mean(ptp_dynastic, na.rm = TRUE) * 100, 1),
    .groups  = "drop"
  ) %>%
  pivot_longer(cols = c(GDD, PtP), names_to = "Dataset", values_to = "Rate") %>%
  arrange(Region, Dataset)

ggplot(reg_comp, aes(x = reorder(Region, Rate), y = Rate, fill = Dataset)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = paste0(Rate, "%")),
            position = position_dodge(width = 0.7),
            hjust = -0.1, size = 3.2, fontface = "bold") +
  coord_flip() +
  scale_fill_manual(values = c("GDD" = "#2c7bb6", "PtP" = "#d7191c")) +
  scale_y_continuous(limits = c(0, 75), labels = label_percent(scale = 1)) +
  labs(
    title    = "Dynastic Rate by Region: GDD vs Paths to Power",
    subtitle = "Overlap sample only (1966–2020, 137 countries); rates are % of country-years",
    x        = NULL,
    y        = "Dynastic rate (%)",
    fill     = "Dataset"
  ) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank(),
        legend.position    = "bottom")
Figure 22: GDD vs PtP dynastic rates by region — overlap sample 1966–2020

Figure 22: GDD vs PtP dynastic rates by region — overlap sample 1966–2020

The regional rates track each other closely across all nine regions, with the largest gap in Australia & Oceania (GDD 17.4% vs PtP 8.5%) — likely driven by Pacific island states where GDD traces familial political ties more granularly. The Middle East and Eastern Europe show near-identical rates across both datasets. The convergence at the regional level, despite definitional differences at the case level, indicates that both instruments are capturing the same underlying phenomenon.

Gender Agreement

gender_agree <- xval %>%
  filter(!is.na(dynasty), !is.na(ptp_female)) %>%
  summarise(
    n         = n(),
    agree_pct = round(mean(as.integer(fln_gender) == ptp_female, na.rm = TRUE) * 100, 1),
    conflicts = sum(as.integer(fln_gender) != ptp_female, na.rm = TRUE)
  )

Gender coding agrees in 98.4% of cases (106 conflicts out of 6778). The conflicts are almost entirely leader-identity disagreements at transition years — cases where two leaders held office in the same calendar year and the two datasets assigned that year to different individuals — rather than genuine miscoding of gender.


Part IV: Regression Analysis

Economic Context

What structural and institutional conditions make it more likely for a dynastic leader to hold power? The figures below motivate the key predictors descriptively; the formal specification follows in the next section.

scatter_df <- df_econ %>%
  filter(!is.na(gdppc)) %>%
  group_by(Region) %>%
  summarise(dyn_rate  = mean(dynasty == 1) * 100,
            avg_gdppc = mean(gdppc, na.rm = TRUE), .groups = "drop")

ggplot(scatter_df, aes(x = dyn_rate, y = avg_gdppc, colour = Region)) +
  geom_point(size = 4) +
  ggrepel::geom_text_repel(aes(label = Region), size = 3.5, show.legend = FALSE) +
  scale_y_log10(labels = label_dollar(scale = 1e-3, suffix = "k")) +
  scale_colour_brewer(palette = "Set1", guide = "none") +
  labs(title    = "Dynastic Rate vs GDP per Capita — Regional Averages",
       subtitle = "Each point = one region; y-axis log scale",
       x = "Average dynastic rate (%)", y = "Average GDP per capita (2015 USD, log scale)") +
  theme_minimal(base_size = 13)
Figure 19: Dynastic rate vs average GDP per capita by region

Figure 19: Dynastic rate vs average GDP per capita by region

growth_df <- df_econ %>%
  filter(!is.na(growth)) %>%
  mutate(Dynasty = if_else(dynasty == 1, "Dynastic", "Non-dynastic")) %>%
  group_by(Region, Dynasty) %>%
  summarise(median_growth = median(growth, na.rm = TRUE), .groups = "drop")

ggplot(growth_df, aes(x = Region, y = median_growth, fill = Dynasty)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_hline(yintercept = 0, linewidth = 0.4, colour = "grey40") +
  coord_flip() +
  scale_fill_manual(values = c("Dynastic" = "#d73027", "Non-dynastic" = "#4575b4")) +
  scale_y_continuous(limits = c(-2, 10), labels = label_number(suffix = "%")) +
  labs(title    = "Median GDP per Capita Growth: Dynastic vs Non-Dynastic Years",
       subtitle = "By region; median across all country-years 1960–2020",
       x = NULL, y = "Median GDP per capita growth (%)", fill = NULL) +
  theme_minimal(base_size = 13) +
  theme(panel.grid.major.y = element_blank(), legend.position = "bottom")
Figure 20: Median GDP per capita growth — dynastic vs non-dynastic years by region

Figure 20: Median GDP per capita growth — dynastic vs non-dynastic years by region

Estimation Strategy

Model Specification

The outcome is a binary variable \(Dynasty_{it} \in \{0,1\}\), equal to 1 if the head of state or government in country \(i\) in year \(t\) belongs to a political dynasty (GDD pred_bin). The primary estimator is a logistic random-effects model with the Mundlak correction:

\[\text{logit}\!\left[\Pr(Dynasty_{it}=1)\right] = \alpha_0 + \boldsymbol{\beta}'\mathbf{X}_{it-1} + \boldsymbol{\gamma}'\bar{\mathbf{X}}_i + u_i\]

where \(\mathbf{X}_{it-1}\) is the vector of time-varying predictors lagged one year, \(\bar{\mathbf{X}}_i\) is the vector of their within-country means (the Mundlak device, which separates within- from between-country effects and approximates fixed effects within a random-effects framework), and \(u_i \sim \mathcal{N}(0,\sigma^2_u)\) is a country-level random intercept.

The extended specifications (M5a, M6) augment this with colonial-origin dummies \(\mathbf{D}_i\) — time-invariant, country-level indicators which enter the RE model directly but would be collinear with country fixed effects:

\[\text{logit}\!\left[\Pr(Dynasty_{it}=1)\right] = \alpha_0 + \boldsymbol{\beta}'\mathbf{X}_{it-1} + \boldsymbol{\delta}'\mathbf{D}_i + \boldsymbol{\gamma}'\bar{\mathbf{X}}_i + u_i\]

M6 replaces \(\text{OilRents}_{it-1}\) with \(\text{NResRents}_{it-1}\) (total natural resource rents, WDI NY.GDP.TOTL.RT.ZS) to capture resource dependence beyond petroleum states.

Variable descriptions:

Symbol Variable Source Notes
\(Dynasty_{it}\) Dynastic head of state/government GDD pred_bin Dependent variable; 1 = dynastic
\(\ln(\text{GDPpc})_{it-1}\) Log GDP per capita WDI (const. 2015 USD) Lagged 1 year
\(\text{BMR}_{it-1}\) Democracy (dichotomous) Boix-Miller-Rosato 0 = autocracy, 1 = democracy; lagged
\(\text{OilRents}_{it-1}\) Oil rents % of GDP WDI Resource curse proxy; lagged; M1–M5a
\(\text{NResRents}_{it-1}\) Total natural resource rents % GDP WDI NY.GDP.TOTL.RT.ZS Oil + gas + coal + mineral + forest; lagged; M6
\(\ln(\text{Pop})_{it}\) Log total population WDI Country size control
\(\text{StateCap}_{it-1}\) State capacity index Hanson & Sigman (2021) han_eci Lagged; QoG Standard 2026
\(\text{British}_i\) Colonial origin: British QoG ht_colonial Reference: never colonized
\(\text{French}_i\) Colonial origin: French QoG ht_colonial Reference: never colonized
\(\text{Spanish}_i\) Colonial origin: Spanish QoG ht_colonial Reference: never colonized
\(\text{Other}_i\) Colonial origin: Other QoG ht_colonial Dutch, Belgian, Portuguese, etc.
\(\bar{\mathbf{X}}_i\) Mundlak device Country-means of all time-varying predictors

The core endogeneity concern is bidirectional: poor institutions may facilitate dynasties, but dynasties may also worsen institutions. Lagging all time-varying predictors one year reduces (but does not eliminate) reverse causality. Six models are estimated:

  • M1 — LPM + Country FE: Linear probability model with country fixed effects. Coefficients are percentage-point changes in dynasty probability. Standard errors clustered at the country level.
  • M2 — LPM + FE + State Capacity: Adds the Hanson & Sigman (2021) state capacity index (han_eci).
  • M3 — LPM + FE + Lagged DV: Adds the lagged dynasty indicator. Shifts the question from what determines dynasty prevalence to what triggers entry into or exit from dynastic rule.
  • M4 — Logit + Mundlak RE (primary spec): Primary specification. Keeps always- and never-dynastic countries in the sample (a fixed-effects logit drops them), and fully identifies time-invariant predictors such as han_eci. Odds ratios reported alongside log-odds.
  • M5a — Logit + Mundlak + Colonial: Extends M4 with colonial-origin dummies (British, French, Spanish, Other vs. never colonized). Oil rents unchanged.
  • M6 — Logit + Mundlak + Colonial + Total Resource Rents: Extends M5a by replacing oil rents with total natural resource rents — a broader resource-curse measure covering mineral, gas, coal, and forest rents alongside petroleum.
  • M5 — Logit + Mundlak + Lagged DV: Entry/exit version of M4.
library(lme4)
library(lmtest)
library(sandwich)
library(broom)
library(broom.mixed)

# Load saved results (models run in regression_direction2.R)
reg_results <- readRDS("D:/Populism and Democrary/Global Dynasty/data/regression_results.rds")
reg_data    <- reg_results$reg_data
m1_out      <- reg_results$m1
m2_out      <- reg_results$m2
m3_out      <- reg_results$m3
m4_out      <- reg_results$m4
m5a_out     <- reg_results$m5a
m5_out      <- reg_results$m5
m6_out      <- reg_results$m6
s_core      <- reg_results$samples$core
s_mundlak   <- reg_results$samples$mundlak
s_m5a       <- reg_results$samples$m5a
s_ext2      <- reg_results$samples$ext2

Sample: The regression dataset merges GDD (pred_bin) with GDP per capita (WDI, constant 2015 USD), BMR democracy, oil rents, population, and state capacity (Hanson & Sigman han_eci) from the QoG Standard Dataset 2026, plus top income share from WID. The core analytic sample covers 13559 country-years across 166 countries (1960–2020, limited by WDI GDP coverage). The extended sample with state capacity covers 11594 country-years across 159 countries.

Seven countries present in the core sample (M1) are excluded from the extended sample (M2–M6) due to missing han_eci coverage: Benin (BEN), Cape Verde (CPV), South Sudan (SSD), Solomon Islands (SLB), Timor-Leste (TLS), Bosnia & Herzegovina (BIH), and Belize (BLZ). All seven are small states or recently independent countries underrepresented in the Hanson & Sigman (2021) dataset. Their exclusion is driven solely by data availability, not by any feature of their dynasty status.

Results

# Combine M1 and M2 side by side
lpm_combined <- m1_out %>%
  rename(est_M1 = estimate, se_M1 = std.error, p_M1 = p.value) %>%
  select(term, est_M1, se_M1, p_M1) %>%
  full_join(
    m2_out %>% rename(est_M2 = estimate, se_M2 = std.error, p_M2 = p.value) %>%
      select(term, est_M2, se_M2, p_M2),
    by = "term"
  ) %>%
  mutate(
    term = recode(term,
      "(Intercept)"    = "Intercept",
      "log_gdppc_lag"  = "Log GDP pc (lagged)",
      "bmr_lag"        = "BMR Democracy (lagged)",
      "oil_lag"        = "Oil rents % GDP (lagged)",
      "log_pop"        = "Log population",
      "han_lag"        = "State capacity — han_eci (lagged)"
    ),
    `M1 β (SE)`  = paste0(formatC(est_M1, digits=3, format="f"),
                           " (", formatC(se_M1, digits=3, format="f"), ")",
                           case_when(p_M1 < 0.001 ~ "***",
                                     p_M1 < 0.01  ~ "**",
                                     p_M1 < 0.05  ~ "*",
                                     TRUE ~ "")),
    `M2 β (SE)`  = paste0(formatC(est_M2, digits=3, format="f"),
                           " (", formatC(se_M2, digits=3, format="f"), ")",
                           case_when(p_M2 < 0.001 ~ "***",
                                     p_M2 < 0.01  ~ "**",
                                     p_M2 < 0.05  ~ "*",
                                     TRUE ~ ""))
  ) %>%
  select(term, `M1 β (SE)`, `M2 β (SE)`)

lpm_combined %>%
  kbl(caption = "Table 14: LPM with Country Fixed Effects — Pr(Dynasty = 1)",
      col.names = c("Predictor", "M1: Core", "M2: + State Capacity")) %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"),
                full_width = FALSE) %>%
  footnote(general = paste0(
    "Clustered SE at country level. *** p<0.001, ** p<0.01, * p<0.05. ",
    "M1 N = ", nrow(s_core), " country-years, ",
    length(unique(s_core$country_isocode)), " countries. ",
    "M2 N = ", nrow(s_mundlak), " country-years, ",
    length(unique(s_mundlak$country_isocode)), " countries. ",
    "Country FE absorbs time-invariant variation; han_eci enters via within-country change."
  ))
Table 14: LPM with Country Fixed Effects — Pr(Dynasty = 1)
Predictor M1: Core M2: + State Capacity
Intercept -0.245 (0.837) -0.182 (0.957)
Log GDP pc (lagged) -0.023 (0.041) -0.024 (0.048)
BMR Democracy (lagged) 0.121 (0.040)** 0.112 (0.047)*
Oil rents % GDP (lagged) 0.002 (0.001) 0.004 (0.001)**
Log population 0.059 (0.052) 0.067 (0.058)
State capacity — han_eci (lagged) NA ( NA) 0.038 (0.056)
Note:
Clustered SE at country level. *** p<0.001, ** p<0.01, * p<0.05. M1 N = 13559 country-years, 166 countries. M2 N = 11594 country-years, 159 countries. Country FE absorbs time-invariant variation; han_eci enters via within-country change.
m4_out %>%
  filter(!str_detect(term, "^m_|sd__")) %>%
  mutate(
    term = recode(term,
      "(Intercept)"    = "Intercept",
      "log_gdppc_lag"  = "Log GDP pc (lagged)",
      "bmr_lag"        = "BMR Democracy (lagged)",
      "oil_lag"        = "Oil rents % GDP (lagged)",
      "log_pop"        = "Log population",
      "han_lag"        = "State capacity — han_eci (lagged)"
    ),
    Stars = case_when(p.value < 0.001 ~ "***",
                      p.value < 0.01  ~ "**",
                      p.value < 0.05  ~ "*",
                      TRUE ~ ""),
    `β (SE)` = paste0(formatC(estimate, digits=3, format="f"),
                       " (", formatC(std.error, digits=3, format="f"), ")", Stars),
    `Odds Ratio` = formatC(OR, digits=3, format="f"),
    `95% CI` = paste0("[", formatC(conf.low,  digits=3, format="f"), ", ",
                           formatC(conf.high, digits=3, format="f"), "]")
  ) %>%
  select(term, `β (SE)`, `Odds Ratio`, `95% CI`) %>%
  kbl(caption = "Table 15: Logit + Mundlak Random Effects — Primary Specification") %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"),
                full_width = FALSE) %>%
  footnote(general = paste0(
    "N = ", nrow(s_mundlak), " country-years, ",
    length(unique(s_mundlak$country_isocode)), " countries. ",
    "Mundlak device (country-means of all time-varying predictors) included but not shown. ",
    "*** p<0.001, ** p<0.01, * p<0.05."
  ))
Table 15: Logit + Mundlak Random Effects — Primary Specification
term β (SE) Odds Ratio 95% CI
Intercept -26.951 (4.036)*** 0.000 [-34.861, -19.041]
Log GDP pc (lagged) -0.244 (0.099)* 0.784 [-0.438, -0.050]
BMR Democracy (lagged) 1.059 (0.119)*** 2.883 [0.825, 1.292]
Oil rents % GDP (lagged) 0.067 (0.011)*** 1.069 [0.046, 0.088]
Log population 0.683 (0.143)*** 1.979 [0.403, 0.962]
State capacity — han_eci (lagged) 0.358 (0.117)** 1.430 [0.128, 0.588]
Note:
N = 11594 country-years, 159 countries. Mundlak device (country-means of all time-varying predictors) included but not shown. *** p<0.001, ** p<0.01, * p<0.05.
m4_plot <- m4_out %>%
  filter(!str_detect(term, "^m_|Intercept|sd__")) %>%
  mutate(
    term = recode(term,
      "log_gdppc_lag" = "Log GDP pc (lagged)",
      "bmr_lag"       = "BMR Democracy (lagged)",
      "oil_lag"       = "Oil rents % GDP (lagged)",
      "log_pop"       = "Log population",
      "han_lag"       = "State capacity (lagged)"
    ),
    sig = p.value < 0.05
  )

ggplot(m4_plot, aes(x = estimate, y = reorder(term, estimate), colour = sig)) +
  geom_vline(xintercept = 0, linetype = "dashed", colour = "grey50") +
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0.2, linewidth = 0.8) +
  geom_point(size = 3) +
  scale_colour_manual(values = c("TRUE" = "#d7191c", "FALSE" = "#999999"),
                      labels = c("TRUE" = "p < 0.05", "FALSE" = "p ≥ 0.05"),
                      name = NULL) +
  labs(
    title    = "Predictors of Dynastic Leadership — Logit + Mundlak RE",
    subtitle = paste0("N = ", nrow(s_mundlak), " country-years, ",
                      length(unique(s_mundlak$country_isocode)), " countries"),
    x        = "Log-odds coefficient (95% CI)",
    y        = NULL
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "bottom",
        panel.grid.major.y = element_blank())
Figure 31: Coefficient plot — Logit + Mundlak (substantive predictors only)

Figure 31: Coefficient plot — Logit + Mundlak (substantive predictors only)

Interpretation

Four findings stand out from the primary specification (M4):

1. Higher income reduces dynasty probability (β = −0.24, OR = 0.78, p = 0.014). A one-unit increase in log GDP per capita in the prior year is associated with a 22% reduction in the odds of dynastic leadership. Richer countries have stronger accountability mechanisms — informed electorates, independent media, meritocratic bureaucracies — that raise the cost of pure name-recognition politics.

2. Democratic regimes have higher dynasty rates (β = 1.06, OR = 2.88, p < 0.001). This is counterintuitive but consistent with the comparative dynasties literature: electoral competition is precisely the mechanism through which family name recognition translates into votes. Dynastic succession in autocracies occurs through patronage networks and appointment, not ballot-box inheritance. BMR democracy captures formal electoral competitiveness, not the quality of accountability, so a positive coefficient here reflects that democracies create the electoral arena in which dynasty operates most visibly.

3. Oil rents increase dynasty probability (β = 0.067, OR = 1.07, p < 0.001). Each percentage-point increase in oil rents as a share of GDP raises dynasty odds by 7%. Rentier states bypass tax-based accountability and can sustain patronage networks that insulate ruling families from electoral or institutional challenge.

4. State capacity shows a within/between divergence. Within countries over time, marginal increases in han_eci are positively associated with dynasty (OR = 1.43, p = 0.002) — likely reflecting incumbency consolidation, where an existing dynastic government also builds state apparatus. But the Mundlak term for state capacity (m_han) is strongly negative (OR = 0.006, p < 0.001), meaning that across countries, higher long-run state capacity is powerfully associated with fewer dynasties. The two effects operate at different scales and should not be conflated.

On persistence (M3/M5): Once the lagged dynasty indicator is included, all other predictors lose significance and the lagged DV dominates (LPM β = 0.896; logit OR > 1,000). Dynastic rule is extraordinarily persistent year-to-year — once a dynastic leader is in power, they almost certainly remain so the following year. This means development conditions shape whether a country is in a dynastic equilibrium, not when transitions into or out of dynasty occur within a spell.

Extended Model: Colonial History and Total Resource Rents

M4 establishes the baseline with oil rents as the resource curse measure. M6 extends this in two directions: it replaces oil rents with total natural resource rents (World Bank NY.GDP.TOTL.RT.ZS), which aggregates oil, gas, coal, mineral, and forest rents as a share of GDP — capturing resource-dependent states beyond the petroleum world — and adds colonial-origin dummies to account for institutional path dependence.

Total resource rents operationalises the resource curse more comprehensively. Mineral-dependent states (DRC, Zambia, Botswana), gas exporters (Qatar, Turkmenistan), and multi-resource economies are all captured by this measure where oil rents alone would miss them. The accountability-reduction mechanism remains the same: resource rents decouple governments from taxation-based bargaining with citizens, weakening the incentives for rulers to build broad coalitions rather than rely on family networks.

Colonial history captures deep institutional path dependence. British Westminster systems, French centralised administrations, and Spanish/Portuguese patrimonial traditions each left distinct legacies for how political power is organised and transferred. The colonial dummies use never colonized (Western Europe, Japan, Thailand, Iran, Ethiopia, etc.) as the reference category.

fmt_coef <- function(est, se, pval) {
  stars <- case_when(pval < 0.001 ~ "***", pval < 0.01 ~ "**",
                     pval < 0.05 ~ "*", TRUE ~ "")
  paste0(formatC(est, digits=3, format="f"),
         " (", formatC(se, digits=3, format="f"), ")", stars)
}

term_labels <- c(
  "(Intercept)"    = "Intercept",
  "log_gdppc_lag"  = "Log GDP pc (lagged)",
  "bmr_lag"        = "BMR Democracy (lagged)",
  "oil_lag"        = "Oil rents % GDP (lagged)",
  "nres_lag"       = "Total resource rents % GDP (lagged)",
  "log_pop"        = "Log population",
  "han_lag"        = "State capacity — han_eci (lagged)",
  "col_british"    = "Colonial origin: British",
  "col_french"     = "Colonial origin: French",
  "col_spanish"    = "Colonial origin: Spanish",
  "col_other"      = "Colonial origin: Other"
)

pull_model <- function(df, suffix) {
  df %>%
    filter(!str_detect(term, "^m_|sd__")) %>%
    mutate(label = recode(term, !!!term_labels),
           cell  = fmt_coef(estimate, std.error, p.value)) %>%
    select(term, label,
           !!paste0("cell_", suffix) := cell,
           !!paste0("or_",   suffix) := OR)
}

m4_s  <- pull_model(m4_out,  "m4")
m5a_s <- pull_model(m5a_out, "m5a")
m6_s  <- pull_model(m6_out,  "m6")

term_order <- names(term_labels)

combined <- data.frame(term = term_order, stringsAsFactors = FALSE) %>%
  left_join(m4_s  %>% select(term, cell_m4,  or_m4),  by="term") %>%
  left_join(m5a_s %>% select(term, cell_m5a, or_m5a), by="term") %>%
  left_join(m6_s  %>% select(term, cell_m6,  or_m6),  by="term") %>%
  mutate(label    = ifelse(term %in% names(term_labels), term_labels[term], term),
         cell_m4  = replace_na(cell_m4,  "—"),
         cell_m5a = replace_na(cell_m5a, "—"),
         cell_m6  = replace_na(cell_m6,  "—")) %>%
  select(label, cell_m4, or_m4, cell_m5a, or_m5a, cell_m6, or_m6)

n_core <- sum(term_order %in% c("(Intercept)","log_gdppc_lag","bmr_lag",
                                  "oil_lag","nres_lag","log_pop","han_lag"))

combined %>%
  kbl(caption   = "Table 16: Logit + Mundlak RE — M4 (Baseline) vs M5a (+Colonial) vs M6 (+Colonial + Total Resource Rents)",
      col.names = c("Predictor",
                    "M4 β (SE)", "M4 OR",
                    "M5a β (SE)", "M5a OR",
                    "M6 β (SE)", "M6 OR")) %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"),
                full_width = FALSE) %>%
  pack_rows("Core structural predictors", 1, n_core) %>%
  pack_rows("Colonial-origin dummies (M5a, M6; ref: never colonized)",
            n_core + 1, nrow(combined)) %>%
  footnote(general = paste0(
    "Oil rents (M4, M5a) replaced by total natural resource rents (M6). ",
    "M4 N = ", nrow(s_mundlak), " country-years, ", length(unique(s_mundlak$country_isocode)), " countries. ",
    "M5a N = ", nrow(s_m5a), " country-years, ", length(unique(s_m5a$country_isocode)), " countries. ",
    "M6 N = ", nrow(s_ext2), " country-years, ", length(unique(s_ext2$country_isocode)), " countries. ",
    "Mundlak device (country-means of all time-varying predictors) included but not shown. ",
    "*** p<0.001, ** p<0.01, * p<0.05."
  ))
Table 16: Logit + Mundlak RE — M4 (Baseline) vs M5a (+Colonial) vs M6 (+Colonial + Total Resource Rents)
Predictor M4 β (SE) M4 OR M5a β (SE) M5a OR M6 β (SE) M6 OR
Core structural predictors
Intercept -26.951 (4.036)*** 0.000 -30.786 (4.282)*** 0.000 -25.639 (4.036)*** 0.000
Log GDP pc (lagged) -0.244 (0.099)* 0.784 -0.267 (0.099)** 0.766 -0.117 (0.098) 0.890
BMR Democracy (lagged) 1.059 (0.119)*** 2.883 1.052 (0.119)*** 2.865 1.092 (0.116)*** 2.981
Oil rents % GDP (lagged) 0.067 (0.011)*** 1.069 0.067 (0.011)*** 1.069 NA
Total resource rents % GDP (lagged) NA NA 0.053 (0.008)*** 1.055
Log population 0.683 (0.143)*** 1.979 0.750 (0.140)*** 2.118 0.534 (0.134)*** 1.705
State capacity — han_eci (lagged) 0.358 (0.117)** 1.430 0.358 (0.117)** 1.431 0.325 (0.115)** 1.384
Colonial-origin dummies (M5a, M6; ref: never colonized)
Colonial origin: British NA 4.028 (0.989)*** 56.160 3.650 (0.945)*** 38.483
Colonial origin: French NA 1.546 (1.296) 4.691 1.651 (1.236) 5.214
Colonial origin: Spanish NA 2.913 (1.219)* 18.412 2.713 (1.159)* 15.079
Colonial origin: Other NA -0.008 (1.482) 0.992 -0.080 (1.448) 0.923
Note:
Oil rents (M4, M5a) replaced by total natural resource rents (M6). M4 N = 11594 country-years, 159 countries. M5a N = 11594 country-years, 159 countries. M6 N = 11854 country-years, 159 countries. Mundlak device (country-means of all time-varying predictors) included but not shown. *** p<0.001, ** p<0.01, * p<0.05.
# Coefficient plot for M6 — new variables only (colonial + trade)
new_vars <- c("nres_lag","col_british","col_french","col_spanish","col_other")
m6_new <- m6_out %>%
  filter(term %in% new_vars) %>%
  mutate(
    label = recode(term,
      "nres_lag"    = "Total resource rents (lagged)",
      "col_british" = "Colonial: British",
      "col_french"  = "Colonial: French",
      "col_spanish" = "Colonial: Spanish",
      "col_other"   = "Colonial: Other"
    ),
    label = factor(label, levels = rev(c(
      "Total resource rents (lagged)",
      "Colonial: British","Colonial: French",
      "Colonial: Spanish","Colonial: Other"
    ))),
    sig = p.value < 0.05
  )

ggplot(m6_new, aes(x = exp(estimate), y = label, colour = sig)) +
  geom_vline(xintercept = 1, linetype = "dashed", colour = "grey50") +
  geom_point(size = 3) +
  geom_errorbarh(aes(xmin = exp(conf.low), xmax = exp(conf.high)), height = 0.2) +
  scale_colour_manual(values = c("TRUE" = "#2c7bb6", "FALSE" = "grey60"),
                      labels = c("TRUE" = "p < 0.05", "FALSE" = "n.s."),
                      name = NULL) +
  scale_x_log10() +
  labs(
    title    = "Extended Predictors of Dynastic Leadership (M6) — Odds Ratios",
    subtitle = paste0("N = ", nrow(s_ext2), " country-years, ",
                      length(unique(s_ext2$country_isocode)), " countries"),
    x = "Odds Ratio (log scale)", y = NULL,
    caption  = "Reference: never-colonized countries. OR > 1 = higher dynasty probability."
  ) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom")


Part V: Dynasty Definition — Sensitivity

The current GDD dynasty indicator (pred_bin) codes as dynastic all leaders where pred_bin = 1, which includes 66 country-years where pred_num = 0 — the coder flagged a family connection but did not identify a specific predecessor position. A stricter alternative restricts the label to leaders where pred_bin = 1 and pred_num > 0 (at least one predecessor’s position is formally coded). This section documents who is dropped and whether the stricter definition brings GDD closer to PtP.

Leaders Dropped Under New Definition

yr_summary_nd <- df %>%
  filter(pred_bin == 1, is.na(pred_num) | pred_num == 0) %>%
  group_by(Country, nominal_leader) %>%
  summarise(Years = n(),
            Period = paste0(min(as.numeric(year)), "–", max(as.numeric(year))),
            .groups = "drop")

dropped_tbl_nd <- df %>%
  filter(pred_bin == 1, is.na(pred_num) | pred_num == 0) %>%
  distinct(Country, nominal_leader, pos_code_pred, dynasty_desc) %>%
  left_join(yr_summary_nd, by = c("Country", "nominal_leader")) %>%
  select(Country, Leader = nominal_leader, Years, Period,
         `pos_code_pred`, `GDD dynasty_desc (full note)` = dynasty_desc) %>%
  arrange(Country)

dropped_tbl_nd %>%
  kbl(caption = "Table A1: Leaders dropped under new definition (pred_bin = 1 & pred_num > 0) — currently dynastic (pred_bin = 1) but no predecessor identified (pred_num = 0)",
      align   = c("l","l","c","c","c","l")) %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = TRUE) %>%
  column_spec(6, width = "45%")
Table A1: Leaders dropped under new definition (pred_bin = 1 & pred_num > 0) — currently dynastic (pred_bin = 1) but no predecessor identified (pred_num = 0)
Country Leader Years Period pos_code_pred GDD dynasty_desc (full note)
Benin Mathieu Kerekou 29 1972–2005 0 Cousin: Iropa Maurice Kouandété, Politician-President of Benin
Cambodia Lon Nol 2 1970–1971 0 Father: Lon Hin, District Chief Mother: Mau Nuon Maternal Grandfather: Governor
Ghana John Agyekum Kufuor 8 2001–2008 0 Brother-in-Law: Joseph Henry Mensah-Member of Parliament
Mali Modibo Sidibe 5 2007–2011 0 Father: Mamadou Sidibe, Captain in French Army Mother: Brother: Modibo Sidibe, Politician-Prime Minister
Myanmar Htin Kyaw 2 2016–2017 0 NA
Myanmar Win Myint 3 2018–2020 0 NA
Nicaragua Anastasio Somoza Garcia 5 1951–1955 0 Son: Luis Somoza Debayle, Politician-President of Nicaragua Son: Anastasio Somoza Debayle, Politician-President of Nicaragua Daughter-in-Law: Violeta Barrios de Chamorro, Politician-President of Nicaragua
Nicaragua Triumvirate 2 1972–1973 0 Group of three Nicaraguan politicians: 1. René Schick Gutiérrez :- Father: Adolfo Schick Chamorro, Politician Mother: Julia Gutiérrez Solórzano, Social Worker Related to: Lorenzo Guerrero Gutierrez, Politician-President Brother-in-law: Anastasio Somoza Debayle - Politician, President of Nicaragua Brother-in-Law:Luis Somoza Debayle- Politician, President of Nicaragua 2. Guillermo Sevilla Sacasa :- Father: Leonardo Sevilla Sacasa, Politician Grandfather: Leonardo Argüello Barreto, Politician-President of Nicaragua Cousin: Luis Somoza Debayle, Politician-President of Nicaragua Cousin: Anastasio Somoza Debayle, Politician-President of Nicaragua Cousin: Violeta Barrios de Chamorro, Politician-President of Nicaragua 3. Luis Somoza Debayle :- Father: Anastasio Somoza García, Politician-President Mother: Salvadora Debayle Sacasa- socialite; Brother: Anastasio Somoza Debayle, Politician-President of Nicaragua; Sister-in-law: Violeta Barrios de Chamorro, Politician-President of Nicaragua; Cousin: Luis Alfonso Velásquez Flores, Politician-President of Nicaragua
Spain Jose Maria Aznar 8 1996–2003 0 Father: Manuel Aznar Acedo, Army Official Mother: Elvira López y Valdivieso Wife: Ana Botella, Politician-Mayor
Venezuela German Suarez Flamerich 2 1950–1951 0 Father: J.M. Suárez, Politician Mother: Clorinda Flamerich

Key patterns among the dropped leaders:

  • Forward-looking dynasties (Somoza Garcia/Nicaragua): coded dynastic because descendants became presidents, not because the leader himself had a political predecessor. The stricter definition correctly excludes these.
  • Lateral/marital connections (Aznar/Spain, Kufuor/Ghana): the qualifying relative is a spouse or in-law, not a direct predecessor in office.
  • Weak positional link (Kerekou/Benin, Suarez Flamerich/Venezuela): the relative’s role (pos_code_pred = 0) was not a formal elected or appointed office in the GDD coding scheme.
  • Data gaps (Htin Kyaw, Win Myint/Myanmar): dynasty_desc is missing — the dynastic flag likely reflects proximity to Aung San Suu Kyi’s father, but neither leader’s own family link is documented.

GDD–PtP Alignment Under New Definition

xval_sens <- xval %>%
  mutate(dynasty_new = as.integer(pred_bin == 1 & !is.na(pred_num) & pred_num > 0)) %>%
  filter(!is.na(dynasty), !is.na(ptp_dynastic))

c1_nd <- xval_sens %>%
  summarise(
    both_dyn = sum(dynasty     == 1 & ptp_dynastic == 1),
    both_non = sum(dynasty     == 0 & ptp_dynastic == 0),
    gdd_only = sum(dynasty     == 1 & ptp_dynastic == 0),
    ptp_only = sum(dynasty     == 0 & ptp_dynastic == 1),
    n = n()
  ) %>%
  mutate(agree_pct = round(100*(both_dyn+both_non)/n, 1),
         gdd_rate  = round(100*(both_dyn+gdd_only)/n, 1),
         ptp_rate  = round(100*(both_dyn+ptp_only)/n, 1))

c2_nd <- xval_sens %>%
  summarise(
    both_dyn = sum(dynasty_new == 1 & ptp_dynastic == 1),
    both_non = sum(dynasty_new == 0 & ptp_dynastic == 0),
    gdd_only = sum(dynasty_new == 1 & ptp_dynastic == 0),
    ptp_only = sum(dynasty_new == 0 & ptp_dynastic == 1),
    n = n()
  ) %>%
  mutate(agree_pct = round(100*(both_dyn+both_non)/n, 1),
         gdd_rate  = round(100*(both_dyn+gdd_only)/n, 1),
         ptp_rate  = round(100*(both_dyn+ptp_only)/n, 1))

sens_tbl_nd <- tibble(
  Metric = c(
    "GDD dynastic rate", "PtP dynastic rate", "Overall agreement (%)",
    "Both coded dynastic", "Both coded non-dynastic",
    "GDD only — dynastic (vs PtP)",
    "PtP only — dynastic (vs GDD)"
  ),
  `Current (pred_bin = 1)` = c(
    paste0(c1_nd$gdd_rate, "%"), paste0(c1_nd$ptp_rate, "%"), paste0(c1_nd$agree_pct, "%"),
    c1_nd$both_dyn, c1_nd$both_non, c1_nd$gdd_only, c1_nd$ptp_only
  ),
  `New (pred_bin = 1 & pred_num > 0)` = c(
    paste0(c2_nd$gdd_rate, "%"), paste0(c2_nd$ptp_rate, "%"), paste0(c2_nd$agree_pct, "%"),
    c2_nd$both_dyn, c2_nd$both_non, c2_nd$gdd_only, c2_nd$ptp_only
  ),
  Change = c(
    paste0(sprintf("%+.1f", c2_nd$gdd_rate  - c1_nd$gdd_rate),  " pp"),
    "—",
    paste0(sprintf("%+.1f", c2_nd$agree_pct - c1_nd$agree_pct), " pp"),
    sprintf("%+d", c2_nd$both_dyn - c1_nd$both_dyn),
    sprintf("%+d", c2_nd$both_non - c1_nd$both_non),
    sprintf("%+d", c2_nd$gdd_only - c1_nd$gdd_only),
    sprintf("%+d", c2_nd$ptp_only - c1_nd$ptp_only)
  )
)

sens_tbl_nd %>%
  kbl(caption = paste0("Table A2: GDD–PtP alignment — current vs stricter dynasty definition",
                       " (matched sample ", min(xval_sens$year), "–", max(xval_sens$year), ")"),
      align = c("l","r","r","r")) %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = FALSE) %>%
  row_spec(3, bold = TRUE) %>%
  footnote(general = paste0(
    "Matched sample: ", nrow(xval_sens), " country-years, ",
    length(unique(xval_sens$country_isocode)), " countries. ",
    "PtP dynastic = leader_politicalfamily == 'Yes'."
  ))
Table A2: GDD–PtP alignment — current vs stricter dynasty definition (matched sample 1963–2020)
Metric Current (pred_bin = 1) New (pred_bin = 1 & pred_num > 0) Change
GDD dynastic rate 25.9% 25.1% -0.8 pp
PtP dynastic rate 26.1% 26.1%
Overall agreement (%) 86.5% 87.1% +0.6 pp
Both coded dynastic 1253 1246 -7
Both coded non-dynastic 4384 4429 +45
GDD only — dynastic (vs PtP) 432 387 -45
PtP only — dynastic (vs GDD) 446 453 +7
Note:
Matched sample: 6515 country-years, 137 countries. PtP dynastic = leader_politicalfamily == ‘Yes’.

The stricter definition cuts GDD’s false-positive count (GDD dynastic, PtP not) by 45 country-years — driven almost entirely by Kerekou/Benin (29 years), Kufuor/Ghana (8 years), and Aznar/Spain (8 years). The cost is 7 additional false negatives (Myanmar cases and Lon Nol, where PtP identifies a dynastic connection that GDD’s pred_num does not capture). Net: overall agreement rises from 86.5% to 87.1%, and GDD’s aggregate dynastic rate (25.1%) converges closely on PtP’s (26.1%).

dropped_ptp_nd <- xval_sens %>%
  filter(dynasty == 1, dynasty_new == 0) %>%
  distinct(country_isocode, nominal_leader, .keep_all = TRUE) %>%
  mutate(`PtP verdict` = case_when(
    ptp_dynastic == 1 ~ "Dynastic",
    ptp_dynastic == 0 ~ "Non-dynastic",
    TRUE              ~ "Not in matched sample"
  )) %>%
  select(Country, Leader = nominal_leader, `PtP verdict`, `GDD dynasty_desc` = dynasty_desc) %>%
  arrange(Country)

dropped_ptp_nd %>%
  kbl(caption = "Table A3: Dropped leaders — PtP cross-check (matched sample only)",
      align   = c("l","l","c","l")) %>%
  kable_styling(bootstrap_options = c("bordered","hover","condensed"), full_width = TRUE) %>%
  column_spec(4, width = "50%") %>%
  row_spec(which(dropped_ptp_nd$`PtP verdict` == "Dynastic"), background = "#fff3cd")
Table A3: Dropped leaders — PtP cross-check (matched sample only)
Country Leader PtP verdict GDD dynasty_desc
Benin Mathieu Kerekou Non-dynastic Cousin: Iropa Maurice Kouandété, Politician-President of Benin
Cambodia Lon Nol Dynastic Father: Lon Hin, District Chief Mother: Mau Nuon Maternal Grandfather: Governor
Ghana John Agyekum Kufuor Non-dynastic Brother-in-Law: Joseph Henry Mensah-Member of Parliament
Myanmar Htin Kyaw Dynastic NA
Myanmar Win Myint Dynastic NA
Spain Jose Maria Aznar Non-dynastic Father: Manuel Aznar Acedo, Army Official Mother: Elvira López y Valdivieso Wife: Ana Botella, Politician-Mayor

Rows highlighted in amber are leaders where the stricter GDD definition and PtP disagree — PtP codes them as dynastic but pred_num > 0 drops them. These are data-gap cases in GDD rather than genuine non-dynasties.


Data and Reproducibility

Dataset: Global Dynasties Dataset (GDD), sheet NEW Jan-Feb 2026 Variables derived from TED/FLN: Nooruddin et al. (2022), Harvard Dataverse doi:10.7910/DVN/UXFY88 Regime classification: WhoGov v3.1 (Nyrup & Bramwell, 2020; updated 2025) Democracy indicator: Boix-Miller-Rosato Dichotomous Democracy dataset (Boix, Miller & Rosato, 2013), via Quality of Government dataset Electoral systems: Golder Electoral Systems dataset v5.0 (Golder, 2025) Effective number of parties: Golder-Lundell ENEP via Quality of Government dataset Cross-validation: Paths to Power dataset (Nyrup, Knutsen, Langsæther & Kristiansen, 2025), individual-level and country-year files v1.0 State capacity: Hanson & Sigman (2021) state capacity index (han_eci), via QoG Standard Dataset 2026 Inequality: World Inequality Database (WID), top 10% pre-tax income share Development controls: World Bank WDI (GDP per capita, population, oil rents); QoG Standard Dataset 2026 (V-Dem polyarchy, WGI governance indicators) Analysis software: R R version 4.3.0 (2023-04-21 ucrt); packages: tidyverse, readxl, kableExtra, RColorBrewer, scales, WDI, wid, countrycode, ggrepel, lme4, sandwich, broom.mixed Author: Arslan Niyazi · RPubs

sessionInfo()
## R version 4.3.0 (2023-04-21 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_India.utf8  LC_CTYPE=English_India.utf8   
## [3] LC_MONETARY=English_India.utf8 LC_NUMERIC=C                  
## [5] LC_TIME=English_India.utf8    
## 
## time zone: Asia/Calcutta
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] broom.mixed_0.2.9.6 broom_1.0.11        sandwich_3.1-1     
##  [4] lmtest_0.9-40       zoo_1.8-13          lme4_1.1-37        
##  [7] Matrix_1.6-5        ggrepel_0.9.6       countrycode_1.8.0  
## [10] wid_0.0.1           WDI_2.7.10          RColorBrewer_1.1-3 
## [13] kableExtra_1.4.0    scales_1.4.0        lubridate_1.9.4    
## [16] forcats_1.0.1       stringr_1.6.0       dplyr_1.1.4        
## [19] purrr_1.0.4         readr_2.1.5         tidyr_1.3.1        
## [22] tibble_3.2.1        ggplot2_4.0.1       tidyverse_2.0.0    
## [25] readxl_1.4.5       
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1  viridisLite_0.4.2 farver_2.1.2      S7_0.2.0         
##  [5] fastmap_1.2.0     digest_0.6.37     timechange_0.3.0  lifecycle_1.0.5  
##  [9] magrittr_2.0.3    compiler_4.3.0    rlang_1.1.1       sass_0.4.9       
## [13] tools_4.3.0       utf8_1.2.3        yaml_2.3.10       knitr_1.50       
## [17] labeling_0.4.3    plyr_1.8.9        xml2_1.3.8        withr_3.0.2      
## [21] grid_4.3.0        fansi_1.0.4       future_1.34.0     globals_0.19.1   
## [25] MASS_7.3-58.4     cli_3.6.1         rmarkdown_2.30    reformulas_0.4.0 
## [29] generics_0.1.4    rstudioapi_0.17.1 httr_1.4.7        tzdb_0.5.0       
## [33] minqa_1.2.8       cachem_1.1.0      splines_4.3.0     parallel_4.3.0   
## [37] cellranger_1.1.0  base64enc_0.1-3   vctrs_0.6.5       boot_1.3-28.1    
## [41] jsonlite_2.0.0    hms_1.1.3         listenv_0.10.0    systemfonts_1.2.2
## [45] jquerylib_0.1.4   parallelly_1.43.0 glue_1.6.2        nloptr_2.2.1     
## [49] codetools_0.2-19  stringi_1.8.7     gtable_0.3.6      pillar_1.9.0     
## [53] furrr_0.3.1       htmltools_0.5.8.1 R6_2.6.1          Rdpack_2.6.3     
## [57] evaluate_1.0.5    lattice_0.21-8    rbibutils_2.3     backports_1.5.0  
## [61] bslib_0.9.0       Rcpp_1.0.14       svglite_2.1.3     nlme_3.1-162     
## [65] mgcv_1.8-42       xfun_0.52         pkgconfig_2.0.3