Legal Authority Index (LAI): strength/diversity of legal sources.
Legitimacy Participation Index (LPI): outward-facing engagement + compliance/reporting.
Effectiveness/Performance Index (EPI): capacity to deliver & monitor.
# ===== Packages =====
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggeffects)
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ ggplot2 3.5.2 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.3.0
## ✔ purrr 1.1.0 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(stringr)
library(ggplot2)
library(broom)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:dplyr':
##
## select
library(cluster)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(DescTools)
library(emmeans)
## Welcome to emmeans.
## Caution: You lose important information if you filter this package's results.
## See '? untidy'
library(ggridges)
library(ggrepel)
# Load all datasets
df_year <- read_csv("Data/year_data.csv") %>%
clean_names()
## Rows: 48 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Institution, Founding_Era_Category
## dbl (3): Year_cleaned, FoundingDensity_5yr, CumulativeStock
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_spatial <- read_csv("Data/spatial_jurisdiction_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Spatial, Archipelago_WithinIGO, Coastal Zone_WithinI...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_vertical <- read_csv("Data/vertical_coordinations_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Vertical_Coordination, Data Integration Systems_With...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_subject <- read_csv("Data/subject_matter_jurisdiction_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Subject_Matter, Biodiversity & Ecosystem Conservatio...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_strategies <- read_csv("Data/strategies_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Strategies, Capacity Development & Operational Deliv...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_objectives <- read_csv("Data/defined_objectives_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Defined_Objectives, Environmental Action_WithinIGO, ...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_relationships <- read_csv("Data/defined_inter_institutional_relationships_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Defined_Inter, Civil Society Engagement_WithinIGO, D...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_sources <- read_csv("Data/sources_of_jurisdiction_data.csv") %>%
clean_names()
## Rows: 48 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Institution
## dbl (21): Ordinal_Score_Sources, Bilateral/Multilateral Arrangements_WithinI...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Merge all datasets
df <- df_year %>%
left_join(df_spatial, by = "institution") %>%
left_join(df_vertical, by = "institution") %>%
left_join(df_subject, by = "institution") %>%
left_join(df_strategies, by = "institution") %>%
left_join(df_objectives, by = "institution") %>%
left_join(df_relationships, by = "institution") %>%
left_join(df_sources, by = "institution")
# ====== CONSTRUCT INDICES ======
# 1) Legal Authority Index (LAI): mean of legal source presence/strength items
lai_cols <- c(133:152) # sources within & across (binding, delegated powers, norms, etc.)
df <- df %>%
mutate(LAI = rowMeans(across(all_of(lai_cols)), na.rm = TRUE))
# 2) Legitimacy Participation Index (LPI): participation + compliance/reporting
lpi_cols <- c(112:119, 121:131, 34, 120) # engagement plus reporting & treaty body coordination
df <- df %>%
mutate(LPI = rowMeans(across(all_of(lpi_cols)), na.rm = TRUE))
# 3) Effectiveness/Performance Index (EPI): strategies + monitoring + delivery
epi_cols <- c(69:79, 86:89, 97, 98, 101:110) # strategy within + across & key objectives like monitoring/delivery
df <- df %>%
mutate(EPI = rowMeans(across(all_of(epi_cols)), na.rm = TRUE))
# Center/scale for regressions
df <- df %>%
mutate(across(c(LAI, LPI, EPI, cumulative_stock, year_cleaned,
ordinal_score_vertical_coordination), scale))
# Engagement
# Engagement sub-index: civil society + NGO + private sector + scientific linkages
eng_cols <- c(112,115,116,118,122,125,126,128) # adjust indices to your data mapping
df <- df %>%
mutate(
ENG = rowMeans(across(all_of(eng_cols)), na.rm = TRUE)
)
m_h32 <- lm(LPI ~ ENG + cumulative_stock, data = df)
summary(m_h32)
##
## Call:
## lm(formula = LPI ~ ENG + cumulative_stock, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.70787 -0.35125 -0.00351 0.36486 1.68182
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.87637 0.15100 -5.804 6.10e-07 ***
## ENG 0.62052 0.08234 7.536 1.65e-09 ***
## cumulative_stock 0.07268 0.09854 0.738 0.465
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6673 on 45 degrees of freedom
## Multiple R-squared: 0.5737, Adjusted R-squared: 0.5547
## F-statistic: 30.28 on 2 and 45 DF, p-value: 4.666e-09
# Predictions for regression line
pred_h32 <- ggpredict(m_h32, terms = "ENG [all]")
# Choose a coloring variable: founding era
color_var <- "founding_era_category"
# Plot with institutions
p_h32 <- ggplot() +
# IGOs as points
geom_point(data = df, aes(x = ENG, y = LPI, color = .data[[color_var]]),
size = 3, alpha = 0.85) +
# Regression fit
geom_ribbon(data = pred_h32, aes(x = x, ymin = conf.low, ymax = conf.high),
fill = "grey70", alpha = 0.25) +
geom_line(data = pred_h32, aes(x = x, y = predicted),
color = "darkblue", size = 1.1) +
# Label a few IGOs (extremes in legitimacy)
geom_text_repel(
data = df %>% filter(LPI == max(LPI, na.rm = TRUE) | LPI == min(LPI, na.rm = TRUE)),
aes(x = ENG, y = LPI, label = institution, color = .data[[color_var]]),
size = 3.3, fontface = "bold", max.overlaps = 12
) +
# Titles and labels
labs(
title = "Figure 3.2 H3.2 — Public Engagement and Legitimacy",
subtitle = "IGOs engaging more with societal stakeholders (civil society, NGOs, private sector, science) show higher legitimacy.",
x = "Engagement Index (standardized)",
y = "Legitimacy Participation Index (standardized)",
color = str_replace_all(color_var, "_", " "),
) +
theme_minimal(base_size = 13) +
theme(legend.position = "right")
# Save
ggsave("conjecture_Images/figure_3_2_h3_2_ENG_LPI.png", p_h32, width = 9, height = 5.5, dpi = 300)
print(p_h32)
The figure 3.2 shows the relationship between public engagement (ENG)
and the Legitimacy Participation Index (LPI) across IGOs, with points
color-coded by founding era. The fitted regression line with a positive
slope indicates that IGOs that interact more intensively with societal
stakeholders — including civil society organizations, NGOs, private
sector actors, and scientific communities — tend to score higher on
legitimacy.
The shaded band represents 95% confidence intervals, confirming that the positive relationship is statistically consistent though with some variation.
On the higher end of engagement and legitimacy, we see IGOs like ITC (International Trade Centre), which exemplifies strong stakeholder outreach and inclusive practices.
On the lower end, the Minamata Convention scores much lower on both engagement and legitimacy, reflecting its relatively limited external participation structures despite being more recent.
Importantly, by differentiating IGOs by their founding eras, the figure highlights that post-Cold War and SDG-era IGOs are more likely to integrate stakeholder engagement into their governance, whereas earlier institutions (e.g., early Cold War) generally cluster lower on both measures. This suggests that legitimacy-building practices are not just a function of density or authority, but are also historically contingent: newer IGOs are structurally designed for participatory governance, while older ones struggle to adapt.
# =========================
# H3.3: Embeddedness → Legitimacy
# =========================
library(dplyr)
library(ggplot2)
library(ggeffects)
library(stringr)
# Ensure EPI is numeric
df <- df %>%
mutate(EPI = as.numeric(EPI),
LPI = as.numeric(LPI),
cumulative_stock = as.numeric(cumulative_stock))
# Run regression model
m_h33 <- lm(LPI ~ EPI + cumulative_stock, data = df)
summary(m_h33)
##
## Call:
## lm(formula = LPI ~ EPI + cumulative_stock, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.40213 -0.68222 -0.06121 0.71434 1.92618
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.568e-16 1.448e-01 0.000 1.000
## EPI -4.043e-02 1.588e-01 -0.255 0.800
## cumulative_stock 2.045e-01 1.588e-01 1.288 0.204
##
## Residual standard error: 1.003 on 45 degrees of freedom
## Multiple R-squared: 0.03703, Adjusted R-squared: -0.005766
## F-statistic: 0.8653 on 2 and 45 DF, p-value: 0.4278
# Predicted values
pred_h33 <- ggpredict(m_h33, terms = "EPI [all]")
# Plot with IGOs and founding era
p_h33 <- ggplot() +
geom_point(data = df, aes(x = EPI, y = LPI, color = founding_era_category), size = 3, alpha = 0.7) +
geom_text(data = df %>% filter(LPI == max(LPI, na.rm = TRUE) | LPI == min(LPI, na.rm = TRUE)),
aes(x = EPI, y = LPI, label = institution, color = founding_era_category),
vjust = -1, size = 3.2, fontface = "bold") +
geom_ribbon(data = pred_h33, aes(x = x, ymin = conf.low, ymax = conf.high), fill = "grey70", alpha = 0.25) +
geom_line(data = pred_h33, aes(x = x, y = predicted), color = "darkblue", size = 1.1) +
scale_color_brewer(palette = "Set1") +
labs(
title = "Figure 3.3 H3.3 — Embeddedness and Legitimacy",
x = "Embeddedness Index (standardized)",
y = "Legitimacy Participation Index (standardized)",
color = "Founding Era",
caption = str_wrap("IGOs broader inter-institutional networks.", 90)
) +
theme_minimal(base_size = 13) +
theme(legend.position = "right")
# Save figure
ggsave("conjecture_Images/figure_3_3_h3_3_EPI_LPI.png", p_h33, width = 8.6, height = 5.2, dpi = 300, bg = "white")
print(p_h33)
* X-axis: Embeddedness Index (how well integrated an IGO is within
inter-institutional networks, e.g., coordination with UN bodies,
treaties, partnerships).
Y-axis: Legitimacy Participation Index (LPI), measuring how legitimate and participatory the IGO is perceived to be.
Regression Line: This flat line suggests that embeddedness does not show a clear linear relationship with legitimacy, which runs counter to our expectation.
UN DOALOS (representing legal authority and high embeddedness) and UNEP (highly embedded within UN system) are positioned towards the right side, but Minamata appears on the extreme left, showing low legitimacy despite embeddedness.
IGOs from the Early Founding Years (Pre-1900) seem to cluster around low embeddedness but also do not show high legitimacy, suggesting that early organizations did not have the same institutional ties that modern IGOs do.
Interestingly, Globalisation Era IGOs (colored yellow) show moderate embeddedness and cluster mid-range on legitimacy, indicating a mixed success with embeddedness not necessarily guaranteeing legitimacy.
Implication
This suggests that embeddedness alone is not enough to increase legitimacy. Many IGOs with strong inter-institutional ties do not show higher legitimacy scores. The lack of a clear positive slope could indicate that embeddedness (cooperation with other institutions) might not be a sufficient condition for legitimacy, and it might be more context-specific to the issues and regional networks that these IGOs engage with. It also implies that the legitimacy-building process is more nuanced than just inter-institutional cooperation, and factors like democratic governance or inclusive decision-making may play a much stronger role.
odi_cols <- c(70, 80, 71, 72)
df <- df %>% mutate(ODI = rowMeans(across(all_of(odi_cols)), na.rm = TRUE))
# Categorize IGOs into High vs Low Operational Delivery based on ODI
df <- df %>%
mutate(operational_delivery_group = ifelse(ODI > median(ODI, na.rm = TRUE), "High", "Low"))
# Select top 5 and bottom 5 IGOs by LPI for labeling
top_bottom_igos <- df %>%
arrange(desc(LPI)) %>%
slice_head(n = 5) %>%
bind_rows(df %>% arrange(LPI) %>% slice_head(n = 5))
# Plotting boxplot for LPI by Operational Delivery Group with labeled extreme IGOs
p_h37_updated <- ggplot(df, aes(x = operational_delivery_group, y = LPI, fill = operational_delivery_group)) +
geom_boxplot(outlier.shape = 16, outlier.size = 3, outlier.colour = "grey") +
scale_fill_manual(values = c("High" = "darkgreen", "Low" = "lightgreen")) +
# Labeling the top and bottom 5 IGOs
geom_text_repel(data = top_bottom_igos,
aes(x = operational_delivery_group, y = LPI, label = institution, color = operational_delivery_group),
size = 3.5, fontface = "bold", box.padding = 0.4, max.overlaps = 20) +
labs(
title = "Figure 3.7 H3.7 — Operational Delivery and Legitimacy",
x = "Operational Delivery Group",
y = "Legitimacy Participation Index",
fill = "Operational Delivery",
caption = str_wrap("IGOs with higher operational delivery (effective programs and project outcomes) are hypothesized to show higher legitimacy (LPI). Boxplots show the distribution of legitimacy scores (LPI) for IGOs with high and low operational delivery, with outliers marked in gray. The top and bottom 5 IGOs are labeled to highlight extreme cases.", 95)
) +
theme_minimal(base_size = 14) +
theme(legend.position = "none", plot.caption = element_text(hjust = 0))
# Save the plot
ggsave("conjecture_Images/figure_3_7_h3_7_operational_delivery_LPI.png", p_h37_updated, width = 9, height = 6, dpi = 300)
print(p_h37_updated)
Observation:
Interpretation:
Implication: