Tommy Carstensen

Bioinformatician · data scientist · Copenhagen

Human genetics at population scale, and the methods that make it computable: reference panels for African populations at the Wellcome Sanger Institute, deep learning on UK Biobank health records, and clinical machine learning on national registry data.

Research

Seven years at the Wellcome Sanger Institute on the African Genome Variation Project and the Uganda Genome Resource: whole-genome sequence from thousands of individuals, and a haplotype reference panel for a continent that reference panels had largely skipped. Then deep learning on UK Biobank electronic health records at Queen Mary University of London, two years of data science at Novo Nordisk, and now clinical machine learning with the Benros group in Copenhagen, on national registry and EHR data.

full list on Google Scholar

Software

Registry-scale data breaks the standard statistical packages long before the statistics stop being valid. These implement the same estimators without holding the table in memory.

coxstream

Exact out-of-core Cox proportional hazards regression. Each Newton–Raphson step becomes a sum over parquet row groups, so peak memory is one row group plus O(p²) state rather than the whole table. The estimates stay exact: coefficients agree with R's survival::coxph to 2e-14 at two million rows, and with lifelines to 3e-14 on data rounded to 120 distinct event times, where ties necessarily straddle chunk boundaries. Standard errors agree to 2e-13.

pip install coxstream CRAN R source doi:10.5281/zenodo.20693783

renew-glm

Streaming generalized linear models with bounded memory, implementing the renewable estimation of Luo and Song (2020). One pass per iteration accumulates the sufficient statistics, so the streaming path holds one chunk plus O(p²) state, independent of the number of rows. The chunk-buffered path trades that for standard errors. Gaussian, binomial and Poisson, checked against statsmodels in the test suite.

pip install renew-glm doi:10.5281/zenodo.21950314

PlotPick

Recovers the numbers behind published figures. Upload images, PDFs or ZIPs and it reads boxplots, bar charts and line plots back into structured tables. Benchmarked against ChartX and PlotQA with Claude, GPT, Gemini and DePlot baselines.

hosted app (Streamlit sign-in)

Talks

Upstream

Reports and fixes accepted into the tools this work depends on.

  • polars #27860 Reported with a reproducer at 200 million rows: parquet min/max statistics exclude NaN while polars orders NaN as the largest value, so float >= filters could never skip row groups. Labelled accepted upstream; the nan_count-gated fix is verified locally and not yet merged.
  • samtools/bcftools Six merged pull requests: error messages that name the accepted types and options, and documentation corrections for the two-VCF-input statistics.
  • biopython Merged: modified residue 4BF now maps to phenylalanine rather than tyrosine.