Single-molecule CpG methylation calls from Oxford Nanopore (R9, dorado/dimelo) for one donor, read out 35 days after CRISPRoff electroporation targeting CD55. Each row below is one sequenced DNA molecule; each column is one of 137 CpG sites across the region.
Every array here holds exactly two values: 1 for a CpG the basecaller flagged as
methylated with confidence ≥ threshold, and NaN for everything else. There is no
separate code for “confidently unmethylated.” That means a NaN can mean the site
was unmethylated, or that Nanopore simply couldn’t make a confident call there — and from
this array alone, those two cases are indistinguishable.
So the percentages below are a single honest number, not two: the share of CpG×molecule positions with a confident methylated call, out of the full padded window. Treated this way, it is mathematically identical to “NaN counted as unmethylated” — because there's nothing else in the array to distinguish them. It should be read as a floor estimate of true methylation, not a precise per-site frequency, and it will shift with basecaller version, coverage depth, and the confidence threshold itself (compare the 0.7 vs 0.995 panels below).
Percent of all CpG×molecule cells called methylated at each confidence threshold. The thin bar under each number is a literal count — filled portion = confident calls, dark portion = no call.
Unedited vs CRISPRoff, at each confidence threshold. A gap between the two lines near the CRISPRoff target region is the epigenetic silencing signature this whole project is built to show.
One row per sequenced molecule, sorted by overall methylation. Teal = confident methylated call. Dark = no confident call at that site (see note above — not necessarily unmethylated).
Same Day 35 donor, same 137 CpG window, at both confidence thresholds. Each DNA molecule is one row of 0/1 calls (missing calls filled as −1). Unedited and CRISPRoff read counts were balanced first (the larger group downsampled to match the smaller) so no model could win just by guessing the majority class, then split 75/25 into train and test. Six model types were trained to predict, from the methylation profile alone, which condition a molecule came from.
Every model landed well above the 50% chance line for this balanced two-class problem at both thresholds — the sparse (L1-penalized) logistic regression was the strongest consistent performer (94.87% at 0.995, 98.81% at 0.7). That's a strong signal that CRISPRoff silencing leaves a distinctive, learnable methylation fingerprint across these 137 CpGs. Two caveats worth holding onto: first, this is a single train/test split on small held-out sets (≈39 and ≈84 molecules) from one donor and one timepoint — a promising early result, not yet a validated generalization claim across donors or timepoints. Second, Random Forest's perfect 100% at threshold 0.7 is itself a flag rather than a triumph: an unconstrained forest can memorize a small test set, so that particular number likely says more about overfitting than about biology — the more modest, consistent numbers from GLM and Sparse GLM are the more trustworthy signal here.
If you don't come from a machine-learning background, the names above (GLM, Tree, RF, GBM, NN, Sparse GLM) are just six different strategies for drawing a boundary between Unedited and CRISPRoff molecules using their 137 CpG values. None of them "see" biology — they only see numbers. Here's what each one is actually doing, in plain language, plus a good short video if you want to go deeper.
Treats "Unedited = 1, CRISPRoff = 0" as a number and draws the single straight line through the 137 CpG values that comes closest to every molecule's true label, then rounds the prediction to 0 or 1. The simplest, most transparent option here.
Learn more: StatQuest — Linear Regression, Clearly Explained →Picks one CpG site at a time and asks "is it methylated here?", splitting molecules into smaller and smaller groups until each group is mostly one class. Easy to read as a flowchart, but a single tree can latch onto quirks of the exact training data.
Learn more: StatQuest — Decision and Classification Trees →Builds hundreds of decision trees, each trained on a random slice of the molecules and a random subset of CpG sites, then averages their votes. Usually sturdier than one tree — but with a very small dataset it can still memorize rather than generalize (as its 100% score at threshold 0.7 hints).
Learn more: StatQuest — Random Forests, Part 1 →Starts with one weak tree, looks at exactly which molecules it got wrong, and adds a new small tree aimed just at those mistakes — repeated many times. Often very accurate, but the step-by-step correction process makes it harder to inspect than a single tree.
Learn more: StatQuest — Gradient Boost, Part 1 →Passes the 137 CpG values through a few layers of small connected units, each layer combining and reweighting the signal, until it reaches one output. Flexible and powerful in principle, but with only a few hundred molecules to learn from, it has far more parameters than data — a classic recipe for an unreliable fit, which is worth keeping in mind for these particular numbers.
Learn more: StatQuest — The Essential Main Ideas of Neural Networks →Like the GLM above, but it's told from the start that most CpG sites are probably irrelevant. This "L1 penalty" pushes the weakest signals down to exactly zero, keeping only the handful of CpGs it's confident actually matter (dashed lines above = dropped, solid = kept). That's why it's often the most trustworthy of the six: it can't overfit on noise it has already discarded.
Learn more: StatQuest — Regularization Part 2: Lasso (L1) →