$ ⌘K

Prepare AR2013 — derive conflict-episode-year observations from the AR2013 COW panel

step_count: 15· runtime: 15 seconds

Derives conflict-episode-level construct observations from the Akcinaroglu & Radziszewski (2013) COW conflict-year panel. These observations feed the quick_start Cox-PH replication of Avant & Neu's Table 2 Models 1–3 (pmsc_competition, civil_war_duration, conflict_terminated, the 9 control variables, and the cross-PAX-joined pmsc_government_event_count and pmsc_rebel_event_count). CITATION: Akcinaroglu, Seden, and Elizabeth Radziszewski. 2013. "Private Military Companies, Opportunities, and Termination of Civil Wars in Africa." Journal of Conflict Resolution 57(5): 795-821. DOI: 10.1177/0022002712449325 ============================================================ PREREQUISITE — REGISTER THE AR2013 DATASET MANUALLY FIRST ============================================================ This playbook does NOT include a register_dataset step because the AR2013 supplement is hosted on Sage Journals behind a Cloudflare bot challenge that no automated fetch can clear, and the file cannot be redistributed inside this PAX. The dataset must be registered by a human-in-the-loop process before this playbook is run. Steps for the future replicator: 1. Download the supplement zip from Sage in a browser (Cloudflare requires a real browser session): https://journals.sagepub.com/doi/suppl/10.1177/0022002712449325/suppl_file/10_1177_0022002712449325.zip 2. Unzip and locate `ar2013_cow_conflict_year.csv` (the COW Correlates of War conflict-year panel used in Avant & Neu's Table 2 Models 1–3). Note: the ACD-panel file in the supplement is for the original AR2013 Models 3–4 and is NOT used in this replication. 3. Register the CSV with praxis using the absolute path on your machine — example via the praxis MCP tool: praxis_register_dataset( pax_name="private-security-events-database", dataset_id="ar2013_cow_conflict_year", source="/absolute/path/to/ar2013_cow_conflict_year.csv", format="csv", unit_of_analysis="conflict-episode-year", ) Or via Python: import praxis and call the equivalent function. 4. Run this playbook. All derive steps target the `ar2013_cow_conflict_year` dataset registered in step 3. When praxis ships per-playbook `inputs:` (praxis#399) and tilde expansion (praxis#404), this playbook can include a parameterized register_dataset step and fold the manual step back into the playbook. Until then, the manual register is the contract. ============================================================ Unit of analysis: conflict-episode-year (cowcode × sidea × sideb × onset year). A stable conflict_id is derived as: LOWER(CAST(cowcode AS VARCHAR)) || '_' || REPLACE(sidea,' ','_') || '_' || REPLACE(sideb,' ','_') || '_' || CAST(CAST(start AS INTEGER) AS VARCHAR) Cross-PAX dependency: the last two steps (derive_pmsc_government_event_count_by_episode and derive_pmsc_rebel_event_count_by_episode) join AR2013 conflict-episodes to PSED country-year aggregates via the infrastructure-country-codes-crosswalk PAX's COW→ISO3 mapping. Install that PAX first; otherwise the cross-PAX view names will not resolve.

// pipeline
15 steps
01

derive_pmsc_competition

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'pmsc_competition' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  COALESCE(numgov, 0) AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n"
}
02

derive_civil_war_duration

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'civil_war_duration' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  COALESCE(duration, 0) AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n"
}
03

derive_conflict_episode

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT  -- conflict_episode: nominal concept; value_numeric=1 means episode exists this year; entity_id encodes conflict metadata\n  'conflict_episode' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  1 AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n"
}
04

derive_gdp_per_capita

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'gdp_per_capita' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  lngdp AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND lngdp IS NOT NULL\n"
}
05

derive_ethnic_fractionalization

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'ethnic_fractionalization' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  lnethfrac AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND lnethfrac IS NOT NULL\n"
}
06

derive_ethnic_wars

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'ethnic_wars' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  ethnicconflict AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND ethnicconflict IS NOT NULL\n"
}
07

derive_conflict_intensity

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'conflict_intensity' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  intensity AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND intensity IS NOT NULL\n"
}
08

derive_mountainous_terrain

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'mountainous_terrain' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  lnmntest AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND lnmntest IS NOT NULL\n"
}
09

derive_polity

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'polity' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  polity AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND polity IS NOT NULL\n"
}
10

derive_proportion_of_forces

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'proportion_of_forces' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  lnprop1 AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND lnprop1 IS NOT NULL\n"
}
11

derive_support_rebels

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'support_rebels' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  rsup AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND rsup IS NOT NULL\n"
}
12

derive_support_government

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'support_government' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  govsup AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND govsup IS NOT NULL\n"
}
13

derive_conflict_terminated

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "SELECT\n  'conflict_terminated' AS construct_id,\n  LOWER(CAST(cowcode AS VARCHAR)) || '_'\n    || REPLACE(sidea, ' ', '_') || '_'\n    || REPLACE(sideb, ' ', '_') || '_'\n    || CAST(CAST(start AS INTEGER) AS VARCHAR) AS entity_id,\n  year AS time_value,\n  terminate AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset\nWHERE cowcode IS NOT NULL\n  AND year IS NOT NULL\n  AND terminate IS NOT NULL\n"
}
14

derive_pmsc_government_event_count_by_episode

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "WITH cow_to_iso AS (\n  SELECT ccode_cow, MIN(iso3) AS iso3\n  FROM pax_infrastructure_country_codes_crosswalk__country_codes_crosswalk\n  WHERE iso3 IS NOT NULL\n  GROUP BY ccode_cow\n),\npsed_gov_year AS (\n  SELECT\n    LOWER(\"Country Code\") AS iso3_lower,\n    \"Year\" AS year,\n    COUNT(*) AS gov_event_count\n  FROM pax_private_security_events_database__psed_1990_2012\n  WHERE (\n    COALESCE(\"Client Types - Local Government\", 0)\n    + COALESCE(\"Client Types - National Government\", 0)\n    + COALESCE(\"Client Types - Foreign Government\", 0)\n  ) \u003e 0\n    AND \"Country Code\" IS NOT NULL\n    AND \"Year\" BETWEEN 1990 AND 2012\n  GROUP BY LOWER(\"Country Code\"), \"Year\"\n)\nSELECT\n  'pmsc_government_event_count' AS construct_id,\n  LOWER(CAST(a.cowcode AS VARCHAR)) || '_'\n    || REPLACE(a.sidea, ' ', '_') || '_'\n    || REPLACE(a.sideb, ' ', '_') || '_'\n    || CAST(CAST(a.start AS INTEGER) AS VARCHAR) AS entity_id,\n  a.year AS time_value,\n  COALESCE(p.gov_event_count, 0) AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset a\nLEFT JOIN cow_to_iso c ON a.cowcode = c.ccode_cow\nLEFT JOIN psed_gov_year p ON LOWER(c.iso3) = p.iso3_lower AND a.year = p.year\nWHERE a.cowcode IS NOT NULL AND a.year IS NOT NULL\n"
}
15

derive_pmsc_rebel_event_count_by_episode

action derive_observations
config (2 keys)
{
  "dataset_id": "ar2013_cow_conflict_year",
  "sql": "WITH cow_to_iso AS (\n  SELECT ccode_cow, MIN(iso3) AS iso3\n  FROM pax_infrastructure_country_codes_crosswalk__country_codes_crosswalk\n  WHERE iso3 IS NOT NULL\n  GROUP BY ccode_cow\n),\npsed_rebel_year AS (\n  SELECT\n    LOWER(\"Country Code\") AS iso3_lower,\n    \"Year\" AS year,\n    COUNT(*) AS rebel_event_count\n  FROM pax_private_security_events_database__psed_1990_2012\n  WHERE COALESCE(\"Client Types - Rebel\", 0) \u003e 0\n    AND \"Country Code\" IS NOT NULL\n    AND \"Year\" BETWEEN 1990 AND 2012\n  GROUP BY LOWER(\"Country Code\"), \"Year\"\n)\nSELECT\n  'pmsc_rebel_event_count' AS construct_id,\n  LOWER(CAST(a.cowcode AS VARCHAR)) || '_'\n    || REPLACE(a.sidea, ' ', '_') || '_'\n    || REPLACE(a.sideb, ' ', '_') || '_'\n    || CAST(CAST(a.start AS INTEGER) AS VARCHAR) AS entity_id,\n  a.year AS time_value,\n  COALESCE(p.rebel_event_count, 0) AS value_numeric,\n  'conflict-episode-year' AS unit_of_analysis\nFROM dataset a\nLEFT JOIN cow_to_iso c ON a.cowcode = c.ccode_cow\nLEFT JOIN psed_rebel_year p ON LOWER(c.iso3) = p.iso3_lower AND a.year = p.year\nWHERE a.cowcode IS NOT NULL AND a.year IS NOT NULL\n"
}
// from pax
Private Security and Conflict
// note
step bodies extracted from the .pax archive at build time. download the parent pax for the full yaml.
[ download private-security-events-database.pax.tar.gz ]