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/
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 credibilityfearful biasliberal conservative biasopinion biasoversimplification biasappeal to authority biasestablishment biascruelty biasscapegoat biasconspiracy biasvictimization biasideological biaspolitical biaswritten 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}")
Output on my run:
Sources analyzed: 160
r(fear, lib-cons direction) = -0.081
r(fear, |lib-cons|) = +0.854
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:
- 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.
- 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".
-
For any structured news intake (LLM agent, RAG pipeline, fact-checking workflow),
fearful biasis 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
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)