Try it: fill in the blanks · a worked example
A home DNA kit reads only some of the markers that go into a breast cancer risk score. The rest are blank. This worked example shows how FastImpute fills them in.
Each tile is one marker, a single position in the DNA called a SNP. A tile’s genotype is the pair of letters a person carries at that position, one from each parent. The 24 tiles below are a real segment of chromosome 1, taken in order from the sample 23andMe file in the FastImpute code repository (file test_files/11576.23andme.9465.txt, from the project’s own MIT-licensed repo). Every tile is labeled with its strip position (pos 1 to pos 24) and its marker name, an rs number such as rs3131972.
Worked example with prewritten answers. No model runs on this page. Sixteen tiles show the genotypes the sample file really carries. Eight tiles are blanked out, and the Impute button fills each blank with a prewritten guess. Reveal then shows the true genotype from the file beside each guess, with a tick or a cross, so you can count the score yourself. The confidence under each guess is an illustrative value written for this example. It is not output from a model.
Teaching scale: the real score, PRS313, uses 313 markers. A home kit measures 77 of them and leaves 236 blank (75 percent). This strip blanks 8 of 24 (33 percent) so the whole idea fits on one screen.
Reveal unlocks after imputing.
The paper’s result, for comparison
PRS-score R2 against sequencing, overall breast cancer, from the paper’s test set of 501 people. R2 says how closely the score built from filled-in markers tracks the score built from true sequencing. 1.0 is perfect.
FastImpute, R2 = 0.86
Frequency-based baseline (the paper’s no-imputation and MAF-imputation scores), R2 = 0.38
Beagle, the standard tool, R2 = 0.95
These are the paper’s published evaluation numbers, not a result computed from your strip. Note: the code repository’s README still carries the earlier preprint baseline numbers (0.33 for no imputation, 0.28 for MAF imputation). The bars above use the published paper’s numbers.
The strip above is a worked example with prewritten answers. The real tool runs the full model in your browser: Open the live FastImpute app. You will need a 23andMe file, or use the default file the app offers on its first screen. Nothing you load there leaves your device.
A breast cancer risk score needs 313 DNA markers. A home DNA kit measures 77 of them. FastImpute predicts the rest, in your browser, without your genome ever leaving your device.
Genotype imputation is how geneticists fill in the markers a DNA test did not measure, by learning the patterns that link nearby markers. The standard tools do it on servers, which means uploading one of the most private files a person owns and waiting in a queue. At the National Cancer Institute I built FastImpute, a workflow that trains small, simple models to do the same job on the device in front of you. For a breast cancer risk score built from 313 markers, most of which a 23andMe kit never reads, scores from FastImpute's imputed markers track the scores from full sequencing closely (R2 = 0.86). The paper reports that the web app runs 1,000 simulations in under 10 seconds on the user’s own machine. The worked example at the top of this page shows the shape of the problem on a short, real strip of chromosome 1.
The setup
A polygenic risk score adds up hundreds of small genetic nudges into one number that shifts a person's place in a risk distribution. PRS313_BC is the worked example here: a published score (PGS Catalog PGS000004) built from 313 markers.
The catch is in the chip. Of the 313 SNPs in PRS313_BC, only 77 are on the 23andMe V5 chip. The other 236 are missing from a customer's file and have to be predicted. That count comes from 119 public 23andMe V5 files on OpenSNP.
Presenting problem
Server imputation costs privacy and time: upload the genome, wait for the queue, trust the operator. Deep learning imputation models protect privacy better but are too large to run on a phone or a laptop browser, and expensive to retrain for a new region.
The gap was a baseline: nothing small, open, and client-side existed that others could build on. FastImpute is stated the way the paper states it, as a baseline and a workflow, not a claim to beat the standard tool.
What I built
A four-step workflow: gather public sequencing data, cut it down to the markers a consumer chip actually reads, pick the chip markers that travel with each target marker (linkage disequilibrium), and train one small model per chromosome to predict the targets.
The models are deliberately simple: linear and logistic regression, not a neural network, so the finished model is tiny, fast, and cheap to retrain for another score or another chip. In total there are 44 small models, one linear regression (unphased data) and one logistic regression (phased data) per chromosome for 22 chromosomes. The linear model is the one deployed on the web.
And a working web app, not just code: upload a 23andMe file and get five breast cancer phenotype scores (Overall Breast Cancer, ER-positive, ER-negative, hybrid ER-positive, hybrid ER-negative), each with summary statistics and a histogram, all computed locally.
Workup
Markers only predict their chromosomal neighbours, so 22 small models beat one large one and keep each model small. As a general point, a marker whose variant is rare is harder to predict than a common one, because its neighbours carry less information about it.
Where a file is missing some of the model's input markers, the app fills those inputs by simulation draws from population allele frequencies before imputing, and runs the model many times. That is why the score is reported as a distribution, with histograms, instead of one number. The paper reports that the web app runs 1,000 simulations in under 10 seconds on the user's own machine.
Validation used held-out 1000 Genomes sequencing: whole genome sequencing from 2,504 people, split 2,003 training and 501 testing, scored against the true sequenced genotypes, and benchmarked against Beagle 5.4 run on the same test set.
Discharge summary
A risk score built from the imputed genotypes tracks the score from true sequencing at R2 = 0.86. Guessing from allele frequencies alone, or skipping imputation, gives R2 = 0.38. Beagle, the standard tool, reaches R2 = 0.95 on the same score.
At the top of the distribution the difference matters most. Among the 6 test subjects in the top 1 percent of risk, the logistic model found 4, matching Beagle's 4; the deployed linear model found 3; frequency guessing found 1.
Published in The Open Bioinformatics Journal in 2026, with Aaron Ge as first author and corresponding author. Paper: DOI 10.2174/0118750362421210250929110508. Code: github.com/aaronge-2020/FastImpute. Live tool: aaronge-2020.github.io/FastImpute.
What I’d do differently
The chip panel was reconstructed from 119 public files, which is a thin stand-in for what the testing companies hold. The score is not calibrated by ancestry group, and linkage patterns differ across populations, so per-population models are the obvious next step. And the feature window, plus or minus 500 kb around each target, was a size choice: a wider window might buy accuracy at the cost of the small footprint that makes the tool deployable.