A colleague sent me a PCA plot last week. Three replicates per condition, control vs KO of a gene. PC1 cleanly separated replicate 1 from replicate 2 from replicate 3. PC2 separated control vs KO. The question that followed: should we run limma::removeBatchEffect() before differential expression? The answer is “it depends,” and most of the time the answer is “no, do not…
Almost three years ago I wrote Has AI Changed the Course of Drug Development? . The post was cautiously skeptical. AlphaFold was the headline. BenevolentAI had just flopped a Phase 2a in atopic dermatitis. Verge Genomics’ VRG50635 was about to enter the clinic. I argued that data quality was the real bottleneck, not algorithms. Time to revisit that. I now lead epigenomics bioinformatics at…
My first blog post in a long time! I wanted an AI assistant that knew me. Knew my research. Knew my content calendar. Knew that when I say “write a thread about batch effects,” I mean single-cell RNA-seq batch effects with Harmony and Seurat code, for an audience of computational biologists who already know what a UMAP is. So I built Helix. An OpenClaw agent running on a Mac Mini in my…
I started to learn bioinformatics because I needed to analyze public ChIP-seq data in 2012. That’s how I got to know Shirley Liu’s lab at Dana-Farber Cancer Institute. And God knows that I would join her group in 2020 for a staff scientist position to lead the CIDC bioinformatic project . I witnessed the development of many groundbreaking computational tools for genomics in…
During my work with single-cell RNA-seq data, I’ve often encountered confusion about PCA and specifically when to use the center and scale arguments in R’s prcomp() function. While tools like Seurat’s RunPCA() abstract away these details, understanding what happens under the hood is crucial for proper analysis and troubleshooting. In this post, I’ll show you exactly what center and scale do, why…
To not miss a post like this, sign up for my newsletter to learn computational biology and bioinformatics. In this blog post, I am going to show you how to use list column and purrr::map() , a powerful toolkit in your belt to avoid repetition in your bioinformatics analysis. To demonstrate the usage, We will use RNAseq differential expression analysis and pathway enrichment analysis as an example.…
Hey everyone, it’s Tommy here. If you’ve been following my blog or my Twitter/X ( @tangming2005 ), you know I love diving into the practical side of bioinformatics and genomics. Recently, I gave a talk titled “Good Enough Practices for Reproducible Computing” at Moderna, where I spent a good chunk of time chatting about reproducible computing. Why? Because in our field, where data is exploding and…
We’re bringing a podcast to the conversation: AI on the Hill — and our very first episode is now live! In this show, host René Bastón sits down with 🎯 Ming “Tommy” Tang, a first-gen PhD who arrived in the U.S. with just $2,000 and a dream. Through grit, coding, and a passion for open science, he transformed his career — and became a voice for how AI is reshaping drug discovery. They…
To not miss a post like this, sign up for my newsletter to learn computational biology and bioinformatics. Introduction to Annotation Data Packages in Bioconductor Accurate gene and transcript annotation is the foundation of many bioinformatics workflows, including RNA-seq analysis, functional genomics, and variant annotation. In the R/Bioconductor ecosystem, dedicated annotation data packages…
To not miss a post like this, sign up for my newsletter to learn computational biology and bioinformatics. AI is transforming every field — and bioinformatics is no exception. From designing drug molecules in minutes to writing entire pipelines, generative AI is making it faster than ever to process biological data. But here’s the truth: AI doesn’t understand biology — you do. That’s why, in this…