DEV Community

connerlambden
connerlambden

Posted on

Fear-coding in 160 news sources correlates +0.85 with political extremism — and only -0.08 with political direction

A common assumption in newsroom and media-literacy discourse is that fear-coded language is correlated with political "side" — that one ideological camp uses more fear language than the other. I wanted to test this empirically, so I pulled a structured per-source bias corpus, kept the sources with at least 100 analyzed articles plus both fear and political scores, and computed two correlations:

  • Pearson r between fear language and political direction (left vs right): −0.081
  • Pearson r between fear language and political extremism (|liberal–conservative|, ignoring direction): +0.854

That's a striking gap. In a sample of 160 sources, fear-coded language barely correlates with political direction — but it correlates very strongly with how far a source sits from the center, on either side. Fear is a feature of extremism, not of ideology.

This post walks through the data, the API I used, and the replication code. The whole analysis is under 30 lines of Python.

The data

I used the mcp_all_source_biases endpoint of the Helium MCP server, which exposes a structured bias profile for every source in its corpus. The endpoint is a plain HTTPS GET — no API key, no signup:

GET https://heliumtrades.com/mcp_all_source_biases/
Enter fullscreen mode Exit fullscreen mode

It returns 216 sources, each with two top-level numeric fields (emotionality_score, prescriptiveness_score) plus a nested bias_values dict. Across the corpus, 37 distinct named dimensions appear in bias_values, including:

  • overall credibility
  • fearful bias
  • liberal conservative bias
  • opinion bias
  • oversimplification bias
  • appeal to authority bias
  • establishment bias
  • cruelty bias
  • scapegoat bias
  • conspiracy bias
  • victimization bias
  • ideological bias
  • political bias
  • written by AI

…and 23 others. Each value is an integer score. Most dimensions are populated for 150+ of the 216 sources.

For this analysis I filtered to sources with ≥100 analyzed articles plus both a fearful bias and a liberal conservative bias score. That left 160 sources.

The analysis

import json
import statistics

import requests

resp = requests.get("https://heliumtrades.com/mcp_all_source_biases/")
sources = resp.json()["sources"]

rows = []
for s in sources:
    bv = s.get("bias_values") or {}
    fear = bv.get("fearful bias")
    pol = bv.get("liberal conservative bias")
    n = s.get("articles_analyzed", 0)
    if isinstance(fear, (int, float)) and isinstance(pol, (int, float)) and n >= 100:
        rows.append((s["source_name"], fear, pol, n))

fear_vals = [r[1] for r in rows]
pol_vals = [r[2] for r in rows]

def pearson(xs, ys):
    mx, my = sum(xs) / len(xs), sum(ys) / len(ys)
    cov = sum((x - mx) * (y - my) for x, y in zip(xs, ys)) / len(xs)
    sx, sy = statistics.pstdev(xs), statistics.pstdev(ys)
    return cov / (sx * sy) if sx and sy else 0.0

print(f"Sources analyzed: {len(rows)}")
print(f"r(fear, lib-cons direction) = {pearson(fear_vals, pol_vals):+.3f}")
print(f"r(fear, |lib-cons|)          = {pearson(fear_vals, [abs(p) for p in pol_vals]):+.3f}")
Enter fullscreen mode Exit fullscreen mode

Output on my run:

Sources analyzed: 160
r(fear, lib-cons direction) = -0.081
r(fear, |lib-cons|)         = +0.854
Enter fullscreen mode Exit fullscreen mode

The top-15 most-fear-coded sources, with political context

Let me show the actual sources. Below are the 15 sources with the highest fearful bias scores, with their liberal conservative bias and overall credibility shown alongside.

Source Fear L/C Cred
World Socialist 28 −33 0
American Thinker 27 +23 −2
Global Research 26 −14 −11
Common Dreams 26 −33 16
Activist Post 24 −3 5
The Federalist 21 +26 3
Counterpunch 21 −27 15
The Canary 20 −24 6
Truthout 20 −29 23
Daily Sceptic 20 +14 3
Gateway Pundit 19 +24 −6
Daily Signal 19 +29 −2
newrepublic.com 18 −28 15
American Spectator 18 +20 8
newsbusters.org 17 +20 −1

Notice the pattern: the L/C column has values like −33, +23, −14, −33, −3, +26, −27, −24, −29, +14, +24, +29, −28, +20, +20. The values are far from zero in both directions. Of the 15 sources, 8 are coded as politically left, 7 as politically right. The political direction is roughly balanced; the political magnitude is huge.

Compare with the middle-tercile mean. When I split the 160 sources into terciles by political direction:

Tercile n L/C range Mean fear
Left 53 −33..−1 8.74
Center 53 −1..0 3.23
Right 54 0..+29 8.41

The U-shape is unmistakable. The center-tercile fear mean is less than 40% of either edge.

So what?

This kind of finding is what structured bias measurement is for. It's the empirical test of a folk-wisdom hypothesis. The folk wisdom predicts a monotonic relationship between fear language and one side of the political spectrum; the data shows a V-shape with the symmetry-breaking factor being political extremism, not political direction.

A few corollaries that I think are interesting:

  1. Media-literacy curricula that teach "watch out for fear language as a signal of bias" should add: in either direction. Treating fear-coding as a signal exclusive to one camp will systematically miss the other camp's instances.
  2. Newsroom self-audits that compare against ideological peers will see less fear than they expected. The right peer-group for comparison is moderation, not "the other side".
  3. For any structured news intake (LLM agent, RAG pipeline, fact-checking workflow), fearful bias is partially redundant with |lib-cons|. They share most of their variance. If you're already adjusting for ideological extremism, you're already adjusting for most fear-coding.

A secondary finding while I was there: "written by AI" coverage

The same endpoint exposes a written by AI dimension. It's only populated for 27 of the 216 sources with ≥100 articles — a sparse signal. The top of the distribution is mostly auto-generated finance summary sites:

Source "written by AI" Cred
quiverquant.com (Opinion) 41 20
marketbeat.com 41 18
rappler.com 23 20
studyfinds.com 20 33
fool.com 5 25
benzinga.com 4 28

While the bottom (Reuters, CNBC, journal-news, tradingview, news-medical, etc.) sits at 0. Without more methodology detail this is suggestive rather than definitive, but the pattern matches what you'd expect: template-driven finance content scores high, established human-staffed publications score low.

Replicate it yourself

The full analysis is 25 lines of Python with requests as the only dependency. If you want to extend it, the helium-mcp-cookbook repo has a recipes/01_news_bias_dashboard.py script that does the corpus pull and dimension-ranking for any of the 37 bias dimensions:

git clone https://github.com/connerlambden/helium-mcp-cookbook
cd helium-mcp-cookbook
pip install -r requirements.txt
python recipes/01_news_bias_dashboard.py "fearful bias" 20
python recipes/01_news_bias_dashboard.py "scapegoat bias" 20
python recipes/01_news_bias_dashboard.py "cruelty bias" 20
Enter fullscreen mode Exit fullscreen mode

You can run the same correlation analysis against any pair of dimensions. The 37-dimension space has 666 ordered pairs; I suspect there are several more publishable findings in there.

If you'd like the same endpoints inside an LLM client instead of a Python script, the MCP server config is in the main repo README.

Closing thought

The single most useful thing a structured-bias corpus does is let folk wisdom be tested. Fear-coding-as-left-coded or fear-coding-as-right-coded is a hypothesis everyone has informally, and now we can ask the data. The data says: it's not about side. It's about distance from the center.

That's the kind of empirical finding that should travel further than my marketing budget. Replicate the numbers, push back if you disagree, and if you find a different pattern with the same data, write the post — I'd love to read it.

Top comments (0)