DOI: 10.5281/zenodo.15851567
title: Navigating Institutional Pluralism and Indigenous Rights: The Sámi–Forestry Company Conflict and Its Implications for Multinational Finance and ESG Risk

description: Navigating Institutional Pluralism and Indigenous Rights: The Sámi–Forestry Company Conflict and Its Implications for Multinational Finance and ESG Risk



DescriptionThis repository supports a study analyzing the intersection of Indigenous governance, carbon emissions, and multinational forestry activity. The focus is on the Sámi people of northern Sweden, whose customary land rights conflict with commercial land use regimes. The study explores how institutional pluralism and ESG risk intersect, drawing on panel data from CO₂ emissions, GDP, and V-Dem institutional indicators.

All code and data files are designed for use in Google Colab, ensuring reproducibility and accessibility.



Included Files





/content/CO2_Long_Format.csv — Fossil CO₂ emissions by country and year.




/content/GDP_Per_Capita_Cleaned.csv — GDP per capita (PPP-adjusted).




/content/V-Dem-CY-Core-v15.csv — V-Dem indicators: rule of law, democracy, corruption.




/content/SAMI_MERGED_FINAL.csv — Optional premerged dataset.





How to Use in Google Colab





Open Colab:Go to https://colab.research.google.com




Upload Files:Click the folder icon → Upload each .csv file and sami.py.




Install Required Packages (if needed):Run this in a Colab code cell:

!pip install statsmodels patsy





Run Script:Then execute:




This runs all analysis steps including fixed-effects models and VIF diagnostics.





Python Script 

--------------------------------------------------------------------

# STEP 1: Install packages (run manually in Colab if needed)
# !pip install statsmodels patsy

# STEP 2: Import libraries
import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
from statsmodels.stats.outliers_influence import variance_inflation_factor
from patsy import dmatrices

# STEP 3: Load datasets (update paths if needed)
co2 = pd.read_csv('/content/CO2_Long_Format.csv')
gdp = pd.read_csv('/content/GDP_Per_Capita_Cleaned.csv')
vdem = pd.read_csv('/content/V-Dem-CY-Core-v15.csv', low_memory=False)

# STEP 4: Standardize and prepare columns
co2.columns = co2.columns.str.strip().str.lower()
gdp.columns = gdp.columns.str.strip().str.lower()
vdem.columns = vdem.columns.str.strip().str.lower()

vdem = vdem.rename(columns={'country_name': 'country'})

for df in [co2, gdp, vdem]:
    df['country'] = df['country'].astype(str).str.strip().str.lower()
    df['year'] = pd.to_numeric(df['year'], errors='coerce')

# STEP 5: Merge datasets
merged = co2.merge(gdp, on=['country', 'year'], how='inner')
merged = merged.merge(vdem, on=['country', 'year'], how='inner')

# STEP 6: Create variables
merged['co2_estimate'] = pd.to_numeric(merged['co2_estimate'], errors='coerce')
merged['gdp_per_capita'] = pd.to_numeric(merged['gdp_per_capita'], errors='coerce')

merged['log_co2'] = np.log(merged['co2_estimate'].replace({0: np.nan}))
merged['log_gdp_pc'] = np.log(merged['gdp_per_capita'].replace({0: np.nan}))

# STEP 7: Filter and prepare panel
merged = merged[merged['year'] >= 1960]
required_cols = ['log_co2', 'log_gdp_pc', 'v2x_rule', 'v2x_polyarchy', 'v2x_libdem', 'v2x_corr', 'country', 'year']
df_panel = merged[required_cols].dropna()
df_panel['log_gdp_x_rule'] = df_panel['log_gdp_pc'] * df_panel['v2x_rule']

# STEP 8: Main fixed-effects regression
model = smf.ols(
    formula='log_co2 ~ log_gdp_pc + v2x_rule + log_gdp_x_rule + v2x_polyarchy + v2x_libdem + v2x_corr + C(country) + C(year)',
    data=df_panel
).fit(cov_type='cluster', cov_kwds={'groups': df_panel['country']})

print("=== FULL MODEL ===")
print(model.summary())

# STEP 9: VIF Analysis (excluding fixed effects)
y, X = dmatrices(
    'log_co2 ~ log_gdp_pc + v2x_rule + log_gdp_x_rule + v2x_polyarchy + v2x_libdem + v2x_corr',
    data=df_panel,
    return_type='dataframe'
)

vif_data = pd.DataFrame()
vif_data['Variable'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print("\n=== VIF ANALYSIS ===")
print(vif_data)

# STEP 10: Refined regression
model_refined = smf.ols(
    formula='log_co2 ~ log_gdp_pc + v2x_rule + log_gdp_x_rule + C(country) + C(year)',
    data=df_panel
).fit(cov_type='cluster', cov_kwds={'groups': df_panel['country']})

print("\n=== REFINED MODEL ===")
print(model_refined.summary())




Citation



Author(s). (2025). Navigating Institutional Pluralism and Indigenous Rights: The Sámi–Forestry Company Conflict and Its Implications for Multinational Finance and ESG Risk. Zenodo. https://doi.org/your-doi-here




License

Creative Commons Attribution 4.0 International (CC BY 4.0)https://creativecommons.org/licenses/by/4.0/



Let me know if you'd like a .md file or help submitting it directly to Zenodo.