Globalization & Conflict
  • Home
  • The Map
  • Mechanism
  • Explore
  • Evidence
  • Policy
  • About

On this page

  • Why Does Globalization Change the Calculus?

The Mechanism

A game-theoretic model of strategic territory, conflict, and trade

Why Does Globalization Change the Calculus?

The paper uses game theory to formalize why trade changes conflict incentives. Here’s the core intuition:

Code
viewof tradeLevel = Inputs.range([0.35, 0.60], {
  value: 0.40,
  step: 0.01,
  label: "Trade openness level"
})
Code
{
  const width = 680;
  const height = 400;
  const isLow = tradeLevel < 0.534;

  // Normalized position of trade on [0, 1]
  const t = (tradeLevel - 0.35) / (0.60 - 0.35);

  // Responsive coordinates as fractions of width/height
  const cx = width / 2;      // center x = 340
  const topY = 60;
  const midY = 200;
  const botY = 340;
  const spread = width * 0.26; // horizontal spread from center

  const svg = d3.create("svg")
    .attr("viewBox", [0, 0, width, height])
    .style("max-width", "100%")
    .style("font-family", "'Source Sans 3', sans-serif");

  // Background
  svg.append("rect")
    .attr("width", width).attr("height", height)
    .attr("fill", isLow ? "#fff8f0" : "#f0fff4")
    .attr("rx", 8);

  // --- NODES ---
  const nodes = [
    {id: "strategic", label: "Strategic Value", sublabel: "of location near choke point", x: cx, y: topY, color: "#ff9800"},
    {id: "incentive", label: "Incentive to Fight", sublabel: "local actors contest territory", x: cx - spread, y: midY, color: isLow ? "#e53935" : "#66bb6a"},
    {id: "intervention", label: "Major Power Intervention", sublabel: "protect trade routes", x: cx + spread, y: midY, color: "#42a5f5"},
    {id: "conflict", label: isLow ? "MORE Conflict" : "LESS Conflict", sublabel: "near choke points", x: cx, y: botY, color: isLow ? "#c62828" : "#2e7d32"},
  ];

  // --- ARROWS ---
  // Strategic -> Incentive
  svg.append("line")
    .attr("x1", cx - 60).attr("y1", topY + 30).attr("x2", cx - spread + 40).attr("y2", midY - 25)
    .attr("stroke", "#e53935").attr("stroke-width", 2 + (1 - t) * 3)
    .attr("marker-end", "url(#arrow-red)");

  // Arrow label: fuels conflict
  svg.append("text")
    .attr("x", cx - spread + 10).attr("y", topY + 55)
    .attr("text-anchor", "middle").attr("fill", "#e53935")
    .attr("font-size", "9px").attr("font-style", "italic")
    .attr("opacity", 0.5 + (1 - t) * 0.5)
    .text("fuels conflict");

  // Strategic -> Intervention
  svg.append("line")
    .attr("x1", cx + 60).attr("y1", topY + 30).attr("x2", cx + spread - 40).attr("y2", midY - 25)
    .attr("stroke", "#42a5f5").attr("stroke-width", 1 + t * 4)
    .attr("marker-end", "url(#arrow-blue)");

  // Arrow label: triggers intervention
  svg.append("text")
    .attr("x", cx + spread - 10).attr("y", topY + 55)
    .attr("text-anchor", "middle").attr("fill", "#42a5f5")
    .attr("font-size", "9px").attr("font-style", "italic")
    .attr("opacity", 0.3 + t * 0.7)
    .text("triggers response");

  // Incentive -> Conflict
  svg.append("line")
    .attr("x1", cx - spread + 40).attr("y1", midY + 25).attr("x2", cx - 40).attr("y2", botY - 25)
    .attr("stroke", "#e53935").attr("stroke-width", 2 + (1 - t) * 3)
    .attr("stroke-opacity", 0.4 + (1 - t) * 0.6)
    .attr("marker-end", "url(#arrow-red)");

  // Intervention -> Conflict (suppressive)
  svg.append("line")
    .attr("x1", cx + spread - 40).attr("y1", midY + 25).attr("x2", cx + 40).attr("y2", botY - 25)
    .attr("stroke", "#42a5f5").attr("stroke-width", 1 + t * 4)
    .attr("stroke-opacity", 0.3 + t * 0.7)
    .attr("marker-end", "url(#arrow-blue)");

  // Arrow label: suppresses conflict
  svg.append("text")
    .attr("x", cx + spread - 10).attr("y", midY + 65)
    .attr("text-anchor", "middle").attr("fill", "#42a5f5")
    .attr("font-size", "9px").attr("font-style", "italic")
    .attr("opacity", 0.3 + t * 0.7)
    .text("suppresses conflict");

  // Trade openness -> Intervention (moderating arrow)
  const tradeX = Math.min(width - 40, cx + spread + 80);
  svg.append("text")
    .attr("x", tradeX).attr("y", 125)
    .attr("text-anchor", "middle").attr("fill", "#1a237e")
    .attr("font-size", "11px").attr("font-weight", "700")
    .text("Trade Openness");

  svg.append("text")
    .attr("x", tradeX).attr("y", 142)
    .attr("text-anchor", "middle").attr("fill", "#555")
    .attr("font-size", "10px")
    .text(`= ${tradeLevel.toFixed(2)}`);

  svg.append("line")
    .attr("x1", tradeX - 20).attr("y1", 150).attr("x2", cx + spread + 15).attr("y2", midY - 15)
    .attr("stroke", "#1a237e").attr("stroke-width", 1.5 + t * 2)
    .attr("stroke-dasharray", "4,3")
    .attr("marker-end", "url(#arrow-navy)");

  // Arrow markers
  const defs = svg.append("defs");
  for (const [id, color] of [["arrow-red", "#e53935"], ["arrow-blue", "#42a5f5"], ["arrow-navy", "#1a237e"]]) {
    defs.append("marker")
      .attr("id", id).attr("viewBox", "0 0 10 10")
      .attr("refX", 8).attr("refY", 5)
      .attr("markerWidth", 6).attr("markerHeight", 6)
      .attr("orient", "auto")
      .append("path")
      .attr("d", "M 0 0 L 10 5 L 0 10 z")
      .attr("fill", color);
  }

  // Draw node boxes
  for (const node of nodes) {
    const g = svg.append("g")
      .attr("transform", `translate(${node.x}, ${node.y})`);

    g.append("rect")
      .attr("x", -80).attr("y", -22)
      .attr("width", 160).attr("height", 44)
      .attr("rx", 6)
      .attr("fill", "white")
      .attr("stroke", node.color)
      .attr("stroke-width", 2);

    g.append("text")
      .attr("text-anchor", "middle").attr("y", -4)
      .attr("font-size", "12px").attr("font-weight", "700")
      .attr("fill", node.color)
      .text(node.label);

    g.append("text")
      .attr("text-anchor", "middle").attr("y", 14)
      .attr("font-size", "9px")
      .attr("fill", "#888")
      .text(node.sublabel);
  }

  return svg.node();
}
Code
{
  const isLow = tradeLevel < 0.534;
  return htl.html`
  <div style="display: flex; gap: 2rem; flex-wrap: wrap; margin: 1.5rem 0;">
    <div style="flex: 1; min-width: 280px; background: ${isLow ? '#fff3e0' : '#f5f5f5'}; padding: 1.5rem; border-radius: 8px; border-left: 4px solid ${isLow ? '#e53935' : '#ccc'};">
      <p style="font-size: 1.05rem;">
        Strategic territory has <strong>${isLow ? 'high' : 'some'} local value</strong> → local actors ${isLow ? '' : 'may'} fight to control it<br>
        Major powers have <strong>${isLow ? 'low' : 'moderate'} stakes</strong> in the region → they ${isLow ? "don't" : 'may not'} intervene<br>
        <span style="color: #e53935;"><strong>→ More conflict near choke points</strong></span>
      </p>
    </div>
    <div style="flex: 1; min-width: 280px; background: ${!isLow ? '#e8f5e9' : '#f5f5f5'}; padding: 1.5rem; border-radius: 8px; border-left: 4px solid ${!isLow ? '#43a047' : '#ccc'};">
      <p style="font-size: 1.05rem;">
        Global trade flows through these straits → <strong>everyone depends on them</strong><br>
        Major powers have <strong>high stakes</strong> → they intervene to keep routes open<br>
        <span style="color: #43a047;"><strong>→ Less conflict near choke points</strong></span>
      </p>
    </div>
  </div>`;
}
NoteReal-World Example

In early 2020, France and the Netherlands deployed frigates to the Strait of Hormuz specifically to protect commercial shipping — a direct illustration of major powers intervening when trade stakes are high.

Now that you’ve seen the mechanism, explore the quantitative evidence yourself — drag a slider and watch the marginal effect flip sign. Next: Explore the Effect

 

Gallea & Rohner, PNAS 2021 · Paper · Replication Data