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.
# ===== Packages =====
library(readr)
library(dplyr)
library(purrr)
To test this conjecture, we use a structured data set of IGOs involved in ocean governance. This data set captures detailed institutional attributes, including:
Mandate scope (spatial and subject-matter domains),
Founding context and institutional density,
Strategic and functional objectives,
Coordination mechanisms (vertical and horizontal),
Legal authority sources, and
Indicators of relational positioning.
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"))
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.
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()
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.
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).
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
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
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
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()
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()
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()
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()
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.
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.
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.
# 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
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.
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.
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.