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.