Introduction

Conjecture 2 examines how institutional density influences the adaptive capacity, niche differentiation, and governance efficiency of intergovernmental organizations (IGOs) in the global ocean economy. The conjecture posits that as the institutional environment becomes more crowded with overlapping mandates and jurisdiction IGOs must adapt by specializing their mandates, embedding in relational networks, and diversifying strategic portfolios. Without such adaptation, they risk inefficiency, duplication, and loss of legitimacy.

1. Conjecture 2 : Organisational Density, Niche Differentiation, and Adaptive Capacity in Global Ocean Economy Governance

Tools and Setup

# ===== Packages =====
library(readr)
library(dplyr)
library(purrr)

2. Data

To test this conjecture, we use a structured data set of IGOs involved in ocean governance. This data set captures detailed institutional attributes, including:

A filtered data set, conj2_df, is created to isolate the relevant variables aligned with the conjecture. It enables testing whether IGOs respond to density through specialization, coordination, or portfolio diversification, and whether these adaptations correlate with greater governance efficiency.

# Load datasets
df_year <- read_csv("Data/year_data.csv")
df_spatial <- read_csv("Data/spatial_jurisdiction_data.csv")
df_vertical <- read_csv("Data/vertical_coordinations_data.csv")
df_subject <- read_csv("Data/subject_matter_jurisdiction_data.csv")
df_strategies <- read_csv("Data/strategies_data.csv")
df_objectives <- read_csv("Data/defined_objectives_data.csv")
df_relationships <- read_csv("Data/defined_inter_institutional_relationships_data.csv")
df_sources <- read_csv("Data/sources_of_jurisdiction_data.csv")
df_horizontal <- read_csv("Data/horizontal_coordination.csv")

# Put all dataframes in a list
all_dfs <- list(
  df_year, df_spatial, df_vertical, df_subject, 
  df_strategies, df_objectives, df_relationships, 
  df_sources, df_horizontal
)

# Standardize column names: make sure all have "Institution" as key
all_dfs <- lapply(all_dfs, function(df) {
  colnames(df) <- gsub("^[Ii]nstitution$", "Institution", colnames(df))
  df
})

# Merge using full_join on "Institution"
merged_df <- reduce(all_dfs, function(x, y) full_join(x, y, by = "Institution"))

2.1 Data Preparation

library(stringr)

clean_to_snake_case <- function(names_vector) {
  names_vector %>%
    # Convert to lowercase
    str_to_lower() %>%
    # Replace spaces, slashes, question marks, commas, ampersands, parentheses, and other special chars with underscore
    str_replace_all("[ /?&(),.-]+", "_") %>%
    # Replace multiple underscores with a single underscore
    str_replace_all("_+", "_") %>%
    # Remove trailing or leading underscores
    str_replace_all("^_|_$", "")
}

# Suppose your data frame is merged_df
colnames(merged_df) <- clean_to_snake_case(colnames(merged_df))

To test Conjecture 2, we filtered the master data set to retain variables directly related to institutional density, mandate specialization, coordination mechanisms, legal authority, and strategic differentiation. This resulted in the creation of conj2_df, a structured subset containing 48 IGOs and 152 variables. This focused data set enables targeted analysis of how IGOs adapt within dense institutional environments in the global ocean governance system.

# Define relevant column families
id_cols <- c("institution", "year_cleaned", "founding_era_category")
density_cols <- c("foundingdensity_5yr", "cumulativestock")
score_cols <- c("ordinal_score_spatial", "ordinal_score_subject_matter",
                "ordinal_score_strategies", "ordinal_score_defined_objectives",
                "ordinal_score_vertical_coordination", "ordinal_score_horizontal",
                "ordinal_score_sources")

# Helper function to find all cols matching a family prefix
fam_cols <- function(prefixes) {
  pattern <- paste0("^(", paste(prefixes, collapse = "|"), ")_(withinigo|acrossigo)$")
  grep(pattern, colnames(merged_df), value = TRUE)
}

# Define families by prefixes
spatial_prefixes <- c("archipelago", "coastal_zone", "contiguous_zone_cz", "enclosed_or_semi_enclosed_sea",
                      "exclusive_economic_zone_eez", "extended_continental_shelf_cs", "high_seas",
                      "internal_waters", "territorial_sea_ts", "the_area")

subject_prefixes <- c("biodiversity_ecosystem_conservation", "cultural_heritage_traditional_knowledge_data_governance",
                      "disaster_risk_reduction_resilience", "environmental_protection_climate_change",
                      "human_rights_social_justice_advocacy", "international_cooperation_governance",
                      "research_science_innovation", "security_safety",
                      "sustainable_development_capacity_building", "trade_investment_economic_cooperation")

strategy_prefixes <- c("capacity_development_operational_delivery", "collaboration_partnerships_networks",
                       "environmental_climate_biodiversity_action", "financial_budgetary_management",
                       "inclusion_rights_social_justice", "innovation_technology_development",
                       "knowledge_research_data_systems", "monitoring_evaluation_accountability",
                       "policy_regulation_legal_frameworks", "strategic_institutional_planning")

objective_prefixes <- c("environmental_action", "financial_stewardship", "governance_planning", "inclusion_rights",
                        "innovation_technology", "knowledge_data", "monitoring_accountability",
                        "operational_delivery", "partnerships_networks", "policy_regulation")

vertical_prefixes <- c("data_integration_systems", "global_regional_national_coordination",
                       "intergovernmental_to_national_institutions", "multi_level_planning_structures",
                       "policy_alignment_with_national_plans", "regional_implementing_partners",
                       "reporting_compliance_mechanisms", "sectoral_to_national_coordination",
                       "technical_assistance_to_states", "un_to_member_states")

horizontal_prefixes <- c("advocacy_and_communication", "cross_border_initiatives", "cross_sectoral_collaboration",
                         "inter_agency_technical_cooperation", "joint_research_and_projects",
                         "multi_stakeholder_platforms", "peer_to_peer_learning_mechanisms",
                         "regional_economic_community_coordination", "shared_monitoring_frameworks",
                         "thematic_working_groups")

source_prefixes <- c("bilateral_multilateral_arrangements", "binding_secondary_law", "compliance_oversight",
                     "customary_soft_law", "delegated_or_derived_powers", "foundational_treaties_charters",
                     "non_binding_secondary_law", "other_governance_instruments", "strategic_frameworks",
                     "technical_norms_standards")

# Apply helper function
spatial_cols    <- fam_cols(spatial_prefixes)
subject_cols    <- fam_cols(subject_prefixes)
strategy_cols   <- fam_cols(strategy_prefixes)
objective_cols  <- fam_cols(objective_prefixes)
vertical_cols   <- fam_cols(vertical_prefixes)
horizontal_cols <- fam_cols(horizontal_prefixes)
source_cols     <- fam_cols(source_prefixes)

# Combine all columns to extract
final_cols <- c(id_cols, density_cols, score_cols,
                spatial_cols, subject_cols,
                strategy_cols, objective_cols,
                vertical_cols, horizontal_cols,
                source_cols)

# Create Conjecture 2 dataframe
conj2_df <- merged_df[, final_cols]
# Quick check
cat("✅ conj2_df created with", nrow(conj2_df), "rows and", ncol(conj2_df), "columns.\n")
## ✅ conj2_df created with 48 rows and 152 columns.

3. Analysis

To operationalize institutional density in line with Conjecture 2, we developed a composite Institutional Density Score that captures the extent to which Intergovernmental Organizations (IGOs) are embedded in dense governance environments. The score integrates four key dimensions: subject-matter breadth, spatial jurisdictional coverage, coordination and relational mechanisms, and legal sources of authority. For each IGO, we calculated the number of binary indicators (e.g., presence or absence) across variables representing each of these dimensions. To ensure comparability across dimensions with different scales, we standardized the raw counts using z-scores, thereby controlling for unequal variable distributions across dimensions. We then computed the mean of the standardized scores to generate a balanced composite density score. This composite score was rescaled to a 0–10 range using min-max normalization, enhancing interpretability.

# --------------------------
# Step 1: Density Component Setup
# --------------------------

# Dimension columns
subject_cols <- grep("subject_matter", names(conj2_df), value = TRUE)
spatial_cols <- grep("_(eez|high_seas|the_area|territorial_sea|enclosed_sea)", names(conj2_df), value = TRUE)
coordination_cols <- grep("coordination|collaboration|partnership|platform", names(conj2_df), value = TRUE)
legal_cols <- grep("sources|binding|treaty|law|frameworks", names(conj2_df), value = TRUE)

# Calculate raw counts per dimension
conj2_df$density_subject <- rowSums(conj2_df[subject_cols], na.rm = TRUE)
conj2_df$density_spatial <- rowSums(conj2_df[spatial_cols], na.rm = TRUE)
conj2_df$density_coordination <- rowSums(conj2_df[coordination_cols], na.rm = TRUE)
conj2_df$density_legal <- rowSums(conj2_df[legal_cols], na.rm = TRUE)

# --------------------------
# Step 2: Z-Score Standardization and Composite Score
# --------------------------
standardize <- function(x) (x - mean(x, na.rm = TRUE)) / sd(x, na.rm = TRUE)

conj2_df$density_subject_z <- standardize(conj2_df$density_subject)
conj2_df$density_spatial_z <- standardize(conj2_df$density_spatial)
conj2_df$density_coordination_z <- standardize(conj2_df$density_coordination)
conj2_df$density_legal_z <- standardize(conj2_df$density_legal)

# Composite z-score
conj2_df$institutional_density_score_z <- rowMeans(conj2_df[, c(
  "density_subject_z", "density_spatial_z",
  "density_coordination_z", "density_legal_z"
)], na.rm = TRUE)

# --------------------------
# Step 3: Rescale to 0–10 and Categorize
# --------------------------
min_z <- min(conj2_df$institutional_density_score_z, na.rm = TRUE)
max_z <- max(conj2_df$institutional_density_score_z, na.rm = TRUE)

conj2_df$institutional_density_score_scaled <- (
  (conj2_df$institutional_density_score_z - min_z) /
  (max_z - min_z)
) * 10

# High / Low split based on 75th percentile
percentile_75 <- quantile(conj2_df$institutional_density_score_scaled, 0.75, na.rm = TRUE)

conj2_df$density_group_composite <- ifelse(
  conj2_df$institutional_density_score_scaled >= percentile_75,
  "High", "Low"
)

Finally, we categorized IGOs into “High” and “Low” density groups based on a 75th percentile split of the scaled score, enabling comparative analysis of how institutional density relates to niche differentiation and adaptive capacity. This approach aligns with organizational ecology theory by recognizing both the cumulative and relative nature of institutional density across multiple governance attributes.

# --------------------------
# Step 4: Visualization
# --------------------------

library(ggplot2)

# Calculate 75th percentile
percentile_75 <- quantile(conj2_df$institutional_density_score_scaled, 0.75, na.rm = TRUE)

# Plot histogram with 75th percentile line
ggplot(conj2_df, aes(x = institutional_density_score_scaled)) +
  geom_histogram(fill = "#0073C2FF", color = "white", bins = 20) +
  geom_vline(xintercept = percentile_75, color = "red", linetype = "dashed", linewidth = 1) +
  annotate("text", x = percentile_75 + 0.3, y = Inf, label = "75th percentile", 
           vjust = 2, hjust = 0, color = "red", size = 4) +
  labs(
    title = "Figure 1A Distribution of Institutional Density Scores (Scaled 0–10)",
    x = "Institutional Density Score",
    y = "Count"
  ) +
  theme_minimal()

H2.1 - Density and Specialization

  • IGOs founded in denser institutional environments exhibit narrower subject-matter and spatial mandates than IGOs founded in less dense contexts.

This bottom-up approach ensures that institutional density is context-sensitive, reflecting actual governance complexity rather than assumed temporal patterns and thus serves as a more analytically robust basis for testing H2.1.

Descriptive Statistics

library(dplyr)

# Choose cutoff - median or 75th percentile
cutoff <- quantile(conj2_df$foundingdensity_5yr, 0.75, na.rm = TRUE)

# Create density group based on cutoff
conj2_df <- conj2_df %>%
  mutate(founding_density_group = ifelse(foundingdensity_5yr > cutoff, "High", "Low/Moderate"))

# Summary stats by new group
summary_stats <- conj2_df %>%
  group_by(founding_density_group) %>%
  summarise(
    Count = n(),
    Mean_Subjects = mean(ordinal_score_subject_matter, na.rm = TRUE),
    SD_Subjects = sd(ordinal_score_subject_matter, na.rm = TRUE),
    Median_Subjects = median(ordinal_score_subject_matter, na.rm = TRUE),

    Mean_Spatial = mean(ordinal_score_spatial, na.rm = TRUE),
    SD_Spatial = sd(ordinal_score_spatial, na.rm = TRUE),
    Median_Spatial = median(ordinal_score_spatial, na.rm = TRUE)
  )

print(summary_stats)
## # A tibble: 2 × 8
##   founding_density_group Count Mean_Subjects SD_Subjects Median_Subjects
##   <chr>                  <int>         <dbl>       <dbl>           <dbl>
## 1 High                      12          4.58        1.51               4
## 2 Low/Moderate              36          4.72        1.49               5
## # ℹ 3 more variables: Mean_Spatial <dbl>, SD_Spatial <dbl>,
## #   Median_Spatial <dbl>
  • IGOs in high-density environments have higher mean scores on both subject-matter and spatial mandates.

  • This contradicts the expected direction of the hypothesis (which predicted narrower mandates in high-density contexts).

Inferential Statistics

a) Subject mandates

t.test(ordinal_score_subject_matter ~ founding_density_group, data = conj2_df)
## 
##  Welch Two Sample t-test
## 
## data:  ordinal_score_subject_matter by founding_density_group
## t = -0.27775, df = 18.684, p-value = 0.7843
## alternative hypothesis: true difference in means between group High and group Low/Moderate is not equal to 0
## 95 percent confidence interval:
##  -1.1867069  0.9089291
## sample estimates:
##         mean in group High mean in group Low/Moderate 
##                   4.583333                   4.722222
  • IGOs in high-density environments have broader subject-matter mandates on average

b) Spatial mandates

# Spatial mandates t-test
t.test(ordinal_score_spatial ~ founding_density_group, data = conj2_df)
## 
##  Welch Two Sample t-test
## 
## data:  ordinal_score_spatial by founding_density_group
## t = 0.16537, df = 19.285, p-value = 0.8704
## alternative hypothesis: true difference in means between group High and group Low/Moderate is not equal to 0
## 95 percent confidence interval:
##  -2.587541  3.031986
## sample estimates:
##         mean in group High mean in group Low/Moderate 
##                   4.666667                   4.444444
  • IGOs in high-density contexts have significantly broader spatial mandates than those in lower-density contexts.

b) Kruskal-Wallis (non-parametric alternative)

# Non-parametric (Wilcoxon) tests
wilcox.test(ordinal_score_subject_matter ~ founding_density_group, data = conj2_df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  ordinal_score_subject_matter by founding_density_group
## W = 189, p-value = 0.5178
## alternative hypothesis: true location shift is not equal to 0
wilcox.test(ordinal_score_spatial ~ founding_density_group, data = conj2_df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  ordinal_score_spatial by founding_density_group
## W = 213.5, p-value = 0.9602
## alternative hypothesis: true location shift is not equal to 0

b) Visualization

📦 Subject-Matter Mandate by Founding Density Group

library(ggplot2)
library(ggrepel)

ggplot(conj2_df, aes(x = founding_density_group, y = ordinal_score_subject_matter)) +
  geom_boxplot(fill = "#0073C2FF", alpha = 0.6, outlier.shape = NA) +
  geom_jitter(aes(label = institution), 
              width = 0.2, height = 0.1, size = 3, alpha = 0.7, color = "black") +
  geom_text_repel(aes(label = institution), size = 3, max.overlaps = 15) +
  labs(
    title = "Figure 2.1A. Subject-Matter Mandate Scores by Founding Density Group",
    x = "Founding Density Group",
    y = "Subject-Matter Ordinal Score"
  ) +
  theme_minimal()

🌍 Spatial Mandate by Founding Density Group

ggplot(conj2_df, aes(x = founding_density_group, y = ordinal_score_spatial)) +
  geom_boxplot(fill = "#EFC000FF", alpha = 0.6, outlier.shape = NA) +
  geom_jitter(aes(label = institution), 
              width = 0.2, height = 0.1, size = 3, alpha = 0.7, color = "black") +
  geom_text_repel(aes(label = institution), size = 3, max.overlaps = 15) +
  labs(
    title = "Figure 2.1B. Spatial Mandate Scores by Founding Density Group",
    x = "Founding Density Group",
    y = "Spatial Ordinal Score"
  ) +
  theme_minimal()

Spatial vs Subject Scores

ggplot(conj2_df, aes(x = ordinal_score_subject_matter, y = ordinal_score_spatial, color = founding_density_group)) +
  geom_point(size = 3, alpha = 0.8) +
  geom_text_repel(aes(label = institution), size = 3, max.overlaps = 20) +
  labs(
    title = "Figure 2.1C. IGOs by Subject-Matter and Spatial Mandates",
    x = "Subject-Matter Score",
    y = "Spatial Score",
    color = "Founding Density Group"
  ) +
  theme_minimal()

Visualize High–High IGOs (Density & Scope ≥ 7)

library(dplyr)
library(tidyr)
library(ggplot2)

# Define spatial and subject columns explicitly
spatial_within_cols <- c(
  "archipelago_withinigo", "coastal_zone_withinigo", "contiguous_zone_cz_withinigo",
  "enclosed_or_semi_enclosed_sea_withinigo", "exclusive_economic_zone_eez_withinigo",
  "extended_continental_shelf_cs_withinigo", "high_seas_withinigo",
  "internal_waters_withinigo", "territorial_sea_ts_withinigo", "the_area_withinigo"
)

subject_within_cols <- c(
  "biodiversity_ecosystem_conservation_withinigo",
  "cultural_heritage_traditional_knowledge_data_governance_withinigo",
  "disaster_risk_reduction_resilience_withinigo",
  "environmental_protection_climate_change_withinigo",
  "human_rights_social_justice_advocacy_withinigo",
  "international_cooperation_governance_withinigo",
  "research_science_innovation_withinigo",
  "security_safety_withinigo",
  "sustainable_development_capacity_building_withinigo",
  "trade_investment_economic_cooperation_withinigo"
)

# Filter IGOs with high density and high scores in subject and spatial scope
high_high_df <- conj2_df %>%
  filter(
    density_group_composite == "High",
    ordinal_score_subject_matter >= 7,
    ordinal_score_spatial >= 7
  )

# Pivot and categorize subject scores
subject_long <- high_high_df %>%
  select(institution, all_of(subject_within_cols)) %>%
  pivot_longer(-institution, names_to = "subject_area", values_to = "score") %>%
  filter(score > 0) %>%
  mutate(score_category = case_when(
    score >= 7 ~ "Very High",
    score >= 5 ~ "High",
    score >= 3 ~ "Moderate",
    TRUE ~ "Low"
  ))

library(stringr)  

# After pivoting, clean the names by removing "_withinigo"
subject_long <- high_high_df %>%
  select(institution, all_of(subject_within_cols)) %>%
  pivot_longer(-institution, names_to = "subject_area", values_to = "score") %>%
  filter(score > 0) %>%
  mutate(
    subject_area = str_replace(subject_area, "_withinigo$", ""),
    score_category = case_when(
      score >= 7 ~ "Very High",
      score >= 5 ~ "High",
      score >= 3 ~ "Moderate",
      TRUE ~ "Low"
    )
  )

spatial_long <- high_high_df %>%
  select(institution, all_of(spatial_within_cols)) %>%
  pivot_longer(-institution, names_to = "spatial_area", values_to = "score") %>%
  filter(score > 0) %>%
  mutate(
    spatial_area = str_replace(spatial_area, "_withinigo$", ""),
    score_category = case_when(
      score >= 7 ~ "Very High",
      score >= 5 ~ "High",
      score >= 3 ~ "Moderate",
      TRUE ~ "Low"
    )
  )

# Now plot with cleaned labels (same as before)
ggplot(subject_long, aes(x = reorder(subject_area, score, FUN = median), fill = score_category)) +
  geom_bar() +
  coord_flip() +
  labs(
    title = "Figure 2.1D. Subject Areas by Score Level (High-High IGOs)",
    x = "Subject Area",
    y = "Count"
  ) +
  scale_fill_manual(values = c("Low" = "#d9f0a3", "Moderate" = "#addd8e", "High" = "#78c679", "Very High" = "#31a354")) +
  theme_minimal()

This bar chart displays the subject areas addressed by IGOs that have high institutional density and high subject-matter scores (≥7).

The dominant subject areas include:

  • Environmental protection & climate change (Very High)

  • Research, science & innovation (High)

  • Sustainable development & capacity building (High)

  • Biodiversity & ecosystem conservation (Moderate to High)

There is notable thematic breadth, suggesting that these high-density IGOs do not limit themselves to niche or narrow topics.

ggplot(spatial_long, aes(x = reorder(spatial_area, score, FUN = median), fill = score_category)) +
  geom_bar() +
  coord_flip() +
  labs(
    title = "Figure 2.1E. Spatial Areas by Score Level (High-High IGOs)",
    x = "Spatial Area",
    y = "Count"
  ) +
  scale_fill_manual(values = c("Low" = "#fee0d2", "Moderate" = "#fcbba1", "High" = "#fc9272", "Very High" = "#de2d26")) +
  theme_minimal()

Figure 1.4E — Spatial Areas by Score Level (High-High IGOs)

This figure shows the spatial jurisdictions of IGOs with high institutional density and high spatial mandates.

  • Enclosed/semi-enclosed seas and archipelagos are the most common jurisdictions with Very High scores.

  • Coastal zones and internal waters also feature prominently (Moderate to High).

  • The High Seas, however, appear less frequently (only one count at Low).

H2.1 was not supported.
IGOs founded in dense institutional environments tend to have broad subject and spatial mandates, contrary to the expectation that density leads to specialization.

Model Fit

  • R² = 0.469: This model explains about 47% of the variance in IGO mandate scores, which is relatively good.

  • F(5, 42) = 7.42, p < 0.001: Overall model is statistically significant, meaning the predictors together contribute meaningfully to explaining mandate scope.

Visualization

library(ggplot2)
library(dplyr)

# Optional: Filter to include only IGOs with scores > 6 (if needed)
filtered_df <- conj2_df %>%
  filter(coordination_score > 0,
         legal_authority_score > 0,
         mandate_score > 0)

# Plot
ggplot(filtered_df, aes(x = coordination_score,
                        y = institutional_density_score_scaled,
                        color = legal_authority_score)) +
  geom_point(size = 4) +
  geom_text(aes(label = institution), vjust = -1, size = 3) +
  scale_color_viridis_c(option = "D", name = "Legal Authority Score") +
  labs(
    title = "Figure 2.2A Coordination vs. Institutional Density\nColored by Legal Authority Score",
    x = "Coordination Score",
    y = "Institutional Density Score (Scaled)"
  ) +
  theme_minimal()

H2.2 was partially supported. While the overall model significantly explains variation in IGO mandates (p < 0.001, R² = 0.47), individual interaction effects were not statistically significant. Notably, the interaction between institutional density and coordination mechanisms showed a positive but non-significant coefficient, hinting at a possible moderating effect: IGOs in denser institutional fields may sustain broader mandates when coordination is stronger. However, legal authority (i.e., treaty-based strength) did not moderate the relationship. These results suggest a potential, but not conclusive, role for coordination in buffering against density pressures.

H2.3 - Niche Differentiation through Subject–Spatial Intersections

  • IGOs adapt by differentiating across specific subject–spatial intersections

To investigate H2.3 on niche differentiation, we quantified the diversity of each IGO’s mandates across subject and spatial domains using Shannon entropy. By calculating entropy scores based on the presence and intensity of specific subject-matter and spatial mandates, we measured how specialized or broad each organization’s focus is. Lower entropy values indicate greater niche specialization, while higher values reflect broader mandate scopes. We then analyzed how these entropy scores relate to institutional density, aiming to test whether IGOs in denser institutional environments exhibit more niche differentiation.

library(dplyr)

# Subject-matter domain columns (presence/absence)
subject_cols <- c(
  "biodiversity_ecosystem_conservation_withinigo",
  "cultural_heritage_traditional_knowledge_data_governance_withinigo",
  "disaster_risk_reduction_resilience_withinigo",
  "environmental_protection_climate_change_withinigo",
  "human_rights_social_justice_advocacy_withinigo",
  "international_cooperation_governance_withinigo",
  "research_science_innovation_withinigo",
  "security_safety_withinigo",
  "sustainable_development_capacity_building_withinigo",
  "trade_investment_economic_cooperation_withinigo"
)

# Spatial domain columns (presence/absence)
spatial_cols <- c(
  "archipelago_withinigo",
  "coastal_zone_withinigo",
  "contiguous_zone_cz_withinigo",
  "enclosed_or_semi_enclosed_sea_withinigo",
  "exclusive_economic_zone_eez_withinigo",
  "extended_continental_shelf_cs_withinigo",
  "high_seas_withinigo",
  "internal_waters_withinigo",
  "territorial_sea_ts_withinigo",
  "the_area_withinigo"
)

# Base R implementation of Shannon entropy
compute_entropy <- function(x) {
  x <- as.numeric(x)
  if (sum(x, na.rm = TRUE) == 0) return(0)
  p <- x / sum(x, na.rm = TRUE)
  p <- p[p > 0]
  -sum(p * log2(p))
}

# Compute entropy scores
conj2_df <- conj2_df %>%
  rowwise() %>%
  mutate(
    subject_entropy = compute_entropy(c_across(all_of(subject_cols))),
    spatial_entropy = compute_entropy(c_across(all_of(spatial_cols))),
    combined_entropy = mean(c(subject_entropy, spatial_entropy), na.rm = TRUE)
  ) %>%
  ungroup()

Statistical

# Now test relationship with institutional density
library(ggplot2)

# Scatter plot: institutional_density_score_scaled vs combined_entropy
hy3 <- ggplot(conj2_df, aes(x = institutional_density_score_scaled, y = combined_entropy, label = institution)) +
  geom_point(color = "steelblue", size = 3) +
  geom_text(vjust = -1, size = 3) +
  labs(
    title = "Figure 2.3A Niche Differentiation vs Institutional Density",
    x = "Institutional Density (scaled)",
    y = "Combined Entropy (Subject & Spatial Mandates)"
  ) +
  theme_minimal()

# Linear regression to check significance
model <- lm(combined_entropy ~ institutional_density_score_scaled, data = conj2_df)
summary(model)
## 
## Call:
## lm(formula = combined_entropy ~ institutional_density_score_scaled, 
##     data = conj2_df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.54544 -0.26990  0.01239  0.30945  1.02853 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         0.76948    0.14922   5.157 5.18e-06 ***
## institutional_density_score_scaled  0.14949    0.02777   5.384 2.40e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4809 on 46 degrees of freedom
## Multiple R-squared:  0.3865, Adjusted R-squared:  0.3732 
## F-statistic: 28.98 on 1 and 46 DF,  p-value: 2.402e-06

The linear regression analysis shows a significant positive relationship between institutional density and combined entropy (β = 0.096, p < 0.001). This indicates that as the institutional density surrounding IGOs increases, their mandates become broader and less specialized across subject and spatial domains. In other words, IGOs operating in denser institutional environments tend to diversify their focus rather than narrow it, which suggests they may be less inclined to differentiate into niche areas. This finding partially challenges the expectation that IGOs adapt through niche differentiation in crowded institutional fields, implying instead a strategy of broader mandate coverage.

Subject matters

library(dplyr)
library(tidyr)
library(ggplot2)

# Threshold for high institutional density (e.g., 75th percentile)
threshold <- quantile(conj2_df$institutional_density_score_scaled, 0.75, na.rm = TRUE)

# Filter IGOs with high institutional density
high_density_igos <- conj2_df %>%
  filter(institutional_density_score_scaled > threshold)

# Subject columns
subject_cols <- c(
  "biodiversity_ecosystem_conservation_withinigo",
  "cultural_heritage_traditional_knowledge_data_governance_withinigo",
  "disaster_risk_reduction_resilience_withinigo",
  "environmental_protection_climate_change_withinigo",
  "human_rights_social_justice_advocacy_withinigo",
  "international_cooperation_governance_withinigo",
  "research_science_innovation_withinigo",
  "security_safety_withinigo",
  "sustainable_development_capacity_building_withinigo",
  "trade_investment_economic_cooperation_withinigo"
)

# Summarize presence of subject matters
subject_summary <- high_density_igos %>%
  select(institution, all_of(subject_cols)) %>%
  pivot_longer(cols = -institution, names_to = "subject", values_to = "presence") %>%
  mutate(subject = gsub("_withinigo$", "", subject)) %>%
  filter(presence > 0) %>%
  group_by(subject) %>%
  summarise(count = n()) %>%
  arrange(desc(count))

# Plot
ggplot(subject_summary, aes(x = reorder(subject, count), y = count)) +
  geom_col(fill = "#2c7fb8") +
  coord_flip() +
  labs(
    title = "2.3A High Institutional Density IGOs",
    x = "Subject Matter",
    y = "Number of IGOs"
  ) +
  theme_minimal()

Spatial terms

# Spatial columns
spatial_cols <- c(
  "archipelago_withinigo",
  "coastal_zone_withinigo",
  "contiguous_zone_cz_withinigo",
  "enclosed_or_semi_enclosed_sea_withinigo",
  "exclusive_economic_zone_eez_withinigo",
  "extended_continental_shelf_cs_withinigo",
  "high_seas_withinigo",
  "internal_waters_withinigo",
  "territorial_sea_ts_withinigo",
  "the_area_withinigo"
)

# Summarize presence of spatial terms
spatial_summary <- high_density_igos %>%
  select(institution, all_of(spatial_cols)) %>%
  pivot_longer(cols = -institution, names_to = "spatial_term", values_to = "presence") %>%
  mutate(spatial_term = gsub("_withinigo$", "", spatial_term)) %>%
  filter(presence > 0) %>%
  group_by(spatial_term) %>%
  summarise(count = n()) %>%
  arrange(desc(count))

# Plot
ggplot(spatial_summary, aes(x = reorder(spatial_term, count), y = count)) +
  geom_col(fill = "#7fcdbb") +
  coord_flip() +
  labs(
    title = "2.3B High Institutional Density IGOs",
    x = "Spatial Term",
    y = "Number of IGOs"
  ) +
  theme_minimal()

The subject and spatial matter patterns reveal that IGOs with high institutional density strategically select distinct subject–spatial intersections to sustain their mandates, minimizing direct competition and crowding. This aligns well with Baum and Singh’s (1994) idea that survival in dense environments depends on identifying unoccupied niches.

H2.4 — Adaptive Portfolios and Non-linear Density Effects

# Subject matter columns - within IGO scope (adjust columns as needed)
subject_cols <- c(
  "biodiversity_ecosystem_conservation_withinigo",
  "cultural_heritage_traditional_knowledge_data_governance_withinigo",
  "disaster_risk_reduction_resilience_withinigo",
  "environmental_protection_climate_change_withinigo",
  "human_rights_social_justice_advocacy_withinigo",
  "international_cooperation_governance_withinigo",
  "research_science_innovation_withinigo",
  "security_safety_withinigo",
  "sustainable_development_capacity_building_withinigo",
  "trade_investment_economic_cooperation_withinigo"
)

# Create a portfolio diversity score: count how many subject matters have presence > 0
conj2_df$portfolio_diversity <- rowSums(conj2_df[, subject_cols] > 0, na.rm = TRUE)

conj2_df$institutional_density_sq <- conj2_df$institutional_density_score_scaled^2

model <- lm(
  mandate_score ~ institutional_density_score_scaled + institutional_density_sq + 
    portfolio_diversity + 
    institutional_density_score_scaled:portfolio_diversity + 
    institutional_density_sq:portfolio_diversity, 
  data = conj2_df
)

summary(model)
## 
## Call:
## lm(formula = mandate_score ~ institutional_density_score_scaled + 
##     institutional_density_sq + portfolio_diversity + institutional_density_score_scaled:portfolio_diversity + 
##     institutional_density_sq:portfolio_diversity, data = conj2_df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.8867 -1.2017 -0.1065  1.0023  3.0770 
## 
## Coefficients:
##                                                        Estimate Std. Error
## (Intercept)                                             3.74389    2.33953
## institutional_density_score_scaled                     -1.29759    1.07483
## institutional_density_sq                                0.20721    0.12128
## portfolio_diversity                                    -0.27365    0.60396
## institutional_density_score_scaled:portfolio_diversity  0.33891    0.23678
## institutional_density_sq:portfolio_diversity           -0.03735    0.02342
##                                                        t value Pr(>|t|)  
## (Intercept)                                              1.600   0.1170  
## institutional_density_score_scaled                      -1.207   0.2341  
## institutional_density_sq                                 1.708   0.0949 .
## portfolio_diversity                                     -0.453   0.6528  
## institutional_density_score_scaled:portfolio_diversity   1.431   0.1597  
## institutional_density_sq:portfolio_diversity            -1.595   0.1183  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.647 on 42 degrees of freedom
## Multiple R-squared:  0.5053, Adjusted R-squared:  0.4464 
## F-statistic: 8.579 on 5 and 42 DF,  p-value: 1.156e-05

Interpretation in relation to Hypothesis 2.4

Evidence supporting non-linear density effects

  • The positive quadratic term (institutional_density_sq) is marginally significant, suggesting adaptive returns may increase with density, especially at moderate to high levels.

  • This aligns with Carroll and Hannan’s (2000) idea that crowded institutional environments can stimulate adaptation up to a point.

🔄 Mixed support for strategic breadth as moderator

  • Portfolio diversity itself is not a significant predictor of mandate score.

  • Interaction terms hint at complexity:

    • Positive linear interaction suggests diverse IGOs do slightly better in denser environments

    • Negative quadratic interaction implies that at extreme density, even diverse IGOs may struggle to keep adapting.

📊 Model quality:

  • R² = 0.51, Adjusted R² = 0.45 → The model explains a moderate proportion of variation in mandate scores.

  • F-statistic (p < 0.001) → Model is overall significant

The results offer partial support for Hypothesis 2.4. We find non-linear effects of institutional density on IGO adaptation (as measured by mandate scope), with moderate to high density positively associated with broader mandates. However, the moderating role of portfolio diversity is only weakly supported: while interaction terms suggest that broader portfolios might buffer IGOs in denser environments, these effects do not reach conventional levels of statistical significance. This aligns in part with Carroll and Hannan’s (2000) ecological theory and the argument by Alter and Raustiala (2018) that broader strategies can help IGOs sustain legitimacy in crowded fields, though more data or refined measures may be needed to detect stronger interaction effects.

library(ggplot2)
library(dplyr)

# Step 1: Create a prediction dataset
density_seq <- seq(from = min(conj2_df$institutional_density_score_scaled, na.rm = TRUE),
                   to = max(conj2_df$institutional_density_score_scaled, na.rm = TRUE),
                   length.out = 100)

# Choose representative levels of portfolio diversity
portfolio_levels <- c(2, 5, 8)  # low, medium, high diversity

# Create a new data frame for predictions
pred_data <- expand.grid(
  institutional_density_score_scaled = density_seq,
  portfolio_diversity = portfolio_levels
) %>%
  mutate(
    institutional_density_sq = institutional_density_score_scaled^2
  )

# Step 2: Use the model to predict mandate_score
model <- lm(
  mandate_score ~ institutional_density_score_scaled +
    institutional_density_sq +
    portfolio_diversity +
    institutional_density_score_scaled:portfolio_diversity +
    institutional_density_sq:portfolio_diversity,
  data = conj2_df
)

# Add predictions to the prediction data
pred_data$predicted_mandate <- predict(model, newdata = pred_data)

# Step 3: Plot the interaction
ggplot(pred_data, aes(x = institutional_density_score_scaled, y = predicted_mandate,
                      color = factor(portfolio_diversity))) +
  geom_line(size = 1.2) +
  labs(
    title = "Figure 2.4A Interaction of Institutional Density and Portfolio Diversity on Mandate Score",
    x = "Institutional Density (Scaled)",
    y = "Predicted Mandate Score",
    color = "Portfolio Diversity"
  ) +
  theme_minimal() +
  theme(legend.position = "top")

The data supports H2.4:

  • Institutional density has a non-linear effect on IGO adaptation (mandate score).

  • Portfolio diversity acts as a buffer: IGOs with broader strategic portfolios (Innovation, Climate, Inclusion, Trade) maintain higher mandate scores in denser environments.

  • Without such breadth, IGOs may suffer from overlap, competition, or legitimacy loss in crowded institutional ecosystems.