Bundle review table

Hub Proteins Are Essential — a test of the redundancy clause

Supplied working report; original verdicts not validated.

Review status: Needs review. This is an archival source note, not a passed proof.

README.md

# Hub Proteins Are Essential — a test of the redundancy clause

**Result.** Essentiality in the yeast protein–protein network tracks interaction
degree, not the ratio of degree to the redundancy of a protein's partners.
Degree alone reaches a repeated cross-validated AUC of 0.7555; the full
redundancy model reaches 0.7603 (ΔAUC +0.0048, gene-bootstrap 95% CI
0.0013–0.0093), and the redundancy ratio has no association with essentiality
once degree is controlled continuously inside degree deciles (odds ratio 0.93
per SD, 95% CI 0.80–1.08). On the proposal's own refute criterion —
"essentiality tracking degree would remove redundancy" — the claim is therefore
**refuted**: the directional half (degree matters) survives, the incremental half
does not.

## The proposal

> **Claim.** "The probability that a protein is essential is set by the ratio of
> its interaction degree to the redundancy of its partners, not by degree alone."
> **Mechanism.** "A hub can be bypassed if its partners are redundant;
> essentiality depends on whether losing it disconnects a function."
> **Prediction.** "Essentiality should track the ratio."
> **Refute criterion.** "Essentiality tracking degree would remove redundancy."

Posted at
<https://incoprea.com/research-library/original-theories-vol16-20261030/>
(Incoprea Research, *Original Theories* Vol. XVI, #60), untested at the time of
posting. `hypothesis.md` fixed the design and the decision rule before the final
run: **P1**, does anything beyond log degree improve cross-validated prediction
of essentiality by at least 0.010 AUC? **P2**, within degree deciles, is a
higher redundancy ratio associated with *lower* essentiality, with the
association surviving an explicit continuous-degree control? Supported only if
both pass.

## Design

- **Network.** STRING v12.0 *S. cerevisiae* links at `combined_score >= 700`:
  2,824,842 scored pairs in the file → 208,376 directed rows above threshold →
  **104,188 unique undirected edges** after collapsing the duplicate direction
  and dropping self-loops, over **5,791 proteins** (31 components; 5,716 in the
  giant component, 98.7%). STRING identifiers were stripped of the `4932.`
  prefix and mapped one-to-one to SGD standard gene names; 722 identifiers with
  no standard name kept their systematic name.
- **Essentiality.** SGD `phenotype_data.tab`, 201,632 rows: a gene is essential
  if it has at least one `Mutant type == "null"` row with `Phenotype ==
  "inviable"` (1,245 ORFs), non-essential if it has null records but none
  inviable (5,219), and excluded if it has no null record at all (238 graph
  nodes). The joined sample is **5,553 genes, 1,188 essential (21.4%)**.
- **Metrics.** Degree; local clustering coefficient on the simple graph; mean
  neighbour degree (mnd); redundancy ratio = mnd / degree. The ratio is the
  operational reading of "redundancy of its partners": above 1, the partners are
  on average better connected than the protein itself, so alternative routes
  exist. Because mnd is itself a degree sum, the ratio is mechanically tied to
  1/degree — which is why every confirmatory test is run inside degree strata.
- **Models.** Repeated stratified 10-fold CV AUC (20 repeats, l2 = 1.0, seed
  1007), predictors log-transformed and standardised, intercept unpenalised.
  M1 = log(degree); M2 = log(degree) + clustering + log(mnd). Inference: paired
  percentile bootstrap over the 20 repeats (10,000 resamples), gene-level
  bootstrap (300 resamples), label permutation (500 permutations × 3 CV
  repeats) and a within-decile feature rotation (200 permutations × 3 CV
  repeats, holding degree and labels fixed).
- **Secondary test.** Ten equal-count degree deciles × within-decile redundancy
  quartiles, raw rates per cell, and logistic models with degree-decile fixed
  effects, with and without continuous log(degree). The strict model governs
  because the top decile spans degrees 86–440.

## Numbers

**Graph and labels** (keys under `results.json → graph`, `→ descriptives`,
`→ inputs.label_counts`). 5,791 proteins, 104,188 edges, density 0.0062, mean
degree 35.98, median 16, maximum 440. Labelled 5,553: 1,188 essential (0.2139)
and 4,365 non-essential. Median degree is 39 for essential and 12 for
non-essential proteins; median redundancy ratio 1.44 versus 2.06. Spearman ρ
between log degree and essentiality is 0.364 (permutation p = 0.0005, 2,000
permutations); between the redundancy ratio and essentiality, ρ = −0.209.
Univariate AUCs: log degree 0.7559, log mnd 0.7082, clustering 0.5958,
redundancy ratio 0.3528 — below 0.5, i.e. *higher* redundancy goes with *lower*
essentiality before any control, as claimed.

**Table 1 — prediction models** (`results.json → primary`).

| Model | Predictors | CV AUC |
| --- | --- | --- |
| M1 | log(degree) | 0.7555 |
| M2 | log(degree) + clustering + log(mnd) | 0.7603 |
| M2 − M1 | — | **+0.0048** |

ΔAUC's 95% interval over the 20 repeats is 0.0047–0.0049 — narrow because it
measures fold-to-fold noise only. The gene-level bootstrap, which resamples
proteins, gives 0.0013–0.0093, and the increment stays below the pre-specified
practical floor of 0.010. M1 already captures **99.4%** of M2's AUC.

**Table 2 — permutation nulls for ΔAUC** (`results.json →
primary.label_permutation`, `→ primary.feature_rotation`).

| Null | What is permuted | Permutations | p | Null sd |
| --- | --- | --- | --- | --- |
| Label permutation | essentiality labels across genes | 500 | 0.34 | 0.0128 |
| Feature rotation | (clustering, log mnd) jointly, within degree decile | 200 | 0.005 | 0.00036 |

The two nulls answer different questions and the disagreement between them is
part of the result. Label permutation destroys the degree signal too, so its
null ΔAUC has a standard deviation of 0.013 — nearly three times the observed
increment — and cannot resolve an effect this small. Feature rotation keeps
degree and labels and asks whether the redundancy features are informative
*given* degree; it says yes, by about half an AUC point. The increment is real
but practically negligible. Both readings are reported rather than the
flattering one.

**Table 3 — essential fraction (%) by degree decile and within-decile
redundancy quartile** (`results.json → secondary.strata.cells`; 138–139 genes
per cell).

| Degree | Q1 (low red.) | Q2 | Q3 | Q4 (high red.) |
| --- | --- | --- | --- | --- |
| 1–2 | 7.2 | 5.8 | 4.3 | 4.3 |
| 2–5 | 0.7 | 6.5 | 3.6 | 5.1 |
| 5–7 | 2.2 | 4.3 | 5.8 | 10.9 |
| 7–12 | 8.6 | 7.9 | 12.9 | 10.1 |
| 12–16 | 10.1 | 19.4 | 20.9 | 16.7 |
| 16–23 | 15.8 | 20.9 | 22.3 | 20.3 |
| 23–32 | 18.7 | 27.3 | 20.1 | 28.1 |
| 32–45 | 29.5 | 34.5 | 36.0 | 44.9 |
| 45–85 | 32.4 | 47.5 | 61.2 | 41.3 |
| 86–440 | 44.6 | 52.5 | 51.8 | 39.1 |

The strong gradient runs down the rows (degree), not across the columns
(redundancy). Within rows the pattern is flat and non-monotone, with a reversal
in the top decile.

**Table 4 — logistic models for the redundancy measures** (`results.json →
secondary.models` and `→ sensitivity.alt_proxy.S2`). Odds ratios per 1 SD, with
degree-decile fixed effects where stated.

| Specification | OR per SD | Wald 95% CI | Bootstrap 95% CI |
| --- | --- | --- | --- |
| Redundancy ratio, unadjusted | 0.198 | 0.138–0.283 | — |
| Redundancy ratio, decile FE (S1, as specified) | 0.504 | 0.410–0.620 | 0.389–0.612 |
| Redundancy ratio, decile FE + log degree (S2, strict) | 0.932 | 0.802–1.083 | 0.795–1.008 |
| Clustering, decile FE + log degree | 1.245 | 1.149–1.348 | — |
| Neighbour clustering, decile FE + log degree | 1.327 | 1.209–1.458 | — |

This is the crux. With decile dummies alone the redundancy ratio looks like
strong support for the claim (OR 0.504, Wald p = 9.3e-11). Adding continuous log
degree inside the deciles removes it (OR 0.932, Wald p = 0.36; bootstrap CI
0.795–1.008): the apparent effect was residual collinearity with degree, which
the 86–440 spread of the top decile makes possible. The crude OR of 0.198 is
mostly degree as well. The one conditional signal that survives, clustering (OR
1.245), points the other way — at fixed degree, essential proteins sit in
*more* clustered neighbourhoods, the opposite of what "partners are redundant,
so a hub can be bypassed" implies.

**Table 5 — sensitivity analyses** (`results.json → sensitivity`). Each row
re-derives the whole pipeline; ΔAUC is M2 − M1 and the OR is the strict S2
model.

| Variant | n | M1 | M2 | ΔAUC | S2 OR (95% CI) | Verdict |
| --- | --- | --- | --- | --- | --- | --- |
| Main (`score >= 700`) | 5,553 | 0.7555 | 0.7603 | 0.0048 | 0.93 (0.80–1.08) | refuted |
| `score >= 400` (281,178 edges) | 5,948 | 0.7112 | 0.7223 | 0.0111 | 1.09 (1.02–1.16) | mixed |
| Degree ≥ 2 only | 5,235 | 0.7509 | 0.7569 | 0.0061 | 1.00 (0.90–1.12) | refuted |
| Neighbour-clustering proxy | 5,553 | 0.7556 | 0.7626 | 0.0071 | 1.33 (1.21–1.46) | refuted |
| Discordant labels dropped | 5,353 | 0.7641 | 0.7698 | 0.0057 | 0.92 (0.77–1.09) | refuted |

The verdict did not move, with one honesty flag. At the looser 400 threshold the
ΔAUC reaches 0.0111 and crosses the practical floor, so the mechanical rule
returns "mixed"; that does not rescue the claim, because the redundancy OR there
is 1.09 with a CI excluding 1 — significant in the *opposite* direction. The
magnitude judgment is threshold-sensitive; what is robust is the sign
instability of the redundancy association (0.93 at 700, 1.09 at 400) and the
fact that it never behaves as the mechanism requires. Dropping degree-1
proteins, swapping in the neighbour-clustering proxy and dropping discordant
labels leave the refutation intact, and the alternative proxy again points the
wrong way.

## What this test cannot see

This is an observational network design; nothing here is causal, and
"associated with" is the strongest verb it supports. Four specific blind spots.
First, `combined_score` is a heterogeneous STRING confidence score — experiments,
databases, text mining, co-expression and transfer pooled — so some
high-confidence edges are indirect, and well-studied proteins accumulate both
edges and phenotype annotations, which inflates the degree–essentiality
association by ascertainment. Second, essentiality is one binary label from
rich-medium single-gene null records; it ignores condition-specific
essentiality, partial loss of function, and the 5,219 genes whose only null
records are viable. Third, "redundancy" is proxied by three graph quantities
(mean neighbour degree, its ratio to own degree, partner clustering), none of
which measures functional redundancy: a paralogue pair with low connectivity is
functionally redundant and invisible to all three, while a dense neighbourhood
may be one complex with no bypass at all. Fourth, the features are computed on
the same graph whose edges define the outcome's context, so the
cross-validation is not independent of network construction, and no external
validation set is used. The test can carry an ensemble-level conclusion about
this network; the mechanism sentence is not tested at all.

## Files

- `hypothesis.md` — proposal verbatim, pre-specified tests and decision rule
- `run.py` — graph construction, labels, metrics, models, nulls, both figures
- `data/raw/` — unmodified inputs, sha256 in `SOURCE.md`
- `data/analysis_table.csv` — one row per graph node (5,791)
- `results.json` — every number above, under the keys named in the text
- `figures/fig1_degree_and_delta_auc.png` — essential fraction by degree decile
  with Wilson intervals, and ΔAUC against both null distributions
- `figures/fig2_redundancy_within_degree_strata.png` — the 10 × 4 cell rates and
  the odds-ratio forest plot
- `SOURCE.md` — URLs, fetch timestamp, row counts, sha256, licence

Reproduce:

```
MPLCONFIGDIR=[local provenance path] \
[local provenance path] run.py
```

Seeds: CV 1007, repeat bootstrap 3003, label permutations 2002, feature rotation
777, gene bootstrap 4242, odds-ratio bootstrap 5005, crude permutation tests 7.

*Designed and executed with AI assistance (DeepSeek via its coding agent), not
peer reviewed. Observational network data; no causal claim is made, and nothing
here is medical, clinical or drug-target advice.*

hypothesis.md

# Hub Proteins Are Essential — pre-specified test

**Source.** Incoprea Research, *Original Theories*, Volume XVI, #60.
<https://incoprea.com/research-library/original-theories-vol16-20261030/>
Posted as a speculative proposal and, at the time of writing, untested.

## The proposal, verbatim

- **Title:** "Hub Proteins Are Essential"
- **Claim:** "The probability that a protein is essential is set by the ratio of
  its interaction degree to the redundancy of its partners, not by degree alone."
- **Mechanism:** "A hub can be bypassed if its partners are redundant;
  essentiality depends on whether losing it disconnects a function."
- **Prediction:** "Essentiality should track the ratio."
- **Refute criterion:** "Essentiality tracking degree would remove redundancy."

## What is being tested

The claim has two separable parts:

1. **Directional part.** Essentiality rises with interaction degree. This is the
   centrality–lethality regularity the proposal is arguing against, and the
   proposal's own refute criterion concedes that degree tracking would count
   against it.
2. **Incremental part ("not by degree alone").** Given degree, the redundancy of
   a protein's partners carries additional information about essentiality, in the
   direction stated by the mechanism: partners that are themselves well connected
   provide bypass routes, so a well-connected protein whose partners are also
   well connected should be *less* likely to be essential.

The test is therefore two-part and both parts must pass for the claim to stand.

## Data and operational definitions

Frozen before the final run of `run.py`; inspection of the raw files (column
names, value sets, graph size, score distribution) informed the filter choices
below, but no outcome model had been fitted when this file was written.

- **Network.** STRING v12.0 *Saccharomyces cerevisiae* protein links, restricted
  to `combined_score >= 700` (the high-confidence band; 208,376 of 2,824,842
  scored pairs). Each pair appears twice in the file (once per direction) and is
  collapsed to one undirected edge; self-loops are dropped. STRING identifiers
  (`4932.YAL001C`) are stripped of the `4932.` prefix and mapped to the SGD
  standard gene name via the `Gene name` column of `phenotype_data.tab`; the 722
  identifiers with no standard name keep their systematic name. No two STRING
  identifiers map to the same name, so the map is one-to-one.
- **Essentiality.** `phenotype_data.tab` (SGD, 201,632 rows, no header, 14
  columns) is filtered to rows with `Mutant type == "null"` and
  `Phenotype == "inviable"`. A gene is **essential** if it has at least one such
  row; **non-essential** if it has null-mutant rows but none inviable; and
  **unlabelled** (excluded) if it has no null-mutant row at all. Genes with both
  inviable and viable null records are labelled essential (the inviable record
  wins) and the discordance is carried into a sensitivity analysis.
- **Metrics** (simple undirected graph, local definitions):
  - `degree` = number of distinct interaction partners.
  - `clustering` = local clustering coefficient, 2·(edges among neighbours) /
    (k·(k−1)); 0 when k < 2.
  - `mean_neighbour_degree` (mnd) = mean degree of the k partners.
  - `redundancy_ratio` = mnd / degree. **Justification.** The dynamic quantity in
    the claim is how many alternative routes exist if the protein is lost; a
    partner set that is on average better connected than the protein itself
    provides such routes, so the ratio of partner connectivity to own
    connectivity is the natural degree-normalised statement of "redundancy of
    its partners". Ratio > 1 means the protein is the least connected node in its
    own neighbourhood (a candidate bottleneck); ratio < 1 means it is the hub of
    hubs. Because mnd is itself a degree sum, the ratio is mechanically tied to
    1/degree; that is exactly why the decisive test below is run *inside* degree
    strata.
  - `neighbour_clustering` = mean local clustering coefficient of the partners,
    used only as an alternative redundancy proxy in sensitivity analysis.

## Primary test (P1): does anything beyond degree improve prediction?

Repeated stratified 10-fold cross-validated AUC, 20 repeats, l2 = 1.0, seed
1007. Continuous predictors are log-transformed (natural log) and then
standardised so that the ridge penalty is on a common scale. Both models include
an unpenalised intercept.

- **M1:** essential ~ log(degree)
- **M2:** essential ~ log(degree) + clustering + log(mean_neighbour_degree)

Reported: mean AUC per model, ΔAUC = M2 − M1, the paired percentile bootstrap CI
over the 20 repeats (10,000 resamples), and a **label-permutation p-value**:
essentiality labels are permuted across genes without replacement (500
permutations, 3 CV repeats each, seed 2002), both models refitted on every
permuted label vector, and p = (1 + #{ΔAUC_perm ≥ ΔAUC_obs}) / (1 + 500).

Because label permutation also destroys the degree signal and therefore inflates
the null variance of ΔAUC, a second, sharper null is reported alongside:
**feature rotation** — the (clustering, log mnd) pair is permuted jointly among
genes *within* each degree decile (200 permutations, 3 CV repeats, seed 777),
holding degree and labels fixed. A gene-level bootstrap (300 resamples, one CV
repeat each, seed 4242) gives a CI that reflects sampling of genes rather than
fold noise.

**Support threshold for P1 (pre-specified):** ΔAUC ≥ 0.010 with a 95% CI
excluding 0. One AUC point is the smallest increment that would change a
ranking-based use of the score; an increment below it is treated as practically
nil regardless of its p-value.

## Secondary, decisive test (P2): the "not by degree alone" clause

Genes are binned into ten equal-count degree deciles (by degree rank). Within
each decile, the redundancy ratio is split into equal-count quartiles. The raw
essential fraction is reported for all 10 × 4 cells with cell counts, so the
reader can see the pattern before any model is fitted.

Two logistic models, both with degree-decile fixed effects (nine dummies), report
the odds ratio per 1 SD of the redundancy ratio:

- **S1 (as specified):** essential ~ decile FE + z(redundancy_ratio).
- **S2 (strict degree control, governs the verdict):** essential ~ decile FE +
  z(log degree) + z(redundancy_ratio).

S2 is included in advance because the top decile spans degrees 86–440: a decile
dummy alone leaves a strong within-decile gradient of 1/degree, which is exactly
the collinearity the claim must survive. CIs are percentile bootstrap over genes
(10,000 resamples, seed 5005).

**Support threshold for P2 (pre-specified):** the S2 odds ratio is < 1 with a 95%
CI excluding 1 (higher partner redundancy associated with lower essentiality, the
direction the mechanism requires). If S1 is significant but S2 is not, the
apparent effect is read as residual degree collinearity, not redundancy.

The same two specifications are also run for `clustering` and for
`neighbour_clustering` as descriptive companions; they do not enter the verdict.

## Verdict rule (pre-specified)

- **Supported** only if P1 passes *and* P2 passes.
- **Refuted** if P1 fails and P2 fails, or if P1 fails and the conditional
  association runs opposite to the mechanism.
- **Half-supported / ambiguous** if exactly one passes; the surviving clause is
  then named explicitly.

## Pre-specified sensitivity analyses

Each re-derives the whole analysis pipeline and reports ΔAUC and the S2 odds
ratio; the question asked is only "did the verdict move?".

1. **Lower-confidence network:** `combined_score >= 400` instead of 700.
2. **Peripheral proteins removed:** drop genes with degree 1 (their clustering is
   undefined and their ratio is 1/k by construction).
3. **Alternative redundancy proxy:** replace log(mnd) with
   `neighbour_clustering` in M2 and in the S1/S2 models.
4. **Discordant labels removed:** drop the genes with both inviable and viable
   null records.

## Seeds

CV 1007; repeat bootstrap 3003; label permutations 2002; feature rotation 777;
gene bootstrap 4242; odds-ratio bootstrap 5005; crude permutation tests 7.

Included code and results