# Testing the Coherence Framework's Own Prediction on Real EEG Data

**A re-analysis of ds007471 using the joint graph Laplacian metric the Coherence Framework predicts should carry signal — a positive result, contrasted against the earlier null on a different metric.**

Diego Rincón · Phronesis · Research note, v1

---

## Summary

*The Coherence Framework* (Rincón, 2026) derives, from graph-theoretic first principles, that joint coherence between two coupled systems cannot be decomposed into their individual coherences — formally, that $\lambda_1(L_{AB}) \geq \min(\chi(G_A), \chi(G_B))$ for any real cross-coupling, with equality only when the coupling is absent (Eq. 8). The paper's own §6 proposes a direct, cheap test: re-analyze the already-open ds007471 hyperscanning dataset, computing this specific inequality for real dyads versus randomly mismatched (shuffled) pairs, where cross-coupling should be spurious.

That test is run here. **Result: real pairs show a significantly larger gap** between joint coherence and the weaker individual's coherence than shuffled pairs do. The initial pass used a plain Mann-Whitney U (p = 0.0052) that treats the 580 shuffled rows as independent when they are not (see Method and the follow-up analysis below); correcting for that with a paired, per-pair test gives **p = 0.0012** — the result gets *stronger*, not weaker, once the non-independence is properly accounted for. 25 of 29 real pairs show a positive gap at all, and 22 of 29 individually beat their own pair-matched shuffle baseline. This is the first empirical support in this research program for the joint-graph-Laplacian formalism specifically — distinct from, and a contrast to, the null result reported earlier for a different metric (alpha-band PLI) on the same dataset.

## What this is and isn't testing

This tests one narrow, specific, pre-registered structural prediction: whether real cross-coupling produces measurably higher joint coherence than the same people's coupling would produce if paired with a stranger. It does **not** test whether that coupling correlates with joint agency, synchronization performance, or any subjective/behavioral outcome — that was the earlier PLI analysis, which came back null. It also does not test the dyadic-eigenspectrum consciousness claim directly; it tests one piece of the formal scaffolding underneath it.

## Method

Same dataset, same corrected pair-loading logic as the earlier analysis (`ds007471_analyze.py`): each `sub-NN` file is one pair's 64-channel recording, channels 1–32 left participant, 33–64 right. 29 of 31 downloadable pairs were usable (same two dropped as before: no usable EEG file, or zero trials passing the segmentation criteria).

For each pair, alpha-band (8–12Hz) phase was extracted via Hilbert transform, concatenated across all task-active trial windows (same windowing as the PLI analysis). Three graphs were built from pairwise Phase Lag Index between channels:

- $G_A$ (32×32): within-left-participant channel PLI
- $G_B$ (32×32): within-right-participant channel PLI
- $G_{AB}$ (64×64): the joint graph, block matrix $\begin{pmatrix} A_{AA} & A_{AB} \\ A_{AB}^\top & A_{BB} \end{pmatrix}$, with $A_{AB}$ the cross-participant channel PLI

Coherence $\chi(G)$ is the Fiedler value (second-smallest Laplacian eigenvalue) of each graph. The tested quantity is $\text{diff} = \chi(G_{AB}) - \min(\chi(G_A), \chi(G_B))$, matching Eq. 8 exactly.

**Real condition:** diff computed per pair, n = 29.

**Shuffled condition:** 20 random derangements of pair assignment (each iteration reassigns every pair's right-side data to a different, randomly chosen pair's right side, with no pair matched to itself), same computation applied. n = 580 (29 pairs × 20 shuffles) — though see Limitations below on what this n actually represents.

## Two real bugs, caught before they reached the result

**Length mismatch.** Real pairs share one synchronized recording, so their left/right channel data are always the same length. Shuffled (mismatched) pairs combine two different pairs' recordings, which are *not* the same length — and PLI requires time-aligned samples. The first run crashed on this. Fixed by truncating both sides to a common length before any PLI computation, applied uniformly to both conditions (not just the shuffled one), so real and shuffled stay directly comparable rather than one condition using more data than the other.

**Memory.** The first working version cached every pair's full-resolution phase data in RAM simultaneously — needed across all 20 shuffle iterations — which on a 24GB machine hit a 19–25GB peak footprint and drove the system into heavy swap (9.86GB of 11.26GB swap used). The process wasn't frozen, it was thrashing: 40 minutes of 99% CPU with zero forward progress. Fixed by writing each pair's phase data to disk as float32 once, then loading only the 1–2 pairs needed for any single comparison — peak memory dropped to under 9GB and the full run (29 real + 580 shuffled computations) completed in a few minutes.

Neither bug affects the reported result — both were caught and fixed before the numbers above were produced, not after.

## Results

```
=== Eq. 8 test: chi_AB - min(chi_A, chi_B) ===
real pairs      (n=29):  mean=0.1626  sd=0.1324  median=0.182
shuffled pairs  (n=580): mean=0.0803  sd=0.1877  median=0.114
Mann-Whitney U (real > shuffled, one-sided): U=10780.0  p=0.0052
25/29 real pairs show diff > 0
```

## Follow-up: correcting for the non-independent shuffled rows

The original Mann-Whitney U (above) treats the 580 shuffled rows as 580 independent observations, when they are really the same 29 people recombined 20 times each — a real dependence structure that a plain two-sample test ignores. Two more rigorous re-analyses were run against the same results file (`ds007471_laplacian_clustered_analysis.py`), both accounting for pair identity directly:

**Paired test (primary fix).** Each pair reduced to one real diff and one shuffle-mean diff (averaged across that pair's own 20 shuffles), then a paired Wilcoxon signed-rank test on the 29 matched pairs — no inflated n anywhere, every real observation compared only against its own pair's shuffled baseline.

```
mean(real - shuffle_mean) = 0.0823   sd = 0.1284
22/29 pairs: real diff exceeds that pair's own shuffle-mean diff
Wilcoxon signed-rank (real > shuffle_mean, one-sided): W=354.0  p=0.0012
```

**Mixed-effects model (cross-check).** `diff ~ is_real`, with pair as a random-intercept grouping variable across all 609 rows — the same mixed-model approach already used for the original PLI analysis (`ds007471_analyze.py`), rather than a plain two-sample test.

```
           Coef.   Std.Err.   z       P>|z|    [0.025   0.975]
Intercept  0.080    0.017    4.811   0.000     0.048    0.113
is_real    0.082    0.032    2.585   0.010     0.020    0.145
```

Both agree with each other and with the original test's direction — the effect is not an artifact of the inflated shuffled n. The mixed model showed a convergence warning (group variance near the boundary at 0.007), consistent with there being little between-pair variance beyond the fixed effect at this sample size; the paired Wilcoxon, which has no such concern, is the more defensible number to cite and is now the one used above.

## Limitations

- **n=29 real pairs is small.** This is consistent with the sample size used throughout this dataset's re-analyses, but a single dataset at this size is suggestive, not conclusive.
- **This is a re-analysis of an existing open dataset for a hypothesis formulated after seeing related results on the same data** (the PLI null result on this dataset was already known before this analysis was designed) — not a pre-registered, independent confirmation. The Phase 2 protocol (`phase2-hyperscanning-protocol.md`) already lists the joint graph Laplacian as its pre-registered primary metric for a genuinely new data collection; this result is a reason to keep that pre-registration as written, not a substitute for running it.
- **Alpha band only, sensor-level PLI only.** Same caveats as the original analysis — other bands, other connectivity measures, and source-localized rather than sensor-level analysis could all change the picture.

## What it's actually useful for

A cheap, honest, pre-specified check (per the Coherence Framework's own §6) that came back positive rather than null, on the same dataset and the same general PLI machinery that produced a null result for a different, non-theoretically-motivated metric. That contrast — null on an off-the-shelf metric, signal on the metric this research program's own math actually predicts — is worth having in the record either way it had gone, and this time it went the theory's way. It does not replace the pre-registered Phase 2 study; if anything it raises the stakes for running it properly.

## Reproducibility

Analysis code: [`ds007471_laplacian_analyze.py`](ds007471_laplacian_analyze.py) (the EEG re-analysis) and [`ds007471_laplacian_clustered_analysis.py`](ds007471_laplacian_clustered_analysis.py) (the paired/mixed-effects follow-up, runs directly against the saved results CSV, no EEG data needed). Per-pair, per-condition results: [`ds007471_laplacian_results.csv`](ds007471_laplacian_results.csv). Raw data is the same public, credential-free S3 mirror used in the original analysis: `aws s3 sync --no-sign-request s3://openneuro.org/ds007471/ <dest>`.
