23andMe never read my DNA
23andMe never sequenced my DNA. The product I bought, the one almost everyone means by a DNA test, does not read genomes. It asks them multiple-choice questions.
I found this out by downloading my raw data. I expected something enormous. A complete human genome is 3,054,815,472 base pairs of nuclear DNA, and a base is one of four letters, two bits. One copy works out to roughly 760 MB, and I carry two copies, one inherited from each parent. Something north of a gigabyte, then, before compression.
What I got was a 16 MB text file. A comment header, then rows of tab-separated text:
grep -vc '^#' genome_v5_Full.txt
643161
643,161 rows, each one a single position in the genome. Against 3,054,815,472 positions, that is 0.021 percent. The other 99.979 percent of my genome, 23andMe has never seen. Not skipped for space. Never measured at all.
And yet the reports built on this file called my eye color, painted my ancestry chromosome by chromosome, and guessed right about milk. The gap between 0.021 percent and all of that is the interesting part, and it splits cleanly into two stories. This post is the first: what the file actually is, and the path from a tube of spit to text, where chemistry does the searching, physics does the measurement, and statistics does the reading. The second post reads my file in public.
01 · the file
The download is one table. Here is mine: the header verbatim (minus two lines that identify me), real rows, and the whole file summarized in three small figures. Hover or tap anything:
Four fields per row: an identifier, a chromosome, a position, and a genotype. The genotype is the payload, and it is usually two letters, because almost every chromosome in my cells exists twice. AG at some position means one copy carries an A there and the other carries a G. The file does not say which parent contributed which letter. That question turns out to be genuinely hard, and part two returns to it.
Some rows carry a single letter. Mitochondrial DNA comes in one flavor per person, the Y chromosome exists once in a male, and so, mostly, does the X, so a call there is one letter with no partner. Some rows carry no letters at all: -- means the machinery could not make a confident call. My file has 12,436 of those, 1.93 percent of rows, and section 05 shows exactly where they come from. And a few thousand rows answer with D and I instead of bases: questions about a small insertion or deletion rather than a letter swap. The distribution table above shows them; I am leaving them as a curiosity.
What the file is not: a sequence. You cannot read along a chromosome in it. Row two of my file sits 497,223 bases further down chromosome 1 than row one, and about the stretch in between the file simply has nothing to say. Each row is an isolated answer to an isolated question.
02 · the shortlist
So why would 0.021 percent be worth selling? Because human genomes barely differ from person to person. Any two humans are about 99.9 percent identical. The differences cluster at known places, and those places are catalogued. A position where one base commonly varies between people is a SNP, a single-nucleotide polymorphism, and NCBI's dbSNP database had catalogued more than 650 million variants by 2018. Each catalogued variant gets an rsid, a stable accession that survives reference-genome updates: rs plus a number. An rsid is really the name of a question. rs4988235 means: at the specific place we agree to call rs4988235, which base do you carry?
A genotyping chip is a curated shortlist of those questions, printed into hardware. Mine was 23andMe's v5 platform, which is an Illumina Global Screening Array carrying about 640,000 genome-wide variants plus roughly 50,000 of 23andMe's custom ones. The stock array holds 654,027 fixed markers, selected across the 26 populations of the 1000 Genomes Project for high imputation accuracy, which is a dense way of saying the questions are chosen so the answers are informative about their untested neighbors. A peer-reviewed survey of consumer files identifies the same chip at around 650K SNPs.
Here is what that shortlist looks like against the whole:
For scale within the scale: only about 1 percent of the genome is protein-coding, roughly 20,000 to 25,000 genes. The chip's shortlist is nearly fifty times as sparse as even that thin slice, and scattered everywhere, coding and not.
03 · the wet part
Before any question can be asked, the sample has to survive the mail. The tube in the kit is not just a tube: snapping the funnel cap releases a preservative buffer into the saliva, and the instructions want that done within 30 minutes of collection. The processing happens at Labcorp, a CLIA-certified clinical laboratory in the US, not at 23andMe.
The first thing the lab does with my spit is not read it. It is to set part of it aside, a reserve against failure, which already tells you something about how often chemistry misbehaves. Then extraction: the DNA is isolated from the cells in the sample, purified, and its concentration measured. The assay wants 200 ng of input DNA, which is far too little to detect directly, so the lab copies it, over and over: whole-genome amplification, running overnight. Then the copies are cut into small pieces by controlled enzymatic fragmentation, so the fragments can move freely and find their targets. Samples travel in batches of roughly 96, and the whole assay is a three-day workflow.
Notice what has not happened anywhere in that pipeline: reading. Nothing so far has determined a single letter of my genome. Everything up to here is preparation for a search.
04 · the lookup
The chip itself is a small glass slide holding millions of microscopic beads, and each bead is attached to a probe: a bit of DNA that matches one of the tested variants. A probe is a 50-base strand, covalently linked to its bead, built to be the complement of one exact spot in the genome. During an overnight hybridization, my amplified, fragmented DNA washes over all of them at once, and base-pairing does the rest: an A only bonds to a T, a C only to a G, and a fragment only settles stably onto a probe whose 50 letters complement its own.
I think of it as a content-addressable search. Nobody scans my genome for position 136,608,646 of chromosome 2. Instead the chip holds a 50-letter description of what the DNA right before that position looks like, and the matching fragment finds it, in parallel with hundreds of thousands of other lookups in the same bath. The arithmetic of why this works: there are 4^50 possible 50-base sequences, on the order of 10^30, against 3 billion positions in a genome. A well-chosen 50-mer has astronomical room to be unique.
One design detail carries the whole trick. For most SNPs the probe is built to end exactly one base before the variant position. The probe never covers the position it asks about. It walks right up to the door and stops.
Here is that lookup for a real question, at one of the most famous positions in my file:
grep -P '^rs4988235\t' genome_v5_Full.txt
rs4988235 2 136608646 AG
rs4988235 sits in an intron (a stretch inside a gene that does not code for protein) of the gene MCM6 on chromosome 2, upstream of the lactase gene, and it is the variant that associates with lactase persistence in European-ancestry cohorts: whether the ability to digest milk survives into adulthood. (Other populations got there separately: distinct variants nearby play the same role in East African and Middle Eastern groups, which is exactly why single-SNP readings do not travel well between populations.) Below is the real GRCh37 reference sequence around it, and a 50-base probe. Slide it. There is exactly one offset where every base pairs:
The probe finds its address by chemistry alone. What it cannot do is tell me what letter sits at the position it stopped in front of. That takes physics.
05 · the call
After hybridization, an enzyme performs single-base extension: it adds exactly one base to the probe's end, the base complementary to whatever my fragment carries at the variant position. The added base carries a label, and the labels come in two colors: A and T get one dye, read in the red channel; C and G get another, read in the green. Then a scanner reads the fluorescence intensities off the beads.
Sit with what the scanner actually outputs: not letters. Two numbers per SNP, a red intensity and a green intensity. If both of my copies carry A at some position, the red channel lights up and the green stays dark. Both G, the reverse. One of each, both channels glow at half strength. (Two of the letter pairings, A/T and G/C, would light the same channel for both alleles; about 17 percent of SNPs are like that and need a second bead type to disambiguate.)
Turning those numbers into letters is a statistical decision. Software performs the analysis and calls the genotypes from the intensities; 23andMe says only that a stringent algorithm makes the call, and that when it cannot make a confident one, the file records a "not determined" result: the '--'. The picture worth keeping is geometric. Samples with the same genotype land in the same region of intensity space, three clouds: both-A, both-G, one-of-each. A call is a decision about which cloud a dot belongs to, and an honest caller refuses to decide when the dot sits in between. Drag the dot yourself:
That refusal is where my 12,436 no-calls come from, and the lab manages it at the sample level too: if a sample yields data for fewer than 98.0 percent of tested markers, the lab goes back to the reserved saliva and tries again, and a second failure ships a free replacement kit.
So every letter in my file is an inference from two brightness measurements. My file's own header says as much, in a line I find quietly remarkable: "it is possible that data downloaded at different times may be different due to ongoing improvements in our ability to call genotypes." The measurements are fixed; the reading of them has a version number.
06 · the coordinates
One more layer before the file makes sense: where these positions actually are. The header states the convention: genotypes are reported on the plus strand of reference build 37, GRCh37, a specific published version of the human reference genome. Positions are relative to a build, and builds change. The same rs4988235 sits at chr2:136,608,646 in build 37 and at chr2:135,851,076 in build 38. The T2T consortium's complete, gapless assembly shifts coordinates yet again. The position is an address in one edition of a book that keeps getting re-typeset; the rsid is the stable name that survives every edition. That is why the file carries both.
The same question, two addresses:
| build | rs4988235 |
|---|---|
| GRCh37 | chr2:136,608,646 |
| GRCh38 | chr2:135,851,076 |
The strand convention hides a trap I fell into within an hour of opening the file. The lactase-persistence literature calls the rs4988235 variant C or T. My file says AG. Neither is wrong: DNA is double-stranded, every position has two complementary readings, and the MCM6 gene happens to be read from the minus strand, so papers about the gene use minus-strand letters while 23andMe always reports the plus strand. The literature's C is my file's G, the literature's T is my A. ClinVar's record for the lactase-persistence trait names A as the associated allele, in plus-strand terms, matching my file's alphabet. Cross-checking a consumer file against papers without doing this translation produces confident, backwards conclusions.
None of this needs to be taken on faith. The public databases answer live queries, from a browser, right now:
07 · what it isn't
The file is not a sequence. Genotyping determines which known variants you carry at a fixed list of positions; sequencing reads the stretch itself and can find things nobody has catalogued. Everything surprising in my genome that no chip designer thought to ask about is, by construction, absent from this file.
It is not medical data, and the file says so itself, in the header we already read in section 01: "this data is suitable only for research, educational, and informational use and not for medical or other use," with only a subset of markers individually validated for accuracy. That is the vendor's own disclaimer, and after walking the pipeline I read it less as legal cover and more as a fair summary of the error budget: no-calls, miscalls, and calls that a future algorithm revision will quietly change. If you want a per-call error rate, the file does not offer one; the disclaimer is as quantitative as it gets.
It is not even fully public in its vocabulary. 17,687 of my rows carry identifiers starting with i instead of rs: 23andMe-internal ids for probes without a clean rsid, which generally will not match outside literature or third-party tools. Those questions, only 23andMe can interpret.
And it is not immutable. The letters are inferences, the inference software improves, and a re-download can differ from the last one. What I actually own is 643,161 answers to 643,161 well-chosen multiple-choice questions, called from brightness measurements, addressed by a coordinate system that keeps shifting, in an alphabet that is one strand-flip away from the literature.
Which raises the question the second post answers: if that is all the file is, how does it manage to say so much about me? Ancestry painted onto chromosome segments, traits checked against my actual body, and the honest limits of both: what the file says about me.