MoreRSS

site iconDynomightModify

Dynomight is a SF-rationalist-substack-adjacent blogger with a good understanding of statistics.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of Dynomight

Pseudpocalypse

2026-07-14 08:00:00

Here’s a conjecture: If you put any significant amount of text on the internet under different names, those identities can be linked using only the text itself. This is possible (I conject) because of the statistical “fingerprint” you leave in everything you write.

Imagine a website where you can paste in some brand-new text someone just wrote. In return, the website provides links to all the text that writer has ever published under any name. It’s not perfect, but it’s pretty good. As far as I know, no such website exists—at least not on the public internet. But I suspect it’s possible and will soon become easy. This will pose some difficulty for pseudonymous blogging.

Note: I wrote most of this essay in mid-2025, after which I idiotically sat on it for a year tinkering with theorem statements that none of you will read.1 In the meantime, LLMs have gotten much better at guessing authors from text. (Given the first 1000 words of a draft of this post, Claude 4.8 knows it’s me.) Still, I think we’re just getting started. I expect to see increasingly obscure writers identified from increasingly small bits of text. I expect that this work even when people are writing in a different register or about unrelated subjects. And I expect that everything I’ve ever written under any pseudonym will soon be linked to my genuine-nym.2

A stronger conjecture is that we’re heading towards a sort of generalized pseudpocalypse. Perhaps, in the future, if you interact with the world through essentially any high-bandwidth channel, then you identify yourself. Say you wear a mask in public and only speak by sub-vocalizing into a voice changer. That’s fine, you’ll still be identified using your body shape, gait, or chemical signature. Or say you don’t like your car being tracked everywhere, so you stop carrying a phone and you somehow convince lawmakers to ban license plates. No problem, your car will still be tracked using tiny scratches or unique pinging sounds from the engine. Or say you don’t like being tracked on the internet, so you lock down your browser profile, buy stuff only with Monero, and connect through a chain of three VPNs. That’s OK. You’ll still be identified through how you wiggle your finger as you scroll down the page. We’re all just too unique, and the information theoretic limit is coming for us.

Starting bits

Let’s start from first principles. Imagine that at birth, everyone is assigned a random binary string. Whenever you post anything on the internet, you’re required to sign it with that string. If the strings are very short, like 0110, then lots of other people will have the same one as you. But if the strings are very long, then yours would almost certainly be unique and it would be trivial to link all your pseudonyms.

Where’s the transition point? If you only know that the author is currently alive and living somewhere in the Anglosphere, it’s around 29 bits. That’s because if there are K digits, then there are 2ᴷ possible binary strings, and if K = 28.86, then 2ᴷ ≈ 490,000,000 is the number of currently-alive Anglosphere-dwellers. If the strings have fewer than 29 bits, then someone else will probably share your string. If they have more than 29 bits, then your string is probably unique.

We don’t (yet?) have to sign the things we write with immutable government-issued strings. But the way you write still provides lots of clues about you by way of your tone, personality, word choice, and so on.

Theoretically speaking, I think it has to be possible to link the identities of anyone who writes enough. Imagine again that everyone is assigned a random binary string at birth, but instead of you needing to sign the stuff you write with your string, each time you write a word, there’s some chance that a random bit from your string is revealed and added as a signature to your message. For example, maybe a signature of bit[129]=1 is added, indicating that your string at position 129 has value 1.

Think of your string as representing all your writing style quirks, and a bit being revealed as representing when you write something that reveals a preference. For example, maybe bit 18 indicates if you prefer to write your em-dashes with hideous spaces — like this — or without spaces—like this. If you use an em-dash, that bit is revealed.

So imagine you’ve written a lot under Pseudonym A, enough that the full bit-string has been revealed. Maybe it’s this:

Pseudonym A: 
110000001111001101110000100001
010100100101011110111001101000
100111110010101001101010111010

Now say you start writing under Pseudonym B. Initially, none of the bits will be known:

Pseudonym B: 
??????????????????????????????
??????????????????????????????
??????????????????????????????

But slowly, you’ll start to leak a few bits:

Pseudonym B:
?????00???1????1????????1??0??
?????01??1?????????11????01???
???1??????1???10??????????????

And eventually you’ll leak a lot of bits:

Pseudonym B:
???0?00?1?11??110??1????10?0??
?10?001?0101?11???11100?101???
???11?1??010??10?1?01??011????

Now think about this from the perspective of an “attacker” who wants to know if A and B are the same person. Let’s assume they’ve only seen the above bits, and have no information about anyone else. Then here’s what the attacker knows:

  1. A and B have revealed K overlapping bits, which all match.
  2. Different people have a 50% chance of matching on any given revealed bit.
  3. Non-different people have a 100% chance of matching on any given revealed bit.
  4. There are 490,000,000 people.

Intuitively, if K was 5, then the fact that all bits match wouldn’t prove much, since with 490 million people, lots of people would match on those bits by chance. But if K was 70, it’s extremely unlikely that two different people would share all of them, even with such a gigantic pool to start with. It turns out that if there are N other people with random bits, and you pick K of your bits, the probability that someone exists who matches all of them is 1 - (1-2⁻ᴷ)ᴺ. When N is 490 million, that looks like this:

Look at that, 29 appears again. (Isn’t math wonderful?) In general, the transition happens around whatever number of bits K makes 2ᴷ ≈ N, namely K = log₂(N).

If you reveal significantly fewer than 29 bits under pseudonym B, then it’s almost guaranteed that there’s someone else out there who matches all of them. But if you reveal significantly more than 29 bits, then there’s almost no chance that anyone else exists who matches all of them. So the attacker essentially knows that A and B are the same person. And I stress again: They know that without needing to see anything from the other 490 million people.

Of course, we don’t literally leak bits of immutable feature strings as we write. But you can make the model more realistic, and the same issue persists. If you want to reflect that text only provides noisy information about the writer, then you can add noise to the bits before they’re revealed. If you want to reflect that some writing styles are more common than others, then you can make the distribution over bit strings non-uniform. If you want to reflect that certain quirks are more obvious than others, you can give different bits different probabilities of being revealed. All these make the math more complicated. But they don’t change the basic conclusion: If your writing style contains at least 29 bits of information, and you do enough writing, you’re done.

That’s my argument that pseudpocalypse is possible. But I don’t just want to claim that it could happen, eventually. I think it is likely to happen, soon, and that the amount of text you need to reveal isn’t very large. To make that argument, we need to get specific: What features do people have that are reflected in their writing? How many bits of information do those features contain? How accurately can those bits be guessed from written text?

Note: To avoid this turning into a giant information theory lecture, I’ll mostly use words like “bit” and “information” without being 100% fully precise about what they mean. I’m doing that because I expect that most people reading this aren’t definition-of-bit fetishists, and anyway being hyper-technical would obscure the big picture. If you’re an information theory enthusiast and/or skeptical that I know what I’m doing, I refer you to the Section For Skeptical Information Theory Enthusiasts, below. Until then, use your intuition and have faith.

Feature space

Say you knew nothing about me other than that I wrote the above words. And say you had to guess my age or religion or occupation. You could guess, right? It wouldn’t be perfect, but you’d do much better than you would without being able to read those words. Thus, somehow, those words contain information about my demographic characteristics. So I tried to make a list of similar things that you could plausibly guess from text at least somewhat better then chance. Here’s what I came up with:

  • Age
  • Education
  • Ethnicity
  • Family status
  • Income
  • Marital status
  • Mental health
  • Native language
  • Occupation
  • Physical health
  • Political leanings
  • Region
  • Religious affiliation
  • Sex

In the same spirit, if you only read the above words, could you guess how extroverted or conscientious I am? Again, not perfectly. (When I meet people who read this blog, they usually seem surprised I can survive direct sunlight.) But still, I’m sure you’d do OK. So, again, these words contain information about my personality.

What features does personality have? The HEXACO model lists six, namely honesty-humility, emotionality, extraversion, agreeableness, conscientiousness, and openness to experience. I suspect those can all be guessed with reasonable accuracy from a long-enough writing sample. But could you guess more? For each of those six factors, the HEXACO model lists four “facets”. In the abstract, trying to guess 6 × 4 = 24 different personality features from text sounds ludicrous, but just look at them:

  • Honesty-humility
    • Sincerity
    • Fairness
    • Greed avoidance
    • Modesty
  • Emotionality
    • Fearfulness
    • Anxiety
    • Dependence
    • Sentimentality
  • Extraversion
    • Social self-esteem
    • Social boldness
    • Sociability
    • Liveliness
  • Agreeableness
    • Forgivingness
    • Gentleness
    • Flexibility
    • Patience
  • Conscientiousness
    • Organization
    • Diligence
    • Perfectionism
    • Prudence
  • Openness to experience
    • Aesthetic appreciation
    • Inquisitiveness
    • Creativity
    • Unconventionality

If you think about specific people, I think you can convince yourself that these 24 represent real things, and that it’s plausible to guess them from text. (Your favorite existential angst + science blogger, for example, might score lower on “modesty” than the other honesty-humility facets.) The different sub-factors are surely correlated, but not perfectly correlated.

Of course, the biggest thing you learn from people’s writing is how they write. Do they tend to pointlessly split infinitives? Do they use hyphen-connected words? Do they, incorrectly, position their adverbial clauses?

The idea of attributing authorship using writing style features goes back to at least 1440, when Lorenzo Valla demonstrated that the Donation of Constantine—in which Emperor Constantine supposedly donated the Roman Empire to the Catholic Church—used a vernacular that came from 400 years after Constantine’s death and was therefore a forgery. In 1851, Augustus De Morgan observed that average word length tends to be stable for the same author. The first “modern” attempt seemingly came in 1964, when Mosteller and Wallace published Inference in an Authorship Problem:

This study [attempts] to solve the authorship question of The Federalist papers; […]

Word counts are the variables used for discrimination. Since the topic written about heavily influences the rate with which a word is used, care in selection of words is necessary. The filler words of the language such as an, of, and upon, and, more generally, articles, preposition, and conjunctions provide fairly stable rates, whereas more meaningful words like war, executive, and legislature do not.

After an investigation of the distribution of these counts, the authors execute an analysis […] based on Bayesian methods. The conclusions about the authorship problem are that Madison rather than Hamilton wrote all 12 of the disputed papers.

Get that? The idea is that your usage of the word war depends mostly on if you happen to be talking about war. But your usage of upon mostly depends mostly on how much you like the word upon. To demonstrate this, they took 48 papers written by Hamilton and 50 by Madison and made this table of how many times they used by, from, and to:

Madison liked by. Hamilton was more a to man. Using these kinds of statistics, they concluded that the disputed Federalist papers must have been written by Madison.

So I did some research looking for other writing style features that are believed to be stable when people write about different subjects. I found that there are a lot. There were so many that I struggle to even organize them into meaningful groups:

Low-level frequencies:

  • Word lengths
  • Sentence lengths
  • Paragraph lengths
  • Punctuation frequencies (commas, colons, dashes, parentheses)
  • Function word frequencies (the, of, and, to)
  • Adverb frequencies
    • Intensifiers (very, really, quite, pretty, so)
    • Evidential markers (apparently, evidently, obviously)
    • Downtoners (somewhat, fairly, rather)
  • Pronoun usage
    • Overall preferences (I/we vs. you vs. he/she/they)
    • Third-person singular preferences (he, she, he or she, they, one)
  • Modal verbs (can, could, might, must, should, will, would)
  • Hedges (perhaps, maybe, possibly, probably)
  • Conjunctions (and, but, yet, so)
  • Known stable ratios (the/a, this/that, these/those, I/me/my)
  • Character N-grams (3-grams and 4-grams)
  • Word N-grams (often 3-grams)

Lexical features:

  • Vocabulary size
  • Lexical diversity / type-token ratio (Number of distinct words divided by number of words.)
  • Frequencies of rare words
  • Semantic density
  • Discourse marker positions, combinations (So, anyway, so anyway)
  • Use of abbreviations and acronyms
  • Preference for latinate vs. germanic words (The majestic creature traversed the terrain vs. the mighty beast strode across the land.)

Syntactic features:

  • Syntactic complexity
    • Subordination index
    • Average parse tree depth
  • Use of passive voice.
  • Nominalization (She was shocked I ate the pizza vs. My pizza consumption shocked her)
  • Verb tense and aspect (I walk vs I walked vs I was walking vs I have walked)
  • Sentence structure preferences:
    • Branching preferences (Cursed everyone had a good time when Alice taught some cool dogs I met and brought to dinner to juggle vs. clumsy-but-readable I met some dogs and they were cool and I took them to dinner and Alice taught them to juggle and and everyone had a good time.)
    • Adverbial clause positioning (Suddenly I was hungry vs. I was, suddenly, hungry vs. I was hungry, suddenly)
    • Sentence-final weight (Your plan won’t work because of the dyslexic bears vs. Dyslexic bears mean your plan won’t work.)
  • Polysyndeton (I like dogs, cats, and ferrets vs. I like dogs and cats and ferrets.)
  • Repetition / breaking of syntactic structures.

Style features:

  • Register / formality.
  • Patterns in sentence length (long/short/long/short vs. long/long/short/short)
  • Stressed syllable interval preferences (e.g. iambic vs. trochaic)

Rule preference features:

  • Minor punctuation (I laughed—you cried vs. I laughed — you cried, “…” (three periods) vs. “…” an actual ellipsis)
  • Capitalization. (Job titles, seasons, after a colon, mistakes)
  • Apostrophes (Steve Jobs’ car vs Steve Jobs’s car, 1990’s vs 1990s)
  • Hyphenation (a highly-stable feature vs a highly stable feature)
  • Oxford commas.
  • Article omissions (Local dog was petted. vs. A local dog was petted.)
  • Relative pronoun omissions (the dog you petted vs. the dog that you petted)
  • Who vs. whom.
  • Split infinitives (To obsessively blog vs. to blog obsessively)

Idiosyncratic features:

  • Whitespace habits.
  • Spelling errors (loose instead of lose)
  • Grammar errors. (Between you and I)
  • Consistent, unique typos
  • Other consistent errors (repeated words, un-closed parentheses)

That’s a lot. There are surely more. And these are all “shallow” features that humans came up with using our tiny little brains. I strongly suspect that there are many more “deep” features that could be found by looking for statistical patterns in a sufficiently large dataset. Many of those features might not even have a coherent English-language description. But they’re still there, providing bits for those who seek them.

So we leak information about lots of different stuff when we write. But how much information? Is it possible to say how many words are needed to uniquely fingerprint someone?

No. To a first approximation, the answer is no. But to a second approximation, maybe? Within an order of magnitude? I’ll try, but it’s going to be hard.

Demographic bits

How many bits of identifying information does text provide by way of demographic features like age and sex and so on?

At first glance, this seems a perilous question, as it depends on the number of categories you consider those things to have. Take sex. For pseudpocalypse purposes, your opinion about how sex should be defined or how many sexes exist is irrelevant. Finer categorizations always provide more information, and our de-pseudonymizing attacker friends will use that information if they can. However, going beyond two categories for sex makes little difference, because the additional categories will be hard to guess and even if you could, categories with low prevalence don’t contribute much extra information.3 So, for us, two categories is the right answer.

And what about age? At first glance, converting age into a set of categories seems meaningless. If you code age by the millisecond, then there are 3.156 trillion categories for people born in the last 100 years. If you code age by the decade, there are only 10. Here, the thing to notice is that while you might be able to guess my decade of birth from how I write, you don’t have a snowball’s chance in hell of guessing the millisecond. (See what I did there? People born in certain decades are more likely to use expressions like snowball’s chance in hell?4) If we took age to have some crazy number of categories, we’d have to discount later to reflect the difficulty of guessing. My intuition is that it would be hard to guess age more accurately than around five years, so 20 categories seems reasonable.

Following this kind of logic, I chose a number of categories for each of the demographic variables, trying to hit the upper end of what could be guessed from text. (I’ll provide the actual categories below.)

Feature Number of categories
Age 20
Education level 6
Ethnicity 6
Family status 2
Income 11
Marital status 3
Mental health 3
Native language 2
Occupation 23
Physical health 3
Political leanings 3
Region 23
Religious affiliation 3
Sex 2

If each of the age bins were equally likely, then knowing what bin someone fell into would provide 4.32 bits of information, because 2ᴷ ≈ 20 when K = 4.32. Doing that same calculation for each feature gives the maximum amount of information they could contain.

Feature Number of categories Maximum bits
Age 20 4.32
Education level 6 2.58
Ethnicity 6 2.58
Family status 2 1
Income 11 3.46
Marital status 3 1.58
Mental health 3 1.58
Native language 2 1
Occupation 23 4.52
Physical health 3 1.58
Political leanings 3 1.58
Region 23 4.52
Religious affiliation 3 1.58
Sex 2 1
Total   32.88

But there’s a problem. There are more people aged 30-35 than there are people aged 90-95. So, even if you could guess those age bins perfectly, they’d provide less than 4.32 bits of information on average. However, it turns out that categories need to get pretty damned uneven before information content drops very much. A perfectly balanced 50/50 distribution provides 1 bit of information, but if you switch to a 60/40 distribution, you still get 0.971 bits, and you need to go almost to 90/10 before information content drops to 0.5 bits.5 The same basic thing is true when there are more than two categories.6

So I went through all those features, rated them by how unevenly people are distributed, and tried to discount the bits accordingly. I’ve put the full details of what the original categories are and how I discounted them in a footnote.7

Feature Number of categories Maximum bits Estimated bits
Age 20 4.32 3.9
Education level 6 2.58 2.1
Ethnicity 6 2.58 1.7
Family status 2 1 0.8
Income 11 3.46 2.5
Marital status 3 1.58 1.2
Mental health 3 1.58 0.9
Native language 2 1 0.6
Occupation 23 4.52 4.0
Physical health 3 1.58 1.3
Political leanings 3 1.58 1.5
Region 23 4.52 3.5
Religious affiliation 3 1.58 1.5
Sex 2 1 1
Total   32.88 26.5

But there’s another problem. Female 65 to 70 year-old Asians living in Scotland tend to have different {occupations, family statuses, religious affiliations} than 15 to 20 year-old Latinos living in Southeast Australia. That is, the above features are correlated. So as you look at more of them, they gradually become less surprising and thus contribute less information.

How much less? Answering that the right way would require us to estimate how likely someone is to fall into each of the 20 × 6 × 6 × 2 × 11 × 3 × 3 × 2 × 23 × 3 × 3 × 23 × 3 × 2 = 8,144,737,920 joint categories. That seems hard. But a not-completely-ridiculous approximation is that if a group of variables are all pairwise correlated at a level of ρ>0, then the total information might be reduced by a fraction of ρ.8

So how correlated are those features? In the social sciences, a correlation of 0.5 is considered quite high. That’s plausible for some pairs of variables, e.g. age vs. health or political leaning vs. religious affiliation. But many of those correlations are are probably quite weak, e.g. age vs. native language or region vs. sex vs. marital status.9

Overall, my guess is that correlations reduce the total information by at least 10% but I doubt they reduce it by more than 60%. So I’d think the total information in the above features (if you could guess the categories perfectly) is somewhere between 10.6 and 23.9 bits. Let’s take the average and call it 17.2 bits.

Personality bits

What about personality features? Let’s use the same same recipe we used for demographic features, but faster: To start, let’s give each of the 24 personality features five bins, in deference to dynomight personality notation. That would correspond to 24 × 2.32 = 55.68 bits total, because 2ᴷ ≈ 5 when K = 2.32.

Then we need to discount for correlations. The six main HEXACO personality factors are designed to be uncorrelated, but the different “facets” inside each factor are correlated (usually with a coefficient between 0.3 and 0.6). It seems reasonable to use an overall discount factor of 0.3 to reflect strong intra-factor correlations but weak inter-factor correlations. That suggests 39.0 bits overall.

Style bits

And what about writing style features? How much information do they contain?

This seems hard. Some of the features, like character n-grams are actually themselves long lists of features. (Frequency of typing aaa, frequency of typing aab, etc.) However, many of those features contain little information, since almost everyone types zqx around 0% of the time. And, of course, writing style features are correlated, since people who write realise instead of realize are less likely to put spaces around their em-dashes.

In absence of a better idea, I’m going to give one bit for each leaf node in the above list of style features. I think of this as giving each feature two bins, and then assuming that uneven distributions of features and correlations (which reduce information) are canceled out by the fact that many features deserve more than one bin and that there are probably more “deep” features that aren’t listed (which increase information). This gives us the suspiciously round number of 50.0 bits.

Guessing bits

If you believe the above numbers, then we have at least 17.2 + 39.0 + 50.0 = 106.2 bits of identifying information that we leave clues about when we write. That’s a lot. If you could see all those features, it would be enough to identify people even on a planet with 93 million trillion trillion people.

But to argue that the pseudpocalypse is nigh, it’s not enough to argue that those bits exist. We need to argue that they can and will be guessed from a relatively small amount of text.

So obviously we need to talk about nuclear weapons. In a nuclear detonation, many unstable atoms are created. These spontaneously decay into more-stable atoms, in the process emitting radiation. Some types of atoms are very eager to decay, meaning they release a lot of radiation but stop existing within a few weeks (iodine-131). Others are reluctant to decay, meaning they don’t release as much radiation but they stick around for decades (strontium-90). Others stick around for millions of years, but they produce so little radiation that they’re not a big problem (cesium-135).10 So, the residual radiation produced after a nuclear detonation is the sum of many different exponential curves, one for each isotope created during the detonation.

I suspect that identifying bits in text are sort of like that. Your level of formality and your average sentence length are revealed almost immediately. Your preference for latinate vs. germanic words takes a while to come through. And your social boldness and the fact that you live in Queensland rather than Southeast Australia are revealed very slowly, perhaps so slowly that it’s effectively not revealed at all.

Right. So if you start with 106.2 bits, how many of those do you reveal after writing a given number of words?

I will answer that question through the noble method of making up numbers. But first, let’s calibrate. You just read 4500 words written by me. How well could you guess my demographic and personality features? As a sanity check, I gave the above words to an LLM and asked it to guess. It did unnervingly well. It wasn’t always right, but it usually was, and it did a great job of rating the confidence of the individual predictions.

I don’t think there’s any magical explanation for this. The fact is, if you look at the individual personality and demographic features, guessing them just isn’t that hard. So I’m sure you could do just as well. And given enough time, I’m pretty sure you’d do even better for writing style features.

Even so, you’re probably bad at it. Take the example of GeoGuessr, where people guess a location in the world from a random photo. Random people are sort of OK, but if you pick the top natural talents and have them practice obsessively, they’re really good. I don’t think LLMs are particularly good at guessing features from text, either. They weren’t trained for it. It’s just an emergent property of their general intelligence. The information-theoretic limit is surely much higher.

So here’s a very rough cut: After 4500 words, I’d think it’s possible to guess around:

  • 60% of the demographic features
  • 70% of the personality features
  • 80% writing style features

If we model each of those with a separate exponential, and start them at 17.2 / 39.0 / 50.0 bits, then the total number of identifying bits that remain hidden after writing a given number of words is as plotted here:11

Et voilà, pseudonymity is compromised when you leak 29 bits, which happens after 1071 words.

Seriously?

Of course not. The above figure stands on a creaking tower of tenuous assumptions. I’ve gone through the details of deriving that curve not because you should trust it, but because I think seeing the calculations makes the following points hard to argue with:

  • You have far more than 29 bits of identifying information that you leak into your writing.
  • Some of those bits take a long time to get revealed, but others are revealed pretty quickly.
  • There are enough “fast leaking bits” that you can be identified from a writing sample that’s “pretty small”.

I’ve made lots of debatable choices in terms of choosing features, assigning numbers of categories, estimating distributions across those categories, discounting for correlations, and guessing how many bins can be guessed. Those choices are all individually suspect. But the above points are supported by a pretty wide margin of error. You can make different choices, but it seems very hard to avoid concluding that the above three points are true.12

How would this work?

You might be wondering why I’m using so many made-up numbers. After all, there’s a whole field devoted to identifying authors from text, usually called “stylometry” or “authorship attribution”. They have research papers and competitions and all that. However, as best I can tell, state of the art published results look something like this:

  1. Take 50 people.
  2. Get a few hundred writing samples from each author, each 1000-2000 words long.
  3. Now, take a new writing sample from one of those authors.
  4. Do some standard machine learning stuff.
  5. Hey look, the author can be identified with ~95% accuracy!

That sounds OK, but that’s only identifying people against a pool of ~50 authors. For my claim to be true, similar accuracy would have to be possible with 490 million people. That’s seven orders of magnitude more.

The thing is, the methods those papers are using are extremely weak. All the above math assumes that you’re operating at the “information-theoretic limit”, making perfect use of all available information. If you want to get close to that, we now have some idea how to do it: You apply the “modern” machine learning recipe of gigantic dataset + gigantic neural network + gigantic fortune spent on GPUs. My guess is that for us, that would require something on the order of “all the words ever written” + “tens of billions of parameters” + “tens of millions of dollars”. I couldn’t find a single paper that came remotely close to attempting that.

So I don’t think those papers tell us much, for the same reason that a 3rd-order Markov model trained on a few books doesn’t tell us much about how good computers could be at writing text. LLMs have shown that if you use the above recipe, then computers can get close to the information-theoretic limit for generating text.13 So, I suspect that an LLM-level effort could achieve the same thing for identifying authors.

You might also wonder: Why am I talking about this as some possible future technology? Isn’t that technology just LLMs?

I suspect the technology will be quite LLM-like in how it models human language. But current general-purpose LLMs aren’t trained for this task. They’re good at it “by accident”. So, just like specialized chess AIs can crush LLMs at chess, I suspect specialized stylometry methods could crush general-purpose LLMs at stylometry. It’s just that those specialized stylometry methods don’t seem to exist yet, or at least aren’t public.14 So we shouldn’t imagine that current LLMs are anything close to what’s possible, even if you assume that generic LLM progress stopped today.15

Countermeasures

If this is all true, what could be done about it?

The most obvious “countermeasure” would be to get used to it. I mean, imagine that we did live in a world in which everyone literally had to sign everything they wrote with a unique immutable string. What would happen? I’d expect a mixture of:

  1. People become more comfortable with their “full selves” being public, with less compartmentalization.
  2. People pull back from communicating in public channels, relying more on group chats and the like.
  3. People self-censor.

There are strong historical analogies here, since over the past 20 years many governments and tech companies have in fact decreed that people must sign the things they write with their real names.

The effects seem to vary quite a lot based on the ambient culture and political system. Overall, my impression is that people are already much more comfortable with the idea that their work colleagues might read their dating profile or learn that they go to furry conventions. I’m optimistic that culture will continue to adapt to respect the fact that we all encompass multitudes. This seems healthy.

Some effects seem clearly positive. Self-censoring is not necessarily bad. For example, on the margin, real-names surely stop some teenagers from engaging in cyber-bullying. On the other hand, were you ever a teenager? I’m pretty sure that for anyone who is “different”, having those differences broadcast to the world creates a much larger “bullying surface area”. So the effects are mixed. And adults aren’t as different from teenagers as we might like to think.

Twenty years ago, I might have predicted that real names would discourage people from expressing controversial political ideas online. Superficially, that seems completely wrong. At least in the West, lots of people are very happy to express minority political views, and if you disagree at all, then you can go to hell. But I also tend to think this hides a lot of self-censorship, where most people don’t want engage in political mortal combat and so are cowed by a feisty minority. And, obviously, people in certain countries know that it’s unwise to criticize the Party. So, getting used to it seems like an imperfect solution at best.

Another countermeasure would be to not build this technology, or not make it widely available. In the short term, this seems plausible. As far as I can tell, it’s been possible for years for a modestly-funded group to build a phone app that would identify most people on the street from a photo. And yet, almost no one reading this has access to such an app. If general-purpose LLMs continue to get better at stylometry, it seems entirely possible that AI companies might decide it’s a safety issue and train their AIs to refuse to do it.16 This could work for a while.

But if the technology is possible, it seems certain that governments will build it and use it. They might try to keep it out of the hands of normal people. Certain governments might restrict their own use. My privacy-minded allies always seem very jaded, but it wouldn’t surprise me at all if the Supreme Court declared that a warrant was needed before the FBI could de-pseudonymize a U.S. citizen. But when/if that technology becomes sufficiently cheap, it seems like it would be very difficult to keep it out of the hands of normal people and/or bad actors. My guess is that it’s possible to create a program that’s a few hundred gigabytes large and can run (slowly) on most modern laptops. If that program is made public, it would be hard to put the genie back in the bottle.

There are also technological countermeasures. Most obviously, you could run your writing through a “filter” to try to remove identifying bits, e.g. by asking an LLM to rewrite it. It’s hard to be sure how well this would work, since we don’t have accurate estimates of how many bits you’re starting with or how many bits this would remove. But I’d guess this would be pretty effective if done carefully. The reason is that the number of identifying bits you leave in writing probably isn’t that large, relative to the number needed to identify you. If you “homogenize” your writing to remove all style and personality, you should be able to remove most of those bits. Theoretically, you’ll still leak some information. But I’d think this would substantially increase the amount you could write while remaining pseudonymous.17

But after thinking about it, this makes me sad. Effectively, this countermeasure would preserve pseudonymity by taking writing and destroying all traces of humanity. It seems like this would work well for the “bad” uses of pseudonymity, like cyber-bullying or coordinated violence, but it wouldn’t work at all for the “good” uses, like for example someone who likes to write pseudonymously because they feel like it allows them to be more honest and vulnerable and more fully themselves, damn it.

Generalized pseudpocalypse

Maybe this isn’t just true for writing. Maybe it’s just a feature of our universe that if you interact with the world in any significant way, then you leave traces that make it possible to identify you.

  • If you walk around in public, then you can likely be identified by your face, your gait, your voice, your DNA, your retinas, or your literal fingerprints.

  • Or say you use the internet. Even if you lock down your browser fingerprint and hide your IP address using a VPN or Tor, a sufficiently powerful adversary could still identify you by analyzing global packet flow.

  • Or say you use any phone or computer. You might be identified through keystroke dynamics or the way you jiggle your finger or mouse.

  • Say you buy food at the grocery store, but you pay with cash and somehow shop at a grocery store with no cameras. If you buy more than a handful of items, I’d bet you can still be identified through the patterns in the stuff you buy.

  • (Incidentally, did you ever notice that cash has serial numbers on it? And did you know that more and more ATMs are starting to track those numbers?)

  • Or say you don’t like your car being tracked, so you stop carrying a phone and somehow get lawmakers to outlaw license plates. Still, your car surely has a few small unique scratches, and the engine probably doesn’t sound exactly the same as other cars, even from the same model and year. So if there’s any high-resolution video or audio, that’s still enough to track you.

  • Say you plug your headphones into a charging station at the airport. Your headphones have eccentricities in their analog charging circuits. If someone really wanted to, they could track that.

  • Or say you use electricity. Given high-resolution power-usage data, what can be said about how many people live with you? And what devices you’re using? Probably a lot?

  • Or say you use a toilet. Many places already test sewage and know, at a population level, what drugs people are using and how prevalent various diseases are. Imagine this was upgraded to test many places in the system, with high temporal resolution, possibly correlated with flow measurements from individual houses. That would be exciting.

  • Or say you are a country and you have submarines. Can they be detected by adversaries using distributed acoustic sensing? What about satellite-based synthetic aperture radar? Gravity Gradiometers? Quantum magnetometry?

As far as I can tell, the general trend is that without countermeasures, almost everything can be identified. Countermeasures can make it harder, but they’re costly, and on the whole, the arms race seems to favor the identifier, not the person who doesn’t want to be identified.

I stress: This is not all bad. The goodness / badness of a generalized pseudpocalypse depends on how society is structured. After all, the foundation of civilization is finding ways for people to make deals, and arguably less privacy makes that easier. The degree that we live in a vulnerable world where it’s easy to create civilization-destroying technologies, perhaps we’re very lucky to find ourselves in a non-private world. Still, I do worry that privacy has long provided a kind of “slack” from laws and norms. Historically, that slack has limited the power of institutions to enforce their rules. If privacy is going away, we need to think about how to preserve slack, particularly when institutions don’t want to.

Appendix: Section for skeptical information theory enthusiasts

Above, I tried to estimate the number of bits of identifying information in writing. But what is a “bit”? In general, if x is a discrete random variable, then the Shannon entropy of x in bits is H(x) = ∑ₓ p(x) log₂(1/p(x)), where the sum is over all the values x can take. This is always bounded between zero and the logarithm of the number of values x can take.

That’s fine, but “writing style” is not a discrete variable with a discrete number of categories. So how can I estimate the entropy of writing style? The short answer is that I can’t. What I’ve actually estimated above is the mutual information between writing and writing style.

Let s be a random variable representing writing style. Think of this as some sort of high dimensional continuous vector representing all the quirks of how different people write. And let x be a writing sample of some length. This is discrete because we can represent writing on digital computers. Then what I’ve estimated above is the mutual information I(x;s) = H(x) - H(x|s), where H(x|s) is the conditional entropy of x given s. This can be measured in bits because both H(x) and H(x|s) can be measured in bits. So that’s what my estimate above really says: I(x;s) ≈ 106.2 bits.

Now, you still might be skeptical. Above, I’ve implicitly assumed something like the following was true:

It’s possible to identify one person out of N possibilities with low accuracy if and only if the mutual information between identifying features and writing is at least log₂(N) bits.

That’s how I justified pseudonymity being compromised around 29 bits. But is it really true? Strictly speaking, no. Actually, even more strictly speaking, it’s “not even untrue” because it’s not precise enough to be true or false. But as far as I can tell, basically any precise version of that statement is false. However, it’s possible to find versions of that statement that are true, provided you add some extra not-too-crazy assumptions.

To start, let’s consider an extremely simple model of information leakage.

Theorem. Suppose the world consists of you plus N other people, and suppose each person has a binary identity string, drawn at uniform from the distribution over M-bit binary strings. All these strings are known to the attacker. Suppose you pick some subset of K bits and reveal them. Then the probability that this identifies you is

  (1-2⁻ᴷ)ᴺ.

Furthermore, in order to hold the probability of being identified below

  (1-1/N)ᴺ ≈ exp(-1) ≈ 36.7%,

it is necessary that K ≤ log₂(N).

Proof. The probability that all K observed features collide with any random person in the crowd is 2⁻ᴷ. Thus, the probability of no collisions after checking the crowd of N people (meaning you are the only one matching the observed features) is (1-2⁻ᴷ)ᴺ. □

That’s simple. But it’s not realistic at all, since it assumes that people have immutable binary strings that they leak into their writing. Can we make it more realistic?

Well, there is a simple lower bound. That is, we can say in general that if the mutual information is significantly less than log₂(N), then it’s not possible to reliably identify someone.

Theorem. Suppose N random people are selected and their full writing style features are made public. One person from that group is chosen and produces a writing sample. Then, the attacker must guess who produced it. The average success rate of the attacker (averaged over the random pool, the random choice of author, and the random writing sample) is at most (I(x;s)+1)/log₂(N).

Proof. Let S=(s₁, s₂, s₃, …) be the pool of N styles and let n be a random variable indicating which person was chosen. Fano’s inequality says that the highest possible success rate is bounded by the conditional mutual information between the writing sample x and the identity n, conditioning on the pool of writing styles, i.e. the probability of success is at most

  (I(x;n|S)+1)/log₂(N).

However, we can bound that conditional mutual information as

  I(x;n|S) ≤ I(x;n,S) = I(x;n,sₙ) = I(x;sₙ) = I(x;s).

The first inequality is standard. The second step uses the fact that given n, the writing x is conditionally independent of all styles except the chosen writer. The third step uses the fact that n is conditionally independent of x given sₙ. The last step uses that (x,sₙ) is distributed as (x,s). Substituting this bound gives the claimed result. □

So, if mutual information is much less than log₂(N), reliable identification is impossible, even if the attacker knows all the style vectors perfectly. So, provided you don’t leak that many bits, you’re definitely safe.

But is the converse true? Does leaking more than log₂(N) bits always identify you? The general answer is no. The basic problem is that I(x;s) is the average information that an average person leaks in an average writing sample. Without further assumptions, you can construct scenarios where some rare people and writing samples contain gigantic amounts of information, but most people usually leak nothing. That would mean that the attacker is very certain in some cases but usually learns nothing.

So, to get a guarantee that identification is actually possible, you need to make some kind of additional assumption that the information leakage rate doesn’t vary too much between different writers or between different things they write.

Suppose that p(x,s) is the joint distribution over writing styles s and writing samples x. Let’s suppose that the attacker knows the true style vector ŝ for some person. Then, they will be given a writing sample x that either came from that person or came from a randomly chosen person, and must decide which. Formally, the attacker’s goal is to guess if x was sampled from the writing distribution for that person, p(x|ŝ) or from the population marginal p(x). Intuition suggests that the attacker’s best strategy will be to look at the ratio

  p(x|ŝ)/p(x),

and “accept” x as coming from ŝ if above some threshold, and reject it otherwise. In fact, the Neyman-Pearson lemma guarantees that this is the optimal strategy, in a very strong sense: That ratio contains all the information that’s useful for making that decision.

Now here’s something interesting: Instead of looking at the ratio, the attacker could look at the logarithm of the ratio. It makes no difference since it’s monotonic. But if you take the logarithm of that ratio, and take the expectation over people and over texts, what do you get? Well:

  𝔼 ln (p(x|s)/p(x)) = 𝔼 ln (p(x,s)/(p(x) p(s))) = I(x;s)

It’s the mutual information! So, intuitively, the mutual information is how much an attacker learns about the style of the writer “on average”, where that average is over both writers and text.

The following theorem will look at the average information in text for a writer with a particular style. I’ll define this as

  D(s) = KL(p(X|s) || p(X)).

Intuitively, this is how different the writing of someone with style s is from the population average. That’s because if you take the average of this value over different styles, you get the mutual information. That is, I(x;s) = 𝔼[D(s)].18

Theorem (informal). Suppose that the attacker will observe some text and wishes to classify it as either coming from a writer with specific known style ŝ, or coming from someone with a random style. Suppose that the attacker is only willing to tolerate some small risk ε of a false positive. Provided that D(ŝ) is significantly larger than -ln(ε), the attacker can achieve that, while also keeping the risk of false negatives very low, provided that the variance of how much information is revealed in a random writing sample is bounded.

Theorem. Let D(ŝ) = KL(p(X|ŝ) || p(X)) to be the divergence between the target’s writing distribution and the marginal distribution. Also, define qₜ(x) ∝ p(x|ŝ)ᵗ p(x)¹⁻ᵗ to be the family that interpolates between those two distributions. To formalize the idea that “information leakage” for ŝ doesn’t vary that much, we assume that some constant V exists such that for 0 < t < 1, the variance of log(p(x|ŝ)/p(x)) under qₜ is bounded by V.

Then for any ε satisfying exp(-D) < ε < exp(-D + ½ V), it is possible for the attacker to simultaneously achieve a false positive rate of FPR ≤ ε and a false negative rate of FNR ≤ exp( - ½ (D+ ln ε)² / V). This false positive rate reflects the mistake rate provided the writing sample x came from a randomly chosen other person, while the false negative rate reflects the mistake rate provided the writing sample x actually came from the person with style ŝ.

Proof sketch. Let f be the distribution of l(x) = log(p(x|ŝ)/p(x)) with respect to p(x|ŝ) and let g be the distribution of l(x) with respect to p(x). The stated variance assumption implies a quadratic bound K(u) ≤ D u +½ V u^2 for -1 < u < 0, where K is the cumulant generating function of f. Observe that g is an exponential tilting of f. The attacker’s strategy must be to “accept” x as coming from ŝ if l is above some threshold c and “reject” it otherwise. Use K in a Chernoff bound on the probability l is less than c under f to upper-bound FNR ≤ exp( - ½ (D-c)²/V). Now, using that g(l) = exp(-l) f(l), again use K in a Chernoff bound on the probability l exceeds c under g to upper-bound FPR ≤ exp( -c - ½ (D-c)²/V). Both of these bounds are simultaneously valid when D-V < c < D. Setting c to make the false-positive bound equal to ε gives FPR ≤ ε and FNR ≤ exp( -½ (V - √(V² - 2V(D + ln ε)))²/V). The latter can be relaxed into the stated result using that √(1-x) ≤1-x/2 for 0 ≤ x ≤ 1. □

Now, if we suppose that the attacker wants to find a particular person, with a particular known style s. And suppose that the attacker has a pool of N people and will see one writing sample from each, but wants to limit the total probability of a false positive to δ after seeing one sample from each person. Then, they will need that

  (1-ε)ᴺ ≈ exp(-εN) = (1-δ),

which is satisfied by ε ≈ δ/N. Substituting this into the previous result says that the attacker can hold the total risk of a false positive to δ while achieving a false-negative risk of

  FNR ≤ exp( - ½ (D(s) + ln δ - ln N)² / V).

These results use natural logarithms because the math is easier if you measure information in nats. If you measure information in bits then you would get log₂ δ and log₂ N. (Rescaling D and V appropriately.)

So, again, as long as the average information for user s is significantly larger than log₂ N, the attacker can identify that user with minimal risk of false positives.

Some writers might leak more information (higher D(s)) and some writers might leak less information (lower D(s)). But remember, I(x;s)=𝔼 D(s). So as long as information leakage doesn’t vary too much between people, and assuming that I(x;s) is much larger than log₂ N (and assuming that variance condition), almost everyone can be identified.

  1. Editor’s note: After this sentence was written, many additional hours were devoted to further idiotic tinkering. 

  2. It’s fine. 

  3. A standard binary variable that is 0 or 1 with 50% probability conveys 1 bit of information, while a variable that is 0 / 1 / 2 with probability 49.8% / 49.8% / 0.4% conveys 1.0336 bits. 

  4. People born in certain decades are also presumably more likely to employ see what I did there gambits. 

  5. For example, here is the information content for seven different “bent coins”:

    Probability of landing heads Information
    0.50 (fair coin) 1.000
    0.60 0.971
    0.70 0.881
    0.80 0.722
    0.90 0.469
    0.95 0.286
    0.99 0.081

  6. Here’s a more formal looking version of the table from the previous footnote:

    p(A) p(B) Information
    0.50 0.50 1.000
    0.60 0.40 0.971
    0.70 0.30 0.881
    0.80 0.20 0.722
    0.90 0.10 0.469
    0.95 0.05 0.286
    0.99 0.01 0.081

    You can generate that table by running this code:

    from scipy.stats import entropy
     
    dists = ([0.5, 0.5], [0.6, 0.4], [0.7, 0.3], [0.8, 0.2], [0.9, 0.1], [0.95, 0.05], [0.99, 0.01])
    entropies = [entropy(p, base=2) for p in dists]
    
    print("| p(A) | p(B) | Entropy |")
    print("|------|------|---------|")
    for i in range(len(dists)):
        print(f"| {dists[i][0]:<4.3f} | {dists[i][1]:<4.3f} | {entropies[i]:<7.3f} |")
    

    With three categories, the story is much the same. Things need to get quite uneven before information drops too much:

    p(A) p(B) p(C) Entropy
    0.333 0.333 0.333 1.585
    0.400 0.300 0.300 1.571
    0.500 0.250 0.250 1.500
    0.600 0.200 0.200 1.371
    0.700 0.150 0.150 1.181
    0.800 0.100 0.100 0.922
    0.900 0.050 0.050 0.569
    0.950 0.025 0.025 0.336
    0.990 0.005 0.005 0.091

    You can generate that with this code:

    from scipy.stats import entropy
    
    dists = (
        [1/3, 1/3, 1/3],
        [.4, .3, .3],
        [.5, .25, .25],
        [.6, .2, .2],
        [.7, .15, .15],
        [.8, .1, .1],
        [.9, .05, .05],
        [.95, .025, .025],
        [.99, .005, .005]
    )
    entropies = [entropy(p, base=2) for p in dists]
    
    print("| p(A) | p(B) | p(C) | Entropy |")
    print("|------|------|------|---------|")
    for i in range(len(dists)):
        print(f"| {dists[i][0]:<4.3f} | {dists[i][1]:<4.3f} | {dists[i][2]:<4.3f} | {entropies[i]:<7.3f} |")
    

  7. Roughly speaking, we we should discount those maximum bits as follows:

    • Near even: No discount.
    • “Mildly uneven” (E.g. 70/30 with two categories) Discount by 10%.
    • “Quite uneven” (E.g. 90/10 with two categories) Discount by 50%.
    • “Extremely uneven” (E.g. 99/1 with two categories) Discount by 90%.

    The Shannon entropy of a categorical distribution is - Σᵢ pᵢ log₂ pᵢ. Or, in python:

    import math
    def entropy(probs):
    	return sum(-p * math.log2(p) for p in probs)
    

    Age: It’s hard for me to imagine you could guess age from text with accuracy higher than 5 years. If you assume an age between 0 and 100, that would be 20 categories and log2(20)=4.32 bits. These are mildly non-uniform so I’ll reduce to 3.9.

    Education: I’m assuming 6 categories: less than high school, high school, some college, finished college, master’s degree, doctorate. That would be log2(6)=2.58 bits, but fairly uneven, so I’ll reduce by 20% to reflect that.

    Ethnicity: Assuming 62% white, 11% black, 16% latino, 6% asian, 1.5% indigenous, 3.5% mixed/other, and actually using the entropy formula.

    Family status: I’m using two categories: Children / no children, on the logic that guessing the number of children would be very hard. These are mildly non-uniform, so I’ll drop to 0.8 bits. You could have a third category for having children that are grown and that had left home, but this would be heavily redundant with age.

    Income: The US census gives 11 income brackets. That seems as good a way of discretizing as anything. That would be log2(11) = 3.459 bits, but these are again moderately non-uniform, so I’ll reduce to 2.5.

    Marital status: I’m taking 3 categories (single, married, divorced / widowed / etc). That would be log2(3)=1.58 bits at maximum, but again these are somewhat non-uniform, so I dropped that to 1.2.

    Mental health: I’m using 3 categories: “Healthy”, “chronic condition”, and “severe issues”. Assuming 73% healthy 25% chronic condition, 2% “severe issues”, and using the entropy formula gives 0.9 bits.

    Native language: I’m using 2 categories, namely “English native”, and “non-English native”. These are pretty uneven inside the Anglosphere, so I’ll drop from 1 bit to 0.6 bits.

    Occupation. The BLS classification gives 23 major groups. That would be log2(23)=4.523 bits, but it’s moderately non-uniform, so I’ll reduce to 4 bits.

    Physical health: Assuming 60% “healthy” 30% “chronic condition” 10% “severe issues” and using the entropy formula.

    Political leanings: I’m using three categories (left, center, right). These are fairly uniform so I’m using 1.58 bits.

    Region: I asked an LLM to divide the Anglosphere up into a number of regions with reasonable granularity. With some tinkering, it gave 23 regions: South East England, South West England, Midlands, Northern England, Scotland, Wales, Republic of Ireland, Northern Ireland, Quebec, Ontario, Western Canada, Atlantic Canada, Northeast US, Southern US, Midwest US, Western US, Alaska, Hawaii, Southeast Australia, Western Australia, Queensland, Central & Southern Australia, New Zealand. With LLM-generated population estimates (which looked reasonable) and plugging into the entropy formula, this gave 3.5481 bits.

    # Region Pop (M) pi (Pop/Total) log2⁡(pi) pilog2⁡(pi)
    1 South East England 20.0 0.04062 -4.617 -0.1875
    2 South West England 6.0 0.01219 -6.353 -0.0774
    3 Midlands 11.0 0.02234 -5.485 -0.1225
    4 Northern England 20.0 0.04062 -4.617 -0.1875
    5 Scotland 5.5 0.01117 -6.484 -0.0724
    6 Wales 3.0 0.00609 -7.359 -0.0448
    7 Republic of Ireland 5.0 0.01015 -6.626 -0.0673
    8 Northern Ireland 2.0 0.00406 -7.949 -0.0323
    9 Quebec 9.0 0.01828 -5.774 -0.1055
    10 Ontario 16.0 0.03250 -4.943 -0.1606
    11 Western Canada 13.0 0.02640 -5.247 -0.1385
    12 Atlantic Canada 2.5 0.00508 -7.625 -0.0387
    13 Northeast US 56.0 0.11373 -3.136 -0.3568
    14 Southern US 130.0 0.26401 -1.922 -0.5074
    15 Midwest US 69.0 0.14013 -2.836 -0.3973
    16 Western US 80.0 0.16247 -2.624 -0.4264
    17 Alaska 0.7 0.00142 -9.467 -0.0134
    18 Hawaii 1.4 0.00284 -8.790 -0.0249
    19 Southeast Australia 16.0 0.03250 -4.943 -0.1606
    20 Western Australia 3.0 0.00609 -7.359 -0.0448
    21 Queensland 5.5 0.01117 -6.484 -0.0724
    22 Central & Southern Australia 2.5 0.00508 -7.625 -0.0387
    23 New Zealand 5.3 0.01076 -6.539 -0.0703
      Sum of pilog2⁡(pi)       -3.5481

    Religious affiliation: 3 categories (christian, other religion, atheist / agnostic). These are uniform-ish.

    Sex: 2 categories, near-even 

  8. Consider a set of binary random variables, each of which is equally likely to be 0 and 1, yet all are correlated with a pairwise correlation coefficient of ρ. There are many distributions that satisfy this condition, but a natural choice is an Ising model. If there are many variables, then the entropy per-variable in an Ising model with pairwise correlations of ρ tends to h((1+√ρ)/2), where h is the binary entropy function. We can print out those numbers:

    ρ h((1+√ρ)/2)
    0.0000 1.00000000
    0.1000 0.92661216
    0.2000 0.85048963
    0.3000 0.77121926
    0.4000 0.68826012
    0.5000 0.60087604
    0.6000 0.50801160
    0.7000 0.40803633
    0.8000 0.29811751
    0.9000 0.17212786
    1.0000 0.00000000

    As you can see, the entropy per-variable is always a bit more than 1-ρ. But the Ising model is optimistic, in the sense that it has the highest entropy of all distributions meeting the given conditions. So, screw it, let’s estimate the entropy per-variable to just be 1-ρ. 

  9. If it means anything to you, I asked Kimi 2.6 to hallucinate some numbers:

      Age Edu Eth Fam Inc Mar Mhe Nlg Occ Phe Pol Reg Rel Sex
    Age 1.0 -0.2 0.0 0.6 0.1 0.5 -0.1 0.0 0.2 -0.5 0.1 0.0 0.2 -0.1
    Edu -0.2 1.0 0.3 0.2 0.6 0.2 0.1 0.1 0.7 0.3 0.3 0.2 -0.2 -0.1
    Eth 0.0 0.3 1.0 0.2 0.3 0.1 -0.1 0.7 0.3 -0.3 0.2 0.4 0.4 0.0
    Fam 0.6 0.2 0.2 1.0 0.2 0.7 -0.1 0.0 0.1 0.0 0.1 0.0 0.2 0.1
    Inc 0.1 0.6 0.3 0.2 1.0 0.3 -0.2 0.1 0.7 0.3 0.1 0.2 0.0 -0.1
    Mar 0.5 0.2 0.1 0.7 0.3 1.0 0.2 0.0 0.1 0.2 0.1 0.0 0.2 0.0
    Mhe -0.1 0.1 -0.1 -0.1 -0.2 0.2 1.0 0.0 -0.2 0.4 0.0 0.0 -0.1 0.1
    Nlg 0.0 0.1 0.7 0.0 0.1 0.0 0.0 1.0 0.1 0.0 0.1 0.5 0.3 0.0
    Occ 0.2 0.7 0.3 0.1 0.7 0.1 -0.2 0.1 1.0 0.1 0.2 0.2 0.0 0.3
    Phe -0.5 0.3 -0.3 0.0 0.3 0.2 0.4 0.0 0.1 1.0 0.0 0.1 0.0 0.1
    Pol 0.1 0.3 0.2 0.1 0.1 0.1 0.0 0.1 0.2 0.0 1.0 0.5 0.4 0.1
    Reg 0.0 0.2 0.4 0.0 0.2 0.0 0.0 0.5 0.2 0.1 0.5 1.0 0.2 0.0
    Rel 0.2 -0.2 0.4 0.2 0.0 0.2 -0.1 0.3 0.0 0.0 0.4 0.2 1.0 0.1
    Sex -0.1 -0.1 0.0 0.1 -0.1 0.0 0.1 0.0 0.3 0.1 0.1 0.0 0.1 1.0

    Personally, this doesn’t mean very much to me… 

  10. It’s more complicated than this, because some atoms (e.g. strontium-90) emit more energy per decay than others. And some types of radiation are more harmful to human life than others. 

  11. In general, if you want an exponential curve f(n) that starts at 1 for n=0 and decays to 1-X for n=N, you should choose f(n) = exp(n × ln(1-X) / N). So for demographic features we’re using X=0.6 and N = 4500, meaning f(n) = exp(-0.00020362 × n). For personality features, we’re using X=0.7, meaning f(n) = exp(-0.00026755 × n), and for writing style features, we’re using X = 0.8, meaning f(n) = exp(-0.000357653 × n). So the total number of bits remaining hidden is 17.2 × exp(-0.00020362 × n) + 39.0 × exp(-0.00026755 × n) + 50.0 × exp(-0.000357653 × n). 

  12. OK, what’s the most likely reason I might be wrong? Above, I used math to estimate the information in features, and then I basically made up numbers for how much of that information can be guessed from text. Even so, my greatest concern is that the first part. I’m a bit worried that I might be overestimating the amount of information in the features themselves due to inadequately discounting for correlations. For one thing, there are probably correlations between feature groups. (For example, I’d bet that people who are high in perfectionism are less likely to use lose and loose interchangeably, and that people who live in Northern England are more likely to use the character string colour than people who live in Hawaii.) Also, my crude method of discounting information by ρ due to pairwise correlations of ρ might not discount enough: I used an estimate based on an Ising model, which is the maximum-entropy (highest information) distribution given the correlation constraints. I haven’t been able to figure out how much lower the information could be in the worst-case. 

  13. People debate if this is true for “intelligence”, but it’s definitely true in terms of bit-rate. 

  14. Also, arguably, stylometry is about language. This means that large language models probably have much of what they need baked in. That might explain why they’re pretty good at it just “by accident”. But to do this optimally I think they’d need self-reflection (e.g. access to probabilities of text given different contexts) that current LLMs aren’t typically capable of, and wouldn’t know how to manipulate correctly without task-specific training. 

  15. You could conjecture that near-optimal stylometry abilities are some kind of “emergent property”. But the general lesson so far is that LLMs mostly don’t have emergent properties but are just good at what they’re trained at. 

  16. (Meta-joke about you—person who works at an AI company—thinking, “maybe we should do that”, coming to this footnote, and seeing this meta-joke.) 

  17. Instead of “homogenizing” writing by imposing a generic style, perhaps it would be better to “camouflage” it by enforcing a very strong but random style. 

  18. Be a little careful here: Typically, the KL-divergence is understood to be measured in nats. But in this article, I’ve measured mutual information in bits. That’s fine, but you need to convert. For example, 106.2 bits = 73.60 nats. 

Life with hazard ratios

2026-07-06 08:00:00

If you read anything about health or longevity, you’ll soon find yourself in a world of hazard ratios. Some study might say that eating more fiber might change your risk of dying by a factor of HR = 0.90. Another might say that occasional smoking might change it by HR = 1.30.

But how much should you care about that? Is HR = 0.90 or HR = 1.30 a lot? What if you don’t want to eat more fiber? What if you like smoking?

Instead of staring at a ratio1, a more sensible thing to do is think about life expectancy.2 But is it possible to convert a hazard ratio to a change in life expectancy? You might reason as follows: Baseline life expectancy is around 75 years. And HR = 0.90 corresponds to a 10% decrease in mortality. So perhaps that hazard ratio corresponds to something like 7.5 extra years of life expectancy?

Unfortunately, that’s completely wrong. To see why, imagine that humans only die by playing Russian roulette. They start playing this once per day at the age of 75, with a revolver containing two bullets and six chambers. If you were to remove one of those two bullets, that would drop the person’s risk of death by HR = 0.5. (One bullet versus two.) But life expectancy would barely change, because even with just one bullet, almost nobody would survive for any significant amount of time past 75.

For contrast, imagine again that humans only die via Russian roulette, but now they do this once per day from birth with a revolver with 2 bullets and 54,786 chambers. (Newborns emerge and instinctively reach for this gigantic gun.) You can show that these people also live 75 years on average. But now, if you remove one of the bullets, life expectancy doubles, because when someone is spared, it takes a long time before they get unlucky again.3

Neither of those is a good model for humans. We’re somewhere between the two, with heart disease and so on instead of revolvers and risks slowly rising as we age instead of suddenly starting at age 75 or staying constant throughout life. But you get the point: If you want to convert a hazard ratio for some intervention to a change in life expectancy, the impact depends on how “spread out” baseline mortality risk is over time. Baseline life expectancy is simply not enough information.

That’s one problem. Here’s another: What even is a hazard ratio? The technical definition is something like:

The hazard ratio at a given time is the rate of an event in the treatment group divided by the rate of that event in the control group.

Hazard ratios are often confused with their more beloved siblings, relative risks. Say you run a trial for 10 years and at the end, 10% of the control group died and 8% of the treatment group. Then the relative risk is RR = 0.8, nice and simple. But relative risks have problems, most notably that if you run a long enough trial, then no one will be alive at the end no matter the intervention, meaning RR = 1.0. That’s not helpful. Intuitively, you can think of the hazard ratio at age 40 as sort of like the relative risk for people between the ages of 39.99 and 40.01.

In real life, interventions have different hazard ratios at different ages. Chemotherapy tends to have better results in younger patients who are more able to endure the side-effects. Having a slightly higher BMI (25-30 rather than 20-25) is associated with an increased risk of mortality in young people, but a decreased risk in the elderly. You may remember from 2020 that COVID’s mortality risk had a different age curve than baseline mortality, meaning the hazard ratio of getting COVID was different at different ages.

This is important, because hazard ratios at different ages have different impacts on life expectancy. A hazard ratio of 0.9 at age 80 prevents more deaths than at age 20, because baseline mortality is higher at 80. But at the same time, if you save the life of a 20 year-old, they have more years in front of them. Beyond that, the hazard ratios at different ages interact: If some intervention decreases mortality at younger ages, that allows more people to reach older ages, increasing how much hazard ratios matter at older ages.4

If we knew the hazard ratio at all ages, we could account for those dynamics. But we don’t, because when estimating hazard ratios, people almost always assume that the hazard ratio is constant.5 We’re quasi-forced to do this because there’s not enough data to estimate a whole time-series of ratios. That’s why papers contain single numbers like HR = 0.90.

So even though Intervention A (say, more fiber) and Intervention B (say, light jogging) might have the same hazard ratio in a paper, those numbers could be the product of different underlying age-dependent effects, meaning those interventions could conceivably lead to vastly different changes in life expectancy.

So is this all hopeless? Are single hazard ratio numbers just too far removed from what we care about to tell us anything meaningful?

Surprisingly, no. It’s mostly OK. If we were a different species, it might be hopeless. But for modern humans in rich countries, mortality happens to be distributed in a way that produces a sort of lucky coincidence: When people estimate constant hazard ratio numbers, they’re implicitly sorta-kinda taking a weighted average of hazard ratios at different ages. And those weights happen to (sorta-kinda) reflect how much changes in mortality at different ages change.

So, I will argue, even if the true intervention has a varying effect, it’s sorta-mostly OK to just take a hazard ratio from a paper and convert it to a change in life expectancy using this curve:

dl_vs_hr_log

If a paper showed that eating more fiber produces a hazard ratio of HR = 0.75, that corresponds to an increase of around 3.7 years. If a paper says that occasional smoking produces a hazard ratio of HR = 1.25, that corresponds to a decrease of around 2.9 years.

This isn’t exact. If the intervention is better (or less bad) for older people this will tends to overestimate the increase (or underestimate the decrease) in life expectancy. If the intervention is worse (or less good) for older people, it will tend to underestimate the increase (or overestimate the decrease) in life expectancy. But as long as the hazard ratio doesn’t vary too much by age, it’s probably not off by more than around 30% in either direction.

The easy case

Say there’s some intervention (eating more fiber or whatever) that multiplies your risk of dying at age t by a factor of HR(t). Then it can be shown that this changes life expectancy by approximately

  ΔL ≈ ∑ₜ ΔHR(t) × P(t) × L(t).

Here, P(t) is the baseline probability of dying at age t. For males in the United States, it looks like this:

Meanwhile, L(t) is conditional life expectancy at age t. That’s the average number of additional years left for someone who reaches age t. For males in the United States, it looks like this:

Finally, ΔHR(t) is the decrease in hazard at age t. You can think of that as just ΔHR(t) = 1 - HR(t). Though if you’re OK with logarithms, there’s a somewhat better approximation that uses logarithms, which I’ve quarantined in a footnote.6

Let’s start with the easy case. What if your intervention has the same effect on mortality at all ages, so HR(t)=HR is just a constant? Then, the above equation simplifies into

  ΔL ≈ ΔHR × L̄,

where

  L̄ = ∑ₜ P(t) × L(t).

This makes sense! Again, P(t) is the baseline probability of dying at age t and L(t) is conditional life expectancy at age t. These are constant, so when you add them up, is just a number. For males in the United States, it happens to be 12.93 years. This quantity has a specific meaning: The average remaining life expectancy for US males when they die. That sounds a bit odd, but think of picking a random death and asking how many additional years people who reach that age live on average. That number is 12.93 years.

So, if an intervention has a constant hazard ratio, the mean change in life expectancy for US males is just

  ΔL ≈ ΔHR × 12.93 years.

Now we’re getting somewhere! If you prevent a fraction ΔHR of deaths, then you increase life expectancy by ΔHR times 12.93 years.

Now remember the naive calculation we started with: Life expectancy for US males is 75.8 years. You might hope that if eating more fiber drops your risk of death by 10%, that would save 7.58 years. Sadly, the above equation says that a 10% drop in risk only increases life expectancy by around 1.293 years—only 0.17 times as much.

This is essentially the observation Keyfitz made in his 1977 paper, “What Difference Would It Make if Cancer Were Eradicated?” Cancer is responsible for 18 percent of deaths, so does that mean eradicating it would increase lifespan by 18 percent, or around 13.6 years? Nope, Keyfitz says, it’s only 2.3 years.

If a cure for cancer were discovered and made available today, 350,000 cancer deaths would be avoided in the next year. The overall death rate would be lower by nearly 18 percent. If the cure were quick and inexpensive, a large fraction of the country’s hospital beds and medical personnel would be released for treatment of other ailments. Patients would be spared untold suffering. Such an implicit analysis underlies government proposals for eradication of cancer. The argument is sound for first effects on mortality but wholly misleading for the long term.

The first effects would soon be offset by more mortality from diseases other than cancer. As a result of the cancer cures, the population would include a higher proportion of people subject to other causes of death. […]

At the extreme, it might be said that everyone dies of something sooner or later, so that, when the effects of the eradication of cancer had shaken down, the same number of deaths would occur as before, and the only benefit would be the substitution of heart and other diseases for cancer. A cure for cancer would only have the effect of giving people the opportunity to die of heart disease.

Cheerful stuff! We can also write our approximation in terms of baseline life expectancy as

  ΔL ≈ ΔHR × 0.17 × 75.8 years,

which makes explicit that 12.93 years is only 0.17 times as large as a naive estimate using baseline life expectancy. The discount factor of 0.17 is sometimes called the “Keyfitz entropy”. You can think of it as measuring how close some population is to playing Russian roulette with 2 bullets in 6 chambers starting at age 75 (a discount factor of just above 0) and playing Russian roulette from birth with 2 bullets and 54,786 chambers (a discount factor of 1.0). It’s typically around 0.15 in rich countries today, though it was historically much higher.

Keyfitz entropy is also much higher in other species like mice (perhaps 0.45). You could argue that this explains why nothing that increases lifespan in mice ever translates to humans. Say caloric restriction or whatever produced the same constant hazard ratio in mice and humans. Then it’s mathematically guaranteed that the percentage increase in life expectancy will be three times smaller in humans, because Keyfitz entropy is three times smaller in humans. It’s harder to increase life expectancy when the baseline mortality distribution is more compressed.7

But that’s all assuming the hazard ratio is the same at all ages. Which it surely isn’t.

The interesting case

Here again is our equation for the change in life expectancy in response to taking some action that changes the risk of mortality at age t by a factor of HR(t):

  ΔL ≈ ∑ₜ ΔHR(t) × P(t) × L(t),

Basically, for each age t, we multiply together three numbers:

  1. ΔHR(t) is the decrease in the chance of dying at age t as a result of whatever intervention you’ve made (e.g. eating more fiber). This reflects that larger decreases in risk lead to larger increases in life expectancy.
  2. P(t) is the baseline probability of dying at age t. This reflects that the hazard ratio is a ratio, so you prevent more deaths when you apply that ratio to ages where the baseline rate is higher.
  3. L(t) is conditional life expectancy at age t. This reflects that you miss out on more years of life if you die when you’re young.

Now notice: The impact of a change ΔHR(t) at age t is the product of the baseline risk of death P(t) and remaining life expectancy L(t). So what really matters is their product, P(t) × L(t):

This shows how sensitive life expectancy is to changes in hazard ratios at different ages. It would be nice if this were constant. Then, the shape of HR(t) wouldn’t matter at all, only the average value. That’s not quite true, but it’s not terribly far from being true.

An equivalent way of writing our equation for the change in life expectancy is

  ΔL ≈ avg(ΔHR) × L̄,

where is still mean “life expectancy at death” (12.93 years for US males) and avg(ΔHR) is the average change in hazard, weighted by the P(t) × L(t) sensitivity curve at different ages.8 While that sensitivity curve isn’t constant, it’s not too curvy, either. Intuitively, it gives a lot of weight to ages between 50 and 90, somewhat less weight to ages between 20 and 50, and little weight to other ages.9

So that’s not too bad. But let’s remember our original problem: You see some number like HR = 0.90 in a paper, and you want to convert it to a change in life expectancy. If the true underlying hazard ratio were constant, then there’s no problem. But if it’s not constant, then what does that HR = 0.90 number even mean?

Numbers in papers

Unfortunately, you almost never get to see the underlying time-dependent HR(t), because there’s almost never enough data to estimate it. So it’s almost never possible to compute the weighted average avg(ΔHR). In reality what you have is probably a single number in a paper. Let’s call that number est(HR). The obvious thing to do would be to plug the change into the above equation in place of avg(ΔHR) and approximate the change in life expectancy as

  ΔL ≈ est(ΔHR) × L̄.

Again, you can just think of est(ΔHR) = 1-est(HR) as being the estimated reduction in hazard. Although, again, I’d prefer you use logarithms if you’re OK with logarithms.10 So the question is: Will that be accurate? How close are est(ΔHR) and avg(ΔHR)?

Well, how do people actually estimate those scalar hazard ratio numbers in papers? Somehow, they’re aggregating together information about hazards at different ages into a single number. But how? Well, it’s complicated. But if there’s a lot of data, you can show that the estimated scalar hazard ratio is approximately11

  est(HR) ≈ Πₜ HR(t)ᵖ⁽ᵗ⁾.

(Pardon the hideous typsetting.) That is, the estimated hazard ratio is the geometric average of age-dependent hazard ratios, weighted by the probability of dying at each age. It follows12 that the estimated change in hazard is approximately

  est(ΔHR) ≈ ∑ₜ P(t) ΔHR(t).

So ideally, we’d estimate life expectancy using avg(ΔHR), which averages the changes ΔHR(t) based on the weights P(t) × L(t). But we can’t do that, because we don’t have access to the ΔHR(t) numbers. What we can do is read a hazard ratio number in a paper, call it est(HR) and then compute the change est(ΔHR). The above equation says that if you do that, you are implicitly (and approximately) averaging the changes ΔHR(t) based on the weights P(t) alone.

The “right” weights used by avg(ΔHR) and the “wrong” weights implicitly used by est(ΔHR) aren’t the same. But they’re not that different. Here’s P(t) × L(t), the weights that we’d like to use to compute avg(ΔHR) and estimate changes in life expectancy accurately:

And here’s P(t), the weights you’re implicitly using if we take a hazard ratio number from a paper and compute est(ΔHR):

They’re different. In particular, the latter weights give more weight to people aged 80-95 and less weight to people aged 20-50. But they’re not terribly different.

Enough math, let’s try it

To start, imagine some intervention that decreases risk by HR(t)=0.9 for all ages.

Here are the results:

Thing Formula Years
Original life expectancy L 75.7769
New life expectancy L’ 76.4127
Exact ΔL ΔL = L - L’ 0.6358
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ 0.6409
Use number from paper ΔL ≈ est(ΔHR) × L̄ 0.6409

Let me explain what’s happening here. I made a simulator that takes actuarial data for how likely US males are to die at various ages. From this, it’s a simple spreadsheet calculation to compute life expectancy L.13 Then I applied a hazard ratio to change the probability of dying at each age, and re-ran the simulator to compute a new life expectancy L’ and the exact difference ΔL. Then I’m showing two approximations of ΔL: The first is the “ideal approximation” using avg(ΔHR), which I’m including mostly to show that my math is good. Finally, I’m showing the approximation you get if you actually fit a Cox proportional hazards model and use the resulting number in est(ΔHR). This corresponds to what you’d get if you plug in a number from a paper.

So, with the above constant hazard ratio HR = 0.90, both approximations are very good. This remains true if you switch to some other constant.

What if the hazard ratio varies? At first, you might think that something like this would be very problematic:

But it’s basically fine:

Thing Formula Years
Original life expectancy L 75.7769
New life expectancy L’ 77.4373
Exact ΔL ΔL = L - L’ 1.6604
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ 1.7451
Use number from paper ΔL ≈ est(ΔHR) × L̄ 1.7121

The reason this is fine is that the changes in the hazard ratio are relatively “high frequency”, meaning they sort of locally average out. To demonstrate this, suppose the hazard ratio is chosen randomly for each 1-year bin:

Then the approximations are even better:

Thing Formula Years
Original life expectancy L 75.7769
New life expectancy L’ 77.4218
Exact ΔL ΔL = L - L’ 1.6449
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ 1.7059
Use number from paper ΔL ≈ est(ΔHR) × L̄ 1.7123

What causes trouble is if the hazard ratio varies systematically between the young and the old. For example, suppose the intervention is useless for newborns, but gradually becomes more helpful as you get older:

My “ideal approximation” would still be pretty accurate, if you could compute it. (Which you can’t, in the real world.) But using a number from a paper leads to an overestimate:

Thing Formula Number
Original life expectancy L 75.7769 years
New life expectancy L’ 77.9031 years
Exact ΔL ΔL = L - L’ 2.1261 years
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ 2.0962 years
Use number from paper ΔL ≈ est(ΔHR) × L̄ 2.7645 years

This happens because est(ΔHR) is implicitly weighted by P(t) which is heavily weighted towards older people, whereas we’d like to use something more like avg(ΔHR) which is weighted by P(t) × L(t) which is somewhat less weighted towards older people. Even so, the error isn’t terrible.

Now, it is possible that plugging in a hazard ratio from a paper could give wildly inaccurate estimates of life expectancy. One such scenario would be an intervention which is amazing for people aged 85-95, but does nothing for anyone else:

Now, the hazard ratio looks good exactly at the ages where est(ΔHR) has the most weight, leading it to hugely overestimate the impact on life expectancy:

Thing Formula Number
Original life expectancy L 75.7769 years
New life expectancy L’ 76.1741 years
Exact ΔL ΔL = L - L’ 0.3972 years
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ 0.3840 years
Use number from paper ΔL ≈ est(ΔHR) × L̄ 1.0989 years

Another nightmare case is an intervention that starts out harmful, but then switches to being helpful at older ages:

Now, using a number from a paper doesn’t even give an estimate with the right sign.

Thing Formula Number
Original life expectancy L 75.7769 years
New life expectancy L’ 75.5006 years
Exact ΔL ΔL = L - L’ -0.2764 years
Ideal approximation ΔL ≈ avg(ΔHR) × L̄ -0.2348 years
Use number from paper ΔL ≈ est(ΔHR) × L̄ +0.2709 years

That’s bad. But I think most interventions probably aren’t like that? My guess is that most real interventions vary somewhat with age, but they do so gradually and without switching sign. In those cases, it’s quite difficult to find cases where plugging in the number from a paper is off by more than 30% or so. If you don’t believe me, just try it.14

TLDR

If we were another species, it might be very hard to convert from hazard ratios to changes in life expectancy. But for modern people in rich countries, there are three lucky coincidences:

  1. Mortality risk happens to be distributed so that you can approximate changes in life expectancy through a simple weighted sum of hazard ratios at different ages, ignoring interactions.
  2. The statistical method that people use to estimate scalar hazard ratios can also be approximated as a weighted sum of hazard ratios at different ages, ignoring interactions.
  3. The weights that you need to estimate life expectancy (from #1) and the weights that are implicitly used to compute hazard ratio numbers (from #2) aren’t the same. But they’re fairly close.

These facts justify taking an estimated hazard ratio number HR from a paper and approximating the change in life expectancy as ΔL ≈ ln(1/HR) × 12.93 years or, if the hazard ratio is close to one and you hate logarithms, as ΔL ≈ (1-HR) × 12.93 years.

dl_vs_hr_both

The number 12.93 years is for US males. It’s the product of Keyfitz entropy (0.17) and baseline life expectancy (75.8 years). It will vary a bit in other populations.

If the true underlying hazard ratio:

  • …is constant across ages, then the above approximation will be extremely good.
  • …decreases as people get older, that approximation will overestimate ΔL. That is, it will make helpful interventions look better than they actually are, and it will make harmful interventions look less bad than they actually are.
  • …increases as people get older, that approximation will underestimate ΔL. That is, it will make helpful interventions look less good than they actually are, and it will make harmful interventions look worse than they actually are.

But as long as the true underlying hazard ratio isn’t too crazy, there’s probably not more than ~30% error in either direction.

Finally, two major caveats: First, the above discussion assumes that the hazard ratio was estimated by running a trial on people of all ages. In general, est(ΔHR) implicitly gives weight to different ages proportional to how many deaths occur at those ages in the baseline population in the trial. If there’s a minimum age of, say, 50 years old, that won’t change too much because most of the mass of P(t) is above the age of 50 anyway. But if there’s a minimum age of 70, or a maximum age of 50, that could make a huge difference if the true hazard ratio is different at the ages that weren’t seen.

Second, these are estimates for the life expectancy for a population. But you are not a population. In some sense, your genetics and lifestyle mean you have your own “personal Keyfitz entropy”, reflecting how spread out your mortality would be for you if you led millions random lives. If you drive safely and use an air purifier and eat well and get exercise and don’t smoke, that likely means your personal life expectancy is higher than average. But it also probably means that your personal Keyfitz entropy is lower than average.15 So, if you make your lifestyle even better by eating more fiber or whatever, even if that produces the same hazard ratio for you as for other people, it would still likely lead to smaller increases in life expectancy, for the same reason that the same hazard ratio produces smaller changes in lifespan in humans compared to mice. What we really need is some interventions strong enough to break the math behind these approximations and free us from Keyfitz tyranny.

  1.  

  2. I know, I know, you care about quality of life, not just years of life. I agree, some number that measures health and vitality, maybe disability-adjusted life years or quality-adjusted life years, would be better. But these are hard to estimate and so are rarely reported. Anyway, in practice most interventions that make you more vital tend to make you live longer and vice versa, so focusing on life expectancy isn’t too bad. 

  3. In this model, the number of days of life follows a geometric distribution with p = (number of bullets) / (number of chambers). So the mean life expectancy is 1/p days or (number of chambers) / (number of bullets) days. With 54,786 chambers and 2 bullets, that works out to 75 years. And if you drop down to one bullet, then it increases to 150 years. 

  4. If some intervention would have reduce mortality among people aged ≥ 60 in prehistorical tribal bands, that wouldn’t have increased life expectancy very much, because most people didn’t make it to 60. But compared to prehistorical tribal bands, we have in fact vastly reduced mortality at younger ages. And so, today, reducing mortality for people aged ≥ 60 will increase life expectancy a lot. 

  5. You might think this is stupid. Why change a relative risk into a hazard ratio if you’re just going to assume it’s constant? Isn’t that pointless? Well, no. Remember how relative risks always go to 1.0 for long enough trials as everyone in both the treatment and control groups departs our coil? That doesn’t happen with constant hazard ratios. 

  6. It’s usually (though not always) better to use ΔHR(t) = ln(1/HR(t)). This correctly reflects, for example, that if all hazard ratios go to zero, then life expectancy goes to infinity, yay. These two approximations are almost identical for hazard ratios that are close to one because ln(1/r) ≈ (1-r) when r is close to one. So if you are terrified of logarithms but you’ve made it to the end of this footnote anyway, you’re not missing out on too much. 

  7. There’s a degree of circularity to this argument. It assumes that hazard ratios transfer better between species than changes in life expectancy. That might be true, but it would be an empirical / biological fact, not something that’s guaranteed by logic. 

  8. To see this, note that ΔL ≈ ∑ₜ ΔHR(t) × P(t) × L(t) = L̄ × ∑ₜ ΔHR(t) × (P(t) × L(t) / L̄) = L̄ × avg(ΔHR)

  9. A pretty decent approximation turns out to be

      avg(ΔHR) ≈ 0.27 × avg₂₀₋₅₀(ΔHR) + 0.73 × avg₅₀₋₉₀(ΔHR),

    where avg₂₀₋₅₀(ΔHR) represents a flat average of the change over the ages 20 to 50 and avg₅₀₋₉₀(ΔHR) represents a flat average over the ages 50 to 90. 

  10. That is, it’s better to use est(ΔHR) = ln(1/est(HR)). This is close to 1-est(HR) when est(HR) is close to one. 

  11. If there is an infinite amount of data, the typical method reduces to solving

      ∑ₜ (P(t) + P’(t)) × π(t, HR) = ∑ₜ P’(t),

    for HR. Here, P’(t) is the chance of dying at age t after the hazard ratio has been applied, and π(t, HR) is the probability that, if a death occurred at time t, it was in the treatment group. Of course, the true probability that a death is in the treatment group is P’(t) / (P(t) + P’(t)). The standard “proportional Cox” model assumes that the hazard ratio is constant and so replaces this raw fraction with a model-based one, namely

      π(t, HR) = S’(t) × HR / (S(t) + S’(t) × HR).

    This reflects the fact that at age t, a fraction S(t) of controls are alive and each of these have some chance μ(t) of dying, so P(t)=S(t) × μ(t). Meanwhile, a fraction S’(t) of the treatment group is alive, and these each have a chance HR × μ(t) of dying, meaning that P’(t) = S’(t) × HR × μ(t). If you substitute these equations for P(t) and P’(t) into the second equation above, the factor of μ(t) conveniently cancels and you get π(t, HR) as written.

    In effect, the hazard ratio’s job is to attribute deaths to the treatment versus the control group. Now, if the true time-varying HR(t) is close to one, then it can be shown that the estimated hazard ratio est(HR) approximately satisfies

      ln(est(HR)) ≈ ∑ₜ P(t) ln(HR(t))

  12. The geometric average is equivalent to the condition that

      ln(est(HR)) ≈ ∑ₜ P(t) ln(HR(t))

    Using the “better” approximation that ΔHR(t) = ln(1/HR(t)) and *est(ΔHR)=ln(1/est(HR)), it follows that

      est(ΔHR) ≈ ∑ₜ P(t) ΔHR(t).

    You can justify interpreting that same equation using est(ΔHR) = 1-est(HR) and ΔHR(t)=1-HR(t) from the fact that these are almost the same when HR(t) is close to one. 

  13. This simulator pretends that people live for integer numbers of years. That’s not true in reality, of course, but it makes the simulator easier to implement and understand and makes little difference in practice. 

  14. In the simulation, “true ΔL” is what I called “exact ΔL” above, while “approximation (log)” is what I called “ideal approximation” and “Cox fitted” is what I called “Use number from paper”. 

  15. The way modern human mortality is distributed, even if your healthy lifestyle were to reduce mortality by a constant factor at all ages, that still has the effect of decreasing Keyfitz entropy. 

Blink if you’re human

2026-06-26 08:00:00

I write every word I post on this blog myself. I can’t prove this, of course, but there’s some evidence:

  • This blog existed before AI could write blog posts.
  • If you put any of my posts into an AI-detector they will (I assume) come back squeaky clean.

And now let me add this: I, dynomight, guarantee that every word I post here is the product of me physically hitting keys with my fingers. The only exceptions would be quotes from other humans or something that’s clearly labeled as an AI output.

How is that evidence? Well, say you think I’m a low quality person and I do use AI but I’m lying and I’ve figured out how to evade AI-detectors. OK, ouch. But consider: It’s extremely likely that AI-detectors will improve in the future. (More precisely, it’s likely that future AI-detectors will be better than current AI-detectors at detecting current AI.) If I were using AI, and a future AI detector later caught me, the fact that I made the above promise would be really embarrassing.

You may be thinking that this looks gross and self-congratulatory. So I’d like to stress that the above guarantee is carefully worded. I do often use AI “for research”, just not “for writing”. (We’ll come back to that distinction.) And I don’t think there’s anything intrinsically wrong with using AI to write blog posts. I don’t do it personally, mostly because:

  1. I like writing.
  2. The act of writing itself helps me figure stuff out.
  3. This is a hobby. If you start automating your own hobbies—just what the hell are you doing?

I also don’t use AI for writing because—can we just admit it?—no one wants to read AI-generated essays. Or, rather, people love reading AI-generated essays, but when they want to read one, they will ask an AI for it themselves, thank you very much.

I know the counterarguments. What does it matter where the words came from? Shouldn’t you judge them on their own merits? Maybe. That’s a legitimate way to look at things. But empirically, I think most people don’t agree.

(I also know you’re counting the em-dashes. Count away, I’m still human.)

Here’s an oddly neglected question: Take all the essays that are AI-generated or heavily AI-assisted by one person and then given to someone else to read. In what percentage of cases does the first person disclose the AI usage? Ignore everything related to education if you want. You can even ignore emails. I suspect the answer is still <20%.

Why do people care about this? Several reasons. One is proof of work. If I, a human, write eight thousand plausible-seeming words about vitamin D, that proves that I’ve put some time and effort into understanding vitamin D. That suggests giving some weight to my opinion, even if just to best exploit the wisdom of crowds. That doesn’t work if my essay is secretly AI-generated.

And writing isn’t just cold clinical information-sharing. It’s a kind of parasocial interaction. I know “parasocial” sounds sinister, but I maintain that parasocial relationships are often a perfectly healthy way to adapt our primitive social instincts to the modern world. Anyway, good or bad, that’s part of it.

I bring this up because I’m worried that blogs are heading into a sort of lemon market. You’ve surely had the experience of reading an essay only to slowly become dismayed as you realize it was AI-written. What’s the equilibrium? I expect that some people have already cut back on reading essays, at least from non-established authors. Over time, I expect this will lead to fewer humans writing essays, further increasing the density of AI-generated content, driving more people to cut back on reading, et cetera. This is bad because blogs are good.

As that cycle turns, social norms are also changing. Cast your mind back to the old world, five years ago. At that time, if you had started a blog and posted AI-generated essays without telling anyone, I’m reasonably certain that would have been considered a dick move. (Future generations will marvel.) But today, the largest corporations appear to do that all the time. There’s incredible momentum towards a world where AI can be used anywhere, for any purpose, with no disclosure, and that’s fine.

But it is fine! At this point, trying to bully people into proactive disclosure is just a tax on honesty / conscientiousness / integrity. Instead, I suggest we agree that arbitrary usage is, by default, fine. Instead, let’s work at the other end: If you have chosen to impose limits on your AI usage, then state those limits publicly. If you’re human, tell me.

Obviously, this is no panacea. People can lie. But they can’t do so without taking some reputational risk, because if you use AI and lie about it, how long will your secret stay safe? No one knows because for once the unpredictability of technological change is on our side.


However. HOWEVER. I am not suggesting that we should bully writers into declaring that they are AI-free. I think that’s a terrible idea, because AI use comes on a spectrum. Already today, most people surely use it at least a little. (Do you avert your eyes when AI summaries come up at the top of search results?) Arguably, most people should use AI at least a little. We need to acknowledge that writing is entering the centaur era.

For context: Computers beat humans at chess in 1997. But for years after that, human + AI “centaur” teams could still beat both the best humans and the best chess AIs. Slowly, the value humans contribute to those teams has diminished, and today it’s somewhat unclear if centaurs still hold any advantage over pure AIs.

Humans are still better at blogging than AIs. (Though perhaps not better at literary short fiction.) In chess time, blogging is still pre-1997. But it’s a historical coincidence that no one seems to have cared about centaur chess before 1997. If people had tried, I suspect centaur chess teams could have beaten the best human players much earlier. So, to stretch our analogy, I’d put blogging around 1990 in chess time, in an alternate timeline where there was vast interest in centaur chess in the 1970s and 1980s.

I mean, what exactly can you do while still considering your essay “human written”? Can you:

  1. …look at AI summaries at the top of search results?
  2. …ask AI to find spelling or grammar errors?
  3. …use AI as an advanced thesaurus? (“Give me 50 words with meanings interpolating between ‘aggressive’ and ‘punctilious’.”)
  4. …ask AI factual questions when doing research?
  5. …trust the answers, or verify them yourself?
  6. …ask AI for options to rephrase an awkward sentence?
  7. …use those options verbatim?
  8. …ask AI for high-level organizational suggestions?
  9. …ask AI to to make figures / tables / code?
  10. …run an entire essay through an AI to “clean it up”?
  11. …ask an AI to give a rough prototype of the next section?

I don’t feel super-comfortable saying this, but I sometimes do all of those except #7, #10, and #11.

Wait! Let me explain! I probably do #3 or #6 around once per post. For #5, I usually verify, but when trying to understand something, I read a lot of sources. I try to mentally mark AI-derived facts as unreliable, but I don’t formally track the provenance of every single part of my mental model. I rarely do #8, and even-more rarely accept the suggestions, because AI seems to dislike me as a person and wants to purify my writing of all life and personality. But, in want of a human editor, I sometimes find it helpful. And no matter what, if any information flows from AI into my writing, it does so through my fingers, being written in my own words, never cutting and pasting, not a single word, never-ever.

On a spectrum where 0 = “refuses to look at AI summaries in web searches” and 100 = “puts a single prompt into an AI and posts the output without revisions”, I’d put myself at, I don’t know, 10?

Again, saying all that feels gross. (Somehow it feels like admitting to something shameful and simultaneously an exercise in arrogant self-congratulation? It’s remarkable.) I don’t know how my position on that spectrum compares to other writers, because almost no one discloses any AI usage at all.

But come on people. Democracy dies in darkness! We’re now at the point where readers default to assuming some relatively high (and increasing) level. I’m convinced that many people use AI in ways that are almost completely unobjectionable, but they’re too scared to admit it. This muddies the distinction between different parts of the spectrum, and exacerbates the dynamic where people are too afraid to read anything, lest they later realize it is “slop”.

We need to come to terms with the idea that for most writers, the optimal amount of AI usage is not zero. I’m sure that most people would say that some kinds of usage are normal / expected / good, while other kinds are aberrant / duplicitous / slop. But people have different opinions, and this is all shifting as technology and culture develop.

Unsurprisingly, I like the idea of people drawing the line close to where I did. But I’m willing to accept a fairly wide range, provided you’re upfront about it. Usually, if I sense the invisible hand of heavy AI editing, I sigh and unsubscribe. But Trevor Klee (an excellent blogger) has a couple posts where he says, “here’s an output from ChatGPT I thought was interesting.” Not only did I not unsubscribe, I actually attempted to read that output.

Still, I think it’s important to draw some line, not just to communicate to the outside world, but also for yourself. There’s a very blurry boundary between using AI “for research” or “to catch grammatical errors” and using it “for writing”. It’s very easy to slip from asking AI factual questions, to asking it to find errors in what you wrote, to asking it to fix those errors, to asking it to generate whole paragraphs of text. Each of those steps is easy to justify. So if you want to operate at some position on the spectrum, it’s probably best to choose some boundaries and then enforce them.

(AI used in the construction of this post: None.)

The worthlessness of vitamin D is mildly exaggerated

2026-06-23 08:00:00

For a while there, many people thought vitamin D was magical—that it could improve bones, the heart, infections, cancer, heart disease, longevity, even mental health. But among people I respect, opinion is now overwhelmingly that taking vitamin D does nothing unless you’re severely deficient. The central argument is that while vitamin D levels are correlated with ~all positive health outcomes, when you actually test vitamin D supplements against placebo in randomized trials, nothing ever happens.

That’s what I used to think, too. But I’ve come to think the skeptics have over-corrected. Yes, randomized trials have shown that the magical correlations are not causal. But if you start with non-insane expectations, the trials look like weak but positive evidence. And if you consider what we know about biology and evolution, I think the balance of evidence tips pretty clearly in the direction that people with low-ish levels would be wise to supplement.

Am I certain that vitamin D is beneficial for people with low-ish levels? Absolutely not! But I claim that’s the best bet given the limits of our knowledge.

The classical view: Boring bone vitamin

Most vitamins are “ingredients” that the body uses to do stuff. Vitamin D is more like a “signal” that the body uses to communicate with itself about what to do.1 The classical “endocrine” story of vitamin D is that your body uses it to tell your guts to take in more calcium from food. If you don’t get enough vitamin D, then you have calcium problems.

That’s all you really need to know about the classical view. But if you enjoy gawking at biology’s complexity, I recommend this diagram and the following three paragraphs:

Ready for science? OK: Almost all the cells in your body make provitamin D.2 Usually, this is all converted to cholesterol, but your skin cells leave some sitting around. When UVB light hits those skin cells, provitamin D is transformed (physically by the light itself) into previtamin D and then (by heat) into vitamin D. This diffuses from the skin cells into blood vessels. There it binds to a protein3 and starts circulating in the blood, where it is joined by vitamin D from food.4 Eventually, the liver converts it into more-stable storage vitamin D. It also soaks in and out of fat and muscle tissue, which acts as a slow-release reservoir.

Now, a fun fact: If calcium levels in your blood get too low, then your heart will stop working and you will die. To avoid this, you have parathyroid glands in your neck that sense when calcium is getting low, and release parathyroid hormone into the blood. This tells your bones to release some of their stored calcium. It also tells your kidneys to convert some of the storage vitamin D from your blood into active vitamin D. And when that gets to your guts, they try to absorb more calcium from food.

So what happens if you don’t get enough vitamin D? Well, your body is not going to let calcium levels drop too low, because your body is designed to avoid death. Parathyroid hormone will still get secreted, and calcium will still get scavenged from your bones. But without vitamin D, your guts never get the signal to gather extra calcium from food. So the body scavenges a lot of calcium from your bones, and you end up with weak bones, which is bad.

Now here’s the thing: In this story, only active vitamin D actually does anything. The kidneys make this on demand in response to calcium levels, not in response to storage vitamin D levels. General opinion is that as long as the blood has above ~25 nmol/L of storage vitamin D, then the kidneys have no trouble making active vitamin D.5 Furthermore, survey data suggests that only ~2% of the population has levels below that threshold. This suggests that for ~98% of people, supplementing vitamin D should do approximately nothing.

The correlation view: Magical mystery cure

Rickets is a terrible disease that involves soft bones, stunted growth, and skeletal deformities. It’s probably been with us since ancient times, but it became common in the West after the industrial revolution. In 1890, a Scottish missionary named Theobald Palm observed that rickets was common in smog-ridden UK cities but almost unheard of in sunny countries with poor sanitation, suggesting sunlight itself was the issue. This contributed to the discovery that rickets could be cured with UV light or cod-liver oil, and eventually the discovery of vitamin D.

In 1941, Apperly noticed that the amount of sunlight in different US states was positively correlated with skin cancer but inversely correlated with overall cancer mortality.6 He gave this charming graph:

Apperly never mentions vitamin D, presumably because he thought it was a boring bone vitamin.

Things took off in 1980, when Cedric and Frank Garland published, “Do Sunlight and Vitamin D Reduce the Likelihood of Colon Cancer?” Seemingly unaware of Apperly, they gave a similar, but uglier, graph:

They point out that regional diets (like meat and fiber) didn’t seem to explain this pattern. Instead, they propose a mechanistic story:

    Sunlight
        ↓
    Vitamin D
        ↓
    Adequate calcium in blood
        ↓
    Reduced inflammation of epithelial cells in the colon
        ↓
    Less colon cancer

(It’s always inflammation.) This paper was rejected many times before finally being published. I wish I could find an un-gated copy to link to, because it would have made a magnificent blog post.7

Following that paper, there was an explosion of work that found negative correlations between sunlight (or latitude) and other types of cancers as well as blood pressure, diabetes, and multiple sclerosis.

Then people started measuring vitamin D in blood. In 1989, the Garlands and collaborators found blood samples takin in 1974 from 25,000 people. They found that 34 of those people had since gotten colon cancer. They matched these with 67 demographically similar people and measured vitamin D levels in the stored blood samples for all 101 people. Among that group, people with vitamin D levels below 50 nmol/L got colon cancer more than three times as often as people with higher levels.

Again, many similar studies followed. These linked higher vitamin D levels to better outcomes in cardiovascular disease, diabetes, obesity, infectious disease, Parkinson’s, and mood disorders. While results were mixed for non-colorectal cancer incidence, higher vitamin D levels predicted better survival of many cancers. Amazingly, all-cause mortality was roughly 30% lower for those at the 75th percentile of vitamin D levels compared to the 25th.

Vitamin D was looking like a miracle. But how could it do all that stuff if it was just a boring bone vitamin?

Meanwhile in biology

While all these correlations were being discovered, we learned that the body doesn’t just use vitamin D for bone stuff.

In 1969, we discovered the vitamin D receptor that active vitamin D binds to in the gut and bones. And in the 1980s came a shock: Almost all cells in the body have vitamin D receptors. These seem to do different things in different tissues. In the pancreas, they support insulin secretion. In immune cells, they boost antimicrobial peptides and reduce inflammation. In neurons, they influence proliferation and differentiation.

So… What? When calcium drops and the kidneys put out active vitamin D, does every part of the body start doing different unrelated stuff?

In the late 1990s, we cloned the gene for the enzyme that the kidneys use to convert storage vitamin D to active vitamin D. Soon came another shock: This enzyme also exists in tons of other cells, including immune cells, the heart, the skin, the prostate, the breast, and colon. (Another win for the Garlands.)

So it’s not just the kidneys making active vitamin D to trigger the gut. Cells everywhere are making their own active vitamin D and using it to trigger vitamin D receptors in neighboring cells, or even inside the same cell.8 This often has little to do with calcium or bones.9

So:

  1. The kidneys use vitamin D as a boring bone hormone.
  2. As long as the blood contains at least ~25 nmol/L of storage vitamin D, the kidneys don’t care. They create the same amount of active vitamin D, in response to calcium levels.
  3. But now cells everywhere are using storage vitamin D.
  4. To do god-knows-what.
  5. With god-knows-what sensitivity to circulating vitamin D levels.

And remember how only active vitamin D does anything? That’s wrong. In the mid-1970s, we learned that storage vitamin D also binds to the vitamin D receptor. The binding affinity is 100-1000× lower, but you have ~1000× more in your blood. So maybe circulating levels of storage vitamin D themselves matter, independently of how much active vitamin D gets made?

If that’s not confusing enough, people also noticed that while active vitamin D levels in the blood aren’t correlated with storage vitamin D (above ~25 nmol/L), levels of parathyroid hormone (the thing your parathyroid glands use to tell your kidneys to make active vitamin D) seem to decline as levels of storage vitamin D rise from ~25 to 50 or 75 nmol/L. Huh?10

On the one hand, all this makes the idea that vitamin D could be a miracle more plausible. On the other hand, this is getting complicated. And do we really believe that raising your vitamin D levels from the 25th to the 75th percentile could reduce your risk of death from any cause by thirty percent? Maybe we should try giving people vitamin D and see what happens.

Then came the RCTs

There have been many randomized trials. The “right” thing to do in such cases is to look at meta analyses that carefully combine all the data. We’ll get to those. But they conceal a lot of important nuance about what actually happens on the ground during these trials. So let’s start by going over the three main “megatrials”.

The Women’s Health Initiative (WHI) trial came out in 2006 and is still the largest vitamin D trial ever done. This took 36,000 postmenopausal American women and assigned half to take 400 IU daily with calcium and the other half to placebo.11 After seven years, here’s what happened:12

Outcome (WHI trial) Hazard ratio
Fractures 0.97 (0.91 to 1.03)
Cancer 0.97 (0.91 to 1.04)
Cancer mortality 0.90 (0.77 to 1.05)
CVD mortality 0.94 (0.78 to 1.12)
All-cause mortality 0.92 (0.83 to 1.01)
Kidney stones 1.17 (1.02 to 1.34)

(The hazard ratio is the ratio of the rate that something happens in the treatment vs. placebo groups. So, a number less than one suggests a benefit to taking vitamin D, while a number larger than one suggests a harm. The numbers in parentheses show a 95% confidence interval.)

The only statistically significant result was a bad one: Extra kidney stones, likely from the extra calcium.13 The other outcomes look vaguely good, but none were statistically significant despite the massive sample size.

This was disappointing. However, the WHI trial had limitations: Many subjects in both the vitamin D and placebo groups were already taking vitamin D, and continued taking it through the trial. The dose of 400 IU was fairly low, many subjects stopped taking their pills, and vitamin D levels didn’t actually change that much. They also measured vitamin D levels in only 6% of subjects, meaning we can’t compare the fates of subjects who started out with low versus high levels.

The next big hope was VITAL, which came out in 2018. They recruited 26,000 older people across the United States, half of them men and 20% Black (and thus far more likely to be vitamin-D deficient). They measured vitamin D levels in most people, and they gave the treatment group 2,000 IU per day.14 Here were the results after 5.3 years:

Outcome (VITAL trial) Hazard ratio
Diabetes 0.91 (0.76 to 1.09)
Autoimmune disease 0.78 (0.61 to 0.99)
Cancer 0.96 (0.88 to 1.06)
Cancer mortality 0.83 (0.67 to 1.02)
Major CVD event 0.97 (0.85 to 1.12)
CVD mortality 1.11 (0.88 to 1.40)
All-cause mortality 0.99 (0.87 to 1.12)

Some of the results look good-ish, but cardiovascular mortality was higher in the treatment group, leading to almost no effect on all-cause mortality.15 More disappointment.

The last megatrial was D-Health, which came out in 2022 based on 21,000 older Australians. Instead of daily supplements, it used a monthly “bolus” dose of 60,000 IU or placebo. Unlike in VITAL, there was no exclusion for people with a history of cardiovascular disease or cancer, and less restriction on how much vitamin D participants could take on their own during the trial.16 Here were the results after 6 years:

Outcome (D-Health trial) Hazard ratio
Cancer mortality 1.15 (0.96 to 1.39)
Major CVD event 0.91 (0.81 to 1.01)
CVD mortality 0.96 (0.72 to 1.28)
All-cause mortality 1.04 (0.93 to 1.18)

Now, the treatment group did better in terms of cardiovascular disease, but worse in cancer and worse in all-cause mortality. Even more disappointment.

Just from these three large trials, the main lesson should already be clear: Vitamin D is not a miracle. The correlations were wrong.17 There is essentially zero remaining hope that taking vitamin D could reduce all-cause mortality by a third.

In this sense, the vitamin D skeptics are definitely right. But what about the other trials? And is there a more subtle lesson?

I made some tables

I wanted a big table that summarized all the major vitamin D RCTs and what they found for different health outcomes. Annoyingly, no such overview appears to exist. So I made my own:18

Trial Cancer Cancer mortality CVD CVD mortality All-cause mortality
Lips 1996         0.92 (0.80 to 1.06)
Trivedi 2003 1.08(0.89 to 1.31) 0.86 (0.61 to 1.21) 0.95 (0.86 to 1.04) 0.86 (0.67 to 1.11) 0.90 (0.77 to 1.07)
WHI 2006 0.98 (0.90 to 1.05) 0.89 (0.77 to 1.03)   0.94 (0.78 to 1.12) 0.92 (0.83 to 1.01)
Lyons 2007         0.99 (0.93 to 1.05)
WFPT 2007         1.00 (0.87 to 1.15)
RECORD 2012 1.04 (0.91 to 1.19) 0.83 (0.55 to 1.26)   0.91 (0.79 to 1.05) 0.93 (0.85 to 1.02)
Lappe 2017 0.70 (0.47 to 1.02)        
VITAL 2018 0.96 (0.88 to 1.06) 0.83 (0.67 to 1.02) 0.97 (0.85 to 1.12) 1.11 (0.88 to 1.40) 0.99 (0.87 to 1.12)
ViDA 2018 1.01 (0.81 to 1.25) 0.99 (0.60 to 1.64) 1.02 (0.87 to 1.20)   1.12 (0.79 to 1.58)
D2d 2019 1.07 (0.70 to 1.62) 0.23 (0.03 to 1.86)      
DO-HEALTH 2020 0.76 (0.49 to 1.18)   1.37 (0.88 to 2.14)    
D-Health 2022   1.15 (0.96 to 1.39) 0.91 (0.81 to 1.01) 0.96 (0.72 to 1.28) 1.04 (0.93 to 1.18)
FIND 2022 1.04 (0.72 to 1.51) 1.14 (0.56 to 2.33) 0.90 (0.62 to 1.32) 0.85 (0.28 to 2.53) 0.81 (0.32 to 2.06)

Lots of the hazard ratios are less than one, suggesting a benefit to supplementation. But lots of them are also higher than one, suggesting a harm. The numbers that are far from one almost always come from smaller trials, which manifest as larger confidence intervals. If you’re interested in the details of how these trials were run, I refer you to more gigantic tables in a footnote.19

If big tables aren’t your thing, here are some formal meta-analyses, both some recent ones and an older but more comprehensive Cochrane review:

Outcome Meta analysis Hazard ratio Comment
All-cause mortality Bjelakovic 2014 (Cochrane) 0.96 (0.92 to 0.99) Trials with low risk of bias.
Cancer mortality Bjelakovic 2014 (Cochrane) 0.88 (0.78 to 0.98)  
Cardiovascular mortality Bjelakovic 2014 (Cochrane) 0.98 (0.90 to 1.07)  
Cancer mortality Kunzia 2023 0.94 (0.86 to 1.02)  
All-cause mortality Ruiz-García 2023 0.96 (0.91 to 1.00) Good-quality trials
Cardiovascular mortality Ruiz-García 2023 1.00 (0.92 to 1.08) Good-quality trials
All-cause mortality Cao 2023 0.99 (0.96 to 1.03)  

Squinting at the data

There are various ways you could try to squint at these RCT. In almost all of them, most people already had pretty high levels before they started. So why don’t we separate out people who started low? Usually we can’t, because most trials didn’t measure baseline vitamin D.20 And among the trials that did, there are few people with low levels, so the results are noisy and confusing.21

Or, you might theorize that benefits would take time to show up, meaning the first couple years just add noise. In some cases—notably VITAL—excluding the first two years seems to help, but in other cases things get worse.22

Finally, some people speculate that taking gigantic monthly or quarterly “bolus” doses of vitamin D might be dangerous. For example, here’s an enjoyable paragraph from Kunzia et al. in their meta-analysis of vitamin D and cancer mortality:

Our results showing efficacy of daily, but not bolus, vitamin D3 supplementation in reducing cancer mortality are consistent with previous meta-analyses on cancer mortality or all-cause mortality (Guo et al., 2022; Keum et al., 2022; Keum et al., 2019; Zhang et al., 2022; Zhang et al., 2019). However, by including more trials than these previous meta-analyses, we were able to detect statistically significant effect modification by treatment regimen for the first time with statistical significance (pinteraction=0.042). The pattern of intake could be important for a favourable steady state of the bioavailability of the active 1,25 (OH)₂D hormone. Daily administration counteracts the fast excretion of vitamin D from the circulation (Hollis and Wagner, 2013; Keum et al., 2022). Moreover, the enzymes CYP27B1 (converts 25(OH)D to 1,25 (OH)₂D) and CYP24A1 (inactivates 25(OH)D and 1,25(OH)₂D) follow first-order reaction kinetics (Vieth, 2009). This means that doubling the concentration of the precursor doubles the yield of the product, unlike other steroid hormones (e.g., cortisol, oestrogen, testosterone) that follow zero-order kinetics (Vieth, 2020). Intermittent, non-physiologically large vitamin D3 bolus doses may lead to unstable cycling of 25(OH)D and 1,25(OH)₂D levels in blood because the system needs time to adapt to the large doses (Hollis and Wagner, 2013; Keum et al., 2019; Vieth, 2020). In the long run, intermittent bolus regimens at weekly or larger intervals can lead to an up-regulation of countervailing factors (e.g., 24-hydroxylase (CYP24A1), 24,25(OH)2D and fibroblast growth factor 23), all of which ultimately leads to lower synthesis or higher degradation of 1,25(OH)₂D levels (Mazess et al., 2021). Bolus doses, unlike daily doses, failed to reduce C-reactive protein response and actually elevated anti-inflammatory cytokines and doubled the risk of hypercalcemia in previous studies (Krishnan et al., 2012; Martineau et al., 2017; Mazess et al., 2021).

Oh no, up-regulation of fibroblast growth factor 23!23

I don’t feel like I understand this deeply enough to have any opinion beyond the surface level that the body seems to adapt to large doses of vitamin D in ways that could possibly be bad.24 It seems intuitive that small daily doses would be safer than gigantic monthly doses, but I’m always suspicious of post-hoc mechanistic speculation. Also, if people get enough sun, they can apparently synthesize 10,000-25,000 IU per day, which isn’t that far from the 60,000 IU they got in the D-Health trial. But then again, I think Kunzia et al. are suggesting that the body is designed to adapt to regular exposure to large doses but not intermittent exposure?

Well, if you split up the trails by daily vs. bolus dosing, there’s a decent pattern of daily dosing leading to better results:

Trial (daily dosing) Cancer mortality All-cause mortality
Lips 1996   0.92 (0.80 to 1.06)
WHI (Jackson 2006) 0.89 (0.77 to 1.03) 0.92 (0.83 to 1.01)
WFPT (Smith) 2007   1.00 (0.87 to 1.15)
RECORD (Avenell 2012) 0.83 (0.55 to 1.26) 0.93 (0.85 to 1.02)
VITAL (Manson 2018) 0.83 (0.67 to 1.02) 0.99 (0.87 to 1.12)
D2d (Pittas 2019) 0.23 (0.03 to 1.86)  
FIND (Virtanen 2022) 1.14 (0.56 to 2.33) 0.81 (0.32 to 2.06)
Trial (bolus dosing) Cancer mortality All-cause mortality
Trivedi 2003 0.86 (0.61 to 1.21) 0.90 (0.77 to 1.07)
Lyons 2007   0.99 (0.93 to 1.05)
ViDA (Scragg 2018) 0.99 (0.60 to 1.64) 1.12 (0.79 to 1.58)
D-Health (Neale 2022) 1.15 (0.96 to 1.39) 1.04 (0.93 to 1.18)

If those bolus dosing trials didn’t exist, I’d think this looked pretty good. So, maybe? Or maybe this is a story made up to hallucinate a positive trend. I would lean towards the latter theory, but there are papers like Mazess et al.’s “Vitamin D: Bolus is Bogus”, that suggested this pattern before D-Health’s dismal results came out. There are even some trials that suggest bolus doses don’t even work for treating rickets. So… I’m still not convinced. But maybe.

Aside: There are also many Mendelian randomization studies that look at correlations between health and genes that are related to vitamin D. But I don’t think these provide much information, because the assumptions are shaky and the genes don’t explain much of the variance.25

Where are we?

Still with me? Here’s a summary of the above 5200 words:

  • The body uses vitamin D in all sorts of weird and complicated ways. It’s biologically plausible that vitamin D could matter beyond bone stuff with severe deficiency, but there’s no convincing mechanistic evidence that it is.
  • Vitamin D levels are strongly correlated with good health outcomes, but RCTs have conclusively shown that most of these correlations are non-causal.
  • RCTs haven’t conclusively shown any benefit for anything beyond bone stuff. At best, they’ve given weak evidence for hazard ratios slightly below one.

So you might be wondering: Isn’t that quite weak? Wasn’t this post supposed to be a defense of vitamin D?

The case for supplementing anyway

It’s biologically plausible that vitamin D is good

Everyone agrees that severe vitamin D deficiency (below ~25 nmol/L) is bad. It leads to rickets, adult rickets, osteoporosis, muscle weakness or even—with profound deficiency—to seizures or cardiac arrhythmia. This makes sense, because below ~25 nmol/L, the kidneys have trouble converting storage vitamin D into active vitamin D, meaning you don’t absorb enough calcium from food.

The question is if taking supplement to further raise your levels (say to 50 or 90 nmol/L) is important. We have no mechanistic proof, but it might be true, because many parts of the body use vitamin D as a local signal and because cells are at least somewhat sensitive to circulating storage levels. There’s also this weird thing where parathyroid hormone continues to decline as vitamin D levels rise above ~25 nmol/L even while this seems to make little difference to how much active vitamin D the kidneys make.

Nothing in this world comes without trade-offs. Surely, supplementing vitamin D comes with some downsides. But it seems very unlikely that raising vitamin D levels to a “normal” level would cause more harm than benefit. Especially because…

Humans evolved to have a lot of vitamin D

According to Luxwolda et al.’s 2012 paper, “Traditionally living populations in East Africa have a mean serum 25-hydroxyvitamin D concentration of 115 nmol/L”, traditionally living populations in East Africa have a mean serum 25-hydroxyvitamin D concentration of 115 nmol/L.

Meanwhile, Wahl et al. 2012 try to estimate mean levels around the world today:

This map looks weird because of varying lifestyle, diet, supplementation, and needing to combine fragmented studies. But you get the idea. And remember, those are just averages. So there are lots of people with levels far lower than that in our evolutionary history.

Of course, just the fact that vitamin D levels have dropped doesn’t mean it’s important. Parasitic worm load, wood smoke inhalation, and cousin marriage have also dropped, but we aren’t rushing to restore those to ancestral levels.

But there’s another piece of evidence: After humans migrated out of East Africa, some of them evolved pale skin. Pale skin is bad, because it allows light to destroy folate, which is crucial for pregnancy.26 Evolution doesn’t typically do things that harm fertility, because evolution wants to increase reproductive fitness. The most common explanation is that pale skin allows more UV light to penetrate, and thus allows people to synthesize more vitamin D. If evolution was willing to pay the high “price” of folate destruction for more vitamin D, that seems like good evidence that vitamin D is important.

Some even see contrasts like the Inuits versus Scandinavians as a kind of natural experiment: They lived at similar latitudes, but Inuits ate a diet with vitamin D (fatty fish and whale blubber) and Scandinavians didn’t. The result is that Inuits have darker skin than Scandinavians.27

This is all speculative, and even if true, might be driven by severe deficiency and rickets. Or perhaps prehistoric benefits don’t translate to your lifestyle. But all the people in Luxwolda’s sample in East Africa had levels above ~60 nmol/L. I just don’t see how you can look at this and not see it as providing some suggestive evidence in favor of the idea that raising levels above severe deficiency is unlikely to be harmful, and could be important. So I think the prior is favorable.

What do you expect from vitamin D?

A hazard ratio like HR = 0.96 doesn’t look very impressive. But hold on. Suppose that life expectancy is 80 years and that taking vitamin D every day reduces your risk of all-cause mortality by a factor of HR. A reasonable approximation in rich countries is that this would increase your life expectancy by

    80 × 0.15 × (1-HR) years = 12 × (1-HR) years,

where 0.15 is derived from the entropy of lifespan in rich countries.28 For example, if all-cause mortality had a true hazard ratio of HR = 0.96, then taking vitamin D every day of your life would increase life expectancy by around

    0.48 years.

I claim that this would be a lot. Certainly, if I were about to face my destiny, I would pay a lot of money for an extra 0.48 years. Or, you can calculate that this corresponds to an increase of life expectancy per-vitamin-D-pill of 8.6 minutes.29 A common rule-of-thumb is that smoking a cigarette costs around 11 minutes of life in expectation. If you think HR = 0.96 is trivial, do you also think that smoking one cigarette each day is fine?30

The correlational studies suggested that vitamin D might drop your risk of all-cause mortality by a third. It’s disappointing that the RCTs refuted this. But those correlational studies were crazy. They imply31 an increase of life expectancy of around 4 years or around 6.5 cigarettes per day. Could we really believe that you could smoke 6.5 cigarettes, then take a vitamin D pill, and you’re even?

Personally, I think hazard ratios just slightly less than one are the best we can reasonably hope for. But I also think that they would be an excellent return on investment. Arguably, modern human life expectancy comes from stacking lots of modest hazard ratios on top of each other.

What do you expect from vitamin D trials?

Let’s play a game. Let’s hallucinate some numbers for what vitamin D might do, and then simulate what trials would show. Here are the strongest effects I consider plausible for different baseline levels, along with how common those levels are in the United States.

Storage vitamin D (nmol/L) Hazard ratio % of population
<30 0.75 5
30-49 0.92 15
50-125 0.98 72.5
>125 1 7.5

Suppose that were real. Now, say we pick 26,000 people at random, and give half of them vitamin D for five years. Here are the results of a million simulated trials, assuming a baseline mortality risk of 0.7%:32

Overall, 9% of trials would find a significant benefit, 63% would find a non-significant benefit, 27% would find a non-significant harm, and 1% would find a significant harm.

If you wanted to have an 80% chance of finding a significant decrease, you’d need to run a trial with something like 570,000 people, almost five times more than in all the above trials combined.33 If you don’t like my numbers, I’ve put up a page where you can run your own simulations with different ones.

My point is, the results we see in vitamin D RCTs are what we should expect to see if vitamin D had plausible benefits. That’s not proof, of course—just that if you start with realistic expectations, the trials don’t provide much evidence in either direction.

The trials do find slightly helpful numbers

Recent meta-analyses have not consistently found a statistically significant benefit to vitamin D supplementation. But they do suggest a small benefit for cancer mortality and all-cause mortality, and they’re close to being statistically significant. That’s something.

And if you buy the argument that bolus dosing is bad, the results get even better. Kunzia et al. did a meta-analysis of cancer mortality using only trials with daily dosing, and found a hazard ratio of 0.88 (confidence interval 0.78 to 0.98). I’d keep this at arm’s length. The bolus dosing trials might have done worse by random chance, meaning this is a kind of p-hacking. But there’s a reasonable chance (maybe 25-50%) that bolus dosing really is bad, in which case those trials would be convincing evidence.

I actually think it’s surprising that the meta-analyses look as good as they do, because there just aren’t that many people who started out with low vitamin D levels. Only a handful of trials had mean levels below 60 nmol/L, and they all give semi-promising results:34

Trial (low-ish baseline) Cancer mortality All-cause mortality
Trivedi 2003 0.86 (0.61 to 1.21) 0.90 (0.77 to 1.07)
WHI (Jackson 2006) 0.89 (0.77 to 1.03) 0.92 (0.83 to 1.01)
Lyons 2007   0.99 (0.93 to 1.05)
RECORD (Avenell 2012) 0.83 (0.55 to 1.26) 0.93 (0.85 to 1.02)

Again, it’s dangerous to dig too deeply looking for these kinds of patterns. If you dig enough, you can always find a way to confirm whatever theory you want. But also again, maybe?

You’re probably already taking vitamin D

You might not personally supplement vitamin D. But for most people reading this, someone else is supplementing it for you.35

Country Commonly fortified with vitamin D
Australia Margarine
Belgium Margarine
Canada Milk, margarine
Chile Milk, flour
Ethiopia Oils
Finland Milk, yogurt, margarine
Ireland Margarine, cereal
New Zealand Margarine (from Australia)
Norway Margarine, low-fat milk
Pakistan Oils
Poland Margarine
Sweden Milk, yogurt, plant milk, margarine
United Kingdom Margarine, cereal
United States Milk, plant milk, margarine, cereal, yogurt

Fortified food is common across the Anglosphere and Scandinavian peninsula. However, it’s rare in the rest of Europe (exceptions: Belgium, Poland) and even-more rare in the rest of the world (exceptions: Chile, Ethiopia, Pakistan).

I think this is important for two reasons. First, vitamin D is oddly self-defeating. There are some places in the world where people care about vitamin D. These are the places that run large trials. But these places also fortify their food and tend to be full of people that already supplement vitamin D. These places also tend to believe it’s unethical to tell the control group not to take vitamin D.

And here’s another question: If you think vitamin D is worthless, are you comfortable recommending removing vitamin D from food? If not, then why is the particular amount of fortification in food now the right one?

Some might argue that the purpose of fortification is to reach the severely deficient, or children, the elderly or pregnant mothers. Maybe! But again, if you could press a button and remove fortification from everyone else, would you feel comfortable pushing that button? Remember, trials don’t test going down from current levels, only going up.

So that’s my story

  • Biology and evolution suggest a prior that moderate levels of vitamin D (say 80 nmol/L) are quite possibly better than low levels (like 40 nmol/L) and unlikely to be worse.
  • Observational studies say that vitamin D is magical, but those studies are bad and we should ignore them.
  • The RCTs show that vitamin D is non-miraculous. But beyond that they don’t provide much information, because they mostly enrolled people with moderate vitamin D levels, meaning plausible effects would require colossal sample sizes to reliably detect.
  • What evidence the RCTs do provide points weakly towards a modest benefit.
  • If real, that benefit would far exceed the cost of taking vitamin D.
  • Therefore, if you have low vitamin D, it seems wise to supplement.

This is all very weak, I know! But sometimes weak evidence is all we’ve got.

I wish we had at least one large trial done in a population with low starting levels. But as far as I can tell, none are underway. In fact, it’s unlikely that there will be any more large trials anytime soon. So weak evidence is how it’s going to be.

  1. Technically, vitamin D itself is a type of steroid although not what people usually mean by “steroid”. 

  2. Here are some of the fancy names for the different forms of vitamin D I’ll talk about:

    my name fancy names
    provitamin D 7-dehydrocholesterol
    previtamin D previtamin D₃
    vitamin D cholecalciferol
    storage vitamin D calcifediol / ergocalciferol / 25(OH)D / 25-hydroxyvitamin D
    active vitamin D calcitriol / ercalcitriol / 1,25(OH)₂D / 1,25-dihydroxyvitamin D

  3. Charmingly named “vitamin D-binding protein”

  4. If you eat mushrooms or yeast, it joins the vitamin D from your skin en route to your liver. If you eat animals or animal products, you also get some storage vitamin D, which doesn’t need to be processed by the liver. 

  5. Storage vitamin D is what your doctor measures in your blood test. This is sometimes measured in nmol/L and sometimes in ng/mL. The latter measurement is smaller by a factor of 2.496. So 25 nmol/L ≈ 10 ng/mL. 

  6. Apperly was building on a 1937 paper that observed observed that sailors, exposed to lots of sunlight, had much higher skin cancer rates than the general population, but lower overall cancer rates. 

  7. I theorize that the Garland brothers are alive and writing Slime Mold Time Mold

  8. In Biologist, active vitamin D is not just an “endocrine” hormone that sends signals for far away cells through the blood, it’s also a “paracrine” or “autocrine” hormone that sends signals to nearby cells or inside a single cell, through diffusion. 

  9. You might ask, why is vitamin D used by so many different parts of the body for so many different purposes?

    I think there’s no deep answer here. It’s true for the same reason that dogs sneeze to signal that they’re feeling playful: Evolution re-uses stuff for different purposes all the time. Imagine that DNA already exists coding for the vitamin D receptor and for the enzyme to convert storage vitamin D into active vitamin D. If some cells need to send a local signal, re-using those is easier than inventing something new. There’s nothing unusual or magical about this. 

  10. Don’t try to make sense of this. It doesn’t make sense.

    You could speculate that this is because the parathyroid glands are trying to make less active vitamin D to compensate for the fact that vitamin-D receptors throughout the body are sensitive to storage vitamin D itself. But I advise against. 

  11. 400 IU is the recommended daily amount 

  12. The WHI trial was a pioneer in salami-slicing results for different outcomes into dozens of different papers, most of which are hard to access. All trials now seem to have adopted this hideous trend which makes it maddening to try to summarize what actually happened in a trial. Also, slightly different numbers for the same quantity appear in different places. I haven’t bothered to chase these down, because the differences are all very small, e.g. a hazard ratio of 0.89 for cancer mortality rather than 0.90. 

  13. Guess what most kidney stones are made of? 

  14. Half of the vitamin D group and the placebo group also got omega 3. These are averaged together in the results. Also, VITAL carefully stratified the assignment to vitamin D or placebo based on baseline vitamin D levels, which should give more statistical power from a given sample size. 

  15. There was also a weird study done on a subset of 1031 people from the VITAL population that looked at telomere length. After starting with around 8700 base pairs, the control group lost around 160 base pairs during the study, while the vitamin D group only lost an average of 20. I’m not sure of what to make of this. For one thing, though the authors claim this is statistically significant, it depends on how you analyze the data. But beyond that, sure, telomere length is a marker of aging, but telomeres get shorter for a reason (likely to fight cancer) and it isn’t obvious that slowing this would always be a good thing. 

  16. This is a little complicated. In VITAL, participants were only eligible if they were taking at most 800 IU per day, and they were restricted to 800 IU per day during the trial. In D-health, participants were only eligible if they were taking at most 500 IU per day, but they were allowed to take up to 2000 IU per day during the trial. 

  17. You might ask: If vitamin D only has a modest effect, then why is it so strongly correlated with health?

    In principle, I’d like to push back against the idea that we need to explain why these particular correlations don’t imply causation. But the accepted explanation is a combination of (1) reverse causation where being healthy causes people to spend more time outside and thus get more vitamin D; (2) confounding, where obesity is bad for you and leads to lower measured vitamin D levels; (3) confounding, where more healthy lifestyles lead to both more vitamin D and more health; and (4) confounding, where higher socioeconomic status leads to both more vitamin D and more health. You might ask why these correlations would be true at a state level like the Garlands looked at, but then you run into the ecological fallacy and modifiable areal unit problem

  18. I took all the trials that got at least 2% weight and were rated as “low risk of bias” in this 2014 Cochrane review of vitamin D and mortality, then manually added all the “major” trials that were published after 2014.

    I shudder to think of the time it took to make this table. I tried using AI but found it was wildly unreliable. Part of the problem is that each trial’s results are distributed among many papers, in different journals, with different paywalls. And many details aren’t published at all by the original authors but are only scrounged up and put in the depths of the supplementary material of a review years later. In some cases, different sources also give contradictory numbers. The differences were always tiny (e.g. 0.90 rather than 0.89) but it still makes me nervous. 

  19. Here’s a table describing the major contours of the trials:

    Name Country Subjects (n) Age (years) white (%) Duration (years)
    Lips 1996 Netherlands 2,578 80 ± 6   3.5
    Trivedi 2003 UK 2,686 74.7 ± 4.6 74 5
    WHI 2006 USA 36,282 (women) 61.8 ± 6.7 84 7
    Lyons 2007 Wales 3,440 84 ± 7.5   3
    WFPT 2007 UK 9,440 79.1   3
    RECORD 2012 UK 5,292 77.5 ± 6 99.2 6.2
    Lappe 2017 USA 2303 (women) 65.2 ± 7.0 100 4
    VITAL 2018 USA 25,871 67.1 ± 7.1 71.3 5.3
    ViDA 2018 New Zealand 5,110 65.9 ± 8.3 83.3 3.3
    D2d 2019 USA 2,423 60.0 ± 9.9 67 2.7
    DO-HEALTH 2020 Switzerland, Germany, Austria, France, Portugal 2,157 74.9 ± 4.1   3
    D-Health 2022 Australia 21,315 69.3 ± 5.5 94.7 5
    FIND 2022 Finland 2,495 68.2 ± 4.5 100 5

    And here’s a table focusing on the change in vitamin D levels:

    Name Intervention Allowed personal use (IU/day) Baseline D (nmol/L) Final D (nmol/L)
    Lips 1996 400 IU daily 0 (screening)    
    Trivedi 2003 100,000 IU 3× per year (D2) 0 (screening) 200 (trial) 52.5 (in controls) 75
    WHI 2006 400 IU daily with Ca 600 (later 1000) 52.0 ± 21.1 (subset) ~67
    Lyons 2007 100,000 IU 3× per year <400 (screening) 54.0 (in controls, subset) 80.1 (subset)
    WFPT 2007 300,000 IU yearly <400 (screening)    
    RECORD 2012 800 IU daily with Ca 200 ~38  
    Lappe 2017 2000 IU daily with Ca any? 71.8 ± 20.0 96.0 ± 21.4
    VITAL 2018 2,000 IU daily 800 77 ± 30 105 ± 25
    ViDA 2018 100,000 IU monthly 600 / 800 (younger / holder) 63 ± 24 119 ± 45
    D2d 2019 4,000 IU daily 1000 69.9 ± 26.8 98.7
    DO-HEALTH 2020 2,000 IU daily 1000 / 800 (screening / trial) 55 ± 22 100 ± 27
    D-Health 2022 60,000 IU monthly 500 / 2000 (screening / trial) 77 ± 25 (predicted) 115 ± 30
    FIND 2022 1,600 or 3,200 IU daily 800 75 ± 18 100 ± 21 or 120 ± 22

  20. Among the major trials, only VITAL, ViDA, and FIND measured it for more than a tiny number of subjects. 

  21. In VITAL and ViDA, people with baseline levels below 50 nmol/L had a higher hazard ratio for cancer mortality (though with wide confidence intervals), suggesting if anything less benefit. Or, you could use race as a proxy for baseline vitamin D. But in both VITAL and WHI, the hazard ratio for cancer mortality was higher among non-Whites. After looking at many such analyses for many outcomes, the only clear result I could find was for diabetes in the D2d trail, where the hazard ratio was much lower for people below 30 nmol/L (0.38 vs. 0.93). 

  22. The results for VITAL look decent:

    outcome (VITAL trial) HR HR excluding first two years
    Cancer 0.96 (0.88 to 1.06) 0.94 (0.83 to 1.06)
    Cancer mortality 0.83 (0.67 to 1.02) 0.75 (0.59 to 0.96)
    Major CVD event 0.97 (0.85 to 1.12) 0.93 (0.79 to 1.09)
    All-cause mortality 0.99 (0.87 to 1.12) 0.96 (0.84 to 1.11)

    But in D-Health, excluding the first two years actually increased the hazard ratio for cancer mortality from 1.15 (0.96 to 1.39) to 1.24 (1.01 to 1.54). Most other trials were too short for this kind of analysis to make sense. 

  23. That could downregulate 25-hydroxyvitamin D 1-alpha-hydroxylase, reducing the rate it catalyzes the hydroxylation of hydroxycholecalciferol into 1,25-dihydroxycholecalciferol! 

  24. Dynomight: WTF is this?

    Dynomight Biologist: Well, C-reactive protein is generally considered inflammatory.

    Dynomight: So reducing that is good? But then why do they talk like elevating anti-inflammatory cytokines would be bad?

    Dynomight Biologist: Yeah… That would be good. Unless you have cancer. In which case it’s not good.

    Dynomight: OK! 

  25. Mendelian randomization studies are based on the idea that certain genes predispose you to have higher levels of circulating vitamin D. If you assume that those genes are randomly distributed in the population and have no effects other than affecting vitamin D, then they serve as a kind of natural experiment. With vitamin D, these studies typically show null results. However, the validity of the assumptions is debatable and the identified genes only explain ~5% of the variance in vitamin D levels, which makes the results very noisy. 

  26. Pale skin also greatly increases the risk of sunburn and skin cancer. In the US, White people get melanoma at around 25 times the rate of Black people, despite (I assume) higher usage of sunscreen and better health outcomes in most other dimensions. But experts generally think folate deficiency created stronger selective pressure, since it’s so closely linked to reproduction. 

  27. It’s a more complicated than this, because you also need to look at the amount of folate in diet, as well as migration patterns and how long populations had to adapt to their environment. But experts seem to consider this the leading explanation for the evolution of pale skin. 

  28. To derive this, suppose that S(t) is the probability that someone survives to age t. Then life expectancy is ∫ S(t) dt, where the integral runs from 0 to ∞. If you change the hazard ratio by a factor of HR, then the new in life expectancy is L(HR) = ∫ S(t)ᴴᴿ dt, so the change under a linear approximation is ΔL ≈ (HR-1) × L’(1). This is more commonly written as ΔL ≈ (HR-1) × L(1) × H, where H = -L’(1)/L(1) is known as the Keyfitz entropy. This is is chosen because the quantity H is relatively stable, and in rich countries is typically between 0.10 and 0.20. So a decent estimate would be that baseline life expectancy is L(1)=80 years and H = 0.15 in which case the change in life expectancy is around 12 × (1-HR) years. 

  29. Observe that 0.48 years is 252460.8 minutes. Assuming you lived for 80 years and took a pill every day of your life, that would be 80 * 365.25 = 29220 pills. 252460.8 minutes / 29220 pills = 8.64 minutes/pill. 

  30. I expect that a number of you are happy to bite that bullet and say yes, HR=0.96 is trivial and smoking a cigarette each day is also fine. I don’t personally agree, but it’s not my place to question your utility function and I applaud your consistency. 

  31. A hazard ratio of HR=2/3, implies a change in life expectancy of 12 × (1 - 1/3) years = 4 years or 2,103,840 minutes. That corresponds to a per-pill increase of 2,103,840 minutes / 29,220 pills = 72 minutes/pill. 

  32. Technically, this is calculating a relative risk rather than a hazard ratio, but I think the difference isn’t very significant given that we’re assuming a uniform mortality risk. I used AI to create that simulation, though I did test that it replicates a traditional power calculator across a wide range of parameters when the relative risk is constant for all vitamin D levels. So I mostly trust it. 

  33. This simulation is probably a bit pessimistic. Things look a bit better if you use an older population where baseline mortality is higher. (Almost all trials do.) In principle, you could also use a population where more people have low levels, which could help a lot. But, for whatever reason, almost no trials do that. In fact, most trials accidentally under-sample people with low vitamin D, because people who agree to participate tend to be more health-conscious. 

  34. Kunzia et al. made a heroic effort to contact study authors and get data for individual patients. After getting data for 21,558 people (almost all from ViDA + FIND + VITAL + WHI) only 3,663 had levels below 50 nmol/L. That’s not enough to reliably detect a modest effect, meaning their confidence interval for this group is gigantic. 

  35. In this table, I tried to capture foods that are commonly fortified in practice, not just when it’s legally required. 

Is “colorectal cancer” rising in “young people”?

2026-05-26 08:00:00

(Yes, but.)

Over the past few years, I’ve seen many articles about mysterious rise in colorectal cancer (CRC) in young people. There are various stories for why this might be happening:

General health. Maybe modern people are unhealthy (obesity, low physical activity, diabetes, poor sleep), leading to insulin resistance and chronic inflammation, meaning faster epithelial cell proliferation and a miscalibrated immune system that fails to stop early cancers?

Ultra-processed food. Maybe people are eating more ultra-processed foods that contain additives (like emulsifiers) that degrade colon mucus, allowing bacteria to contact epithelial cells and drive inflammation? Or maybe ultra-processed food has low fiber and glycemic load, leading to insulin resistance and chronic inflammation, with the problems mentioned above?

Bad meat. Maybe people are eating more red and/or processed meats, which expose the colon to nitrites and secondary bile acids, which inflame the epithelium and promote chronic inflammation?

The microbiome. Maybe it’s the microbiome. For example, maybe people’s guts are getting colonized by strains of E. coli that produce genotoxic colibactin. Or maybe overuse of antibiotics in early life depletes protective bacteria in the gut, allowing harmful strains to expand, e.g. strains of B. fragilis that cause inflammation, or strains of F. nucleatum that can survive in the gut and drive tumor growth?

Environmental exposures. Maybe people are getting exposed to bad stuff in the environment (microplastics, forever chemicals, pesticides, endocrine disruptors, air pollution) that does bad stuff (damages gut barrier, screws up the microbiome, disrupts hormonal signaling)?

Maternal health. Maybe poor maternal health (obesity, diabetes) exposes the fetus to elevated glucose / insulin / inflammation, and these in turn program the child for a lifetime of metabolic issues and inflammation?

Whatever. Maybe alcohol / smoking / painkillers / calcium / vitamin D / inflammatory bowel disease / hereditary syndromes / screening bias?

None of the experts seem to agree on which of these is the culprit, so I figured that I (person with blog) should help.

If you poke at these stories, most of them are individually pretty weak. It can’t all be detection bias since CRC deaths are also going up in younger people. And several proposed causes (air pollution, tobacco) have actually fallen in rich countries. Other explanation, like E. coli producing colibactin, seem biologically real, but there’s no evidence that they’re increasing over time. Still other suggested causes (microplastics, forever chemicals) are mostly mechanistic speculation at this point. Obesity, inactivity, and chronic inflammation also all seem biologically real, and they are likely increasing, but why should they specifically cause colorectal cancer in young people?

A plausible answer to that last question is that they aren’t. They’re doing it, but not specifically.

“Young people”

This will sound pedantic, but bear with me: If you say that CRC is increasing in younger people, what exactly does that mean? After all, the set of people who qualify as young changes over time. (Ever notice that you keep getting older?)

Siegel et al. (2026) plot how often CRC was found in different age groups in 1995 and in 2022.

They also provide this plot of how common different types of CRC are in different age groups.

At a glance, this doesn’t look so bad. If you’re young, you might think, “OK, my current risk is higher than previous generations faced at the same age, but I can look forward to decreasing rates when I’m old.” You could easily think this is good news: While there’s a relative increase when you’re young, it’s tiny compared to the absolute decrease while you’re old.

Unfortunately that’s the wrong way to think about it.

Downham et al. (2026) plot CRC rates in different age groups across the Anglosphere over time.

Everyone I’ve shown this plot to has said it’s confusing, so let me explain: The different lines track age-bands as people born in different years move in and out of those bands. For example, in the US plot in the bottom right, the “20-25” line starts with the left-most dot showing the CRC rate for people born between 1965 and 1970 when they were 20 to 24 years old (around 1990). The next dot shows the rate for people born between 1970 and 1975 when they were 20 to 24 years old (around 1995), and so on.

That figure is weird, because the lines connect different groups of people. I wanted a plot where there are lines for different birth cohorts as they age. For unknown reasons, no one seems to make such plots, and the data isn’t trivial to access. So I used a plot digitizer to click on every damned point that US figure above and then replotted it:

Now the individual lines show specific groups of people tracked through time. For example, the “1932.5” line shows CRC rates for people born between 1930 and 1935, when those people were at different ages. If you look closely, you’ll notice that these rates are higher those for people born between 1940 and 1945 for all ages (where we have data).

That was the pattern for a long time: Between 1920 and 1950, later generations enjoyed lower CRC rates across all phases of their lives. But between 1950 and 1960, that pattern reversed and since then later generations have had higher CRC rates at all ages.

We don’t know for sure what will happen in the future. But I think it’s likely this trend will continue. Yes, if you are currently young, you face higher CRC risk than previous generations did when they were young. That’s the bad news. The other bad news is that when you are old, you may also face higher CRC risk than previous generations did when they were old.

“Colorectal cancer”

The other other bad news is that CRC isn’t the only type of cancer that’s rising in later generations. Sung et al. (2019) give this plot:

These are again the confusing graphs where individual lines show age bands as different people move in and out of them. But you get the point: Lots of cancers are going up in younger people later generations, including uterine, gallbladder, kidney, liver, pancreas, and thyroid. (Their additional material contains plots for 18 other cancers, most of which are either stable or decreasing.)

Note that these plots have a logarithmic y-axis, meaning the changes are larger than they might appear. Moving up a quarter of the way between two vertical ticks corresponds to an increase of a factor of ≈ 1.78.

If lots of cancers are becoming more common in later generations, then why is everyone talking about CRC? I think that’s because CRC in unique in that it is:

  1. common
  2. dangerous
  3. increasing in later generations
  4. treatable if caught early
  5. detectable via screening

For example, thyroid cancer diagnoses have skyrocketed in recent decades. But that’s partly because of more detection, and thyroid cancer is highly treatable, without clear benefits from early detection. Pancreatic cancer also seems to be increasing, but we don’t have good ways to screen for it and even if we did, we don’t have good ways to treat it.

CRC is really unique in that you can save lives by telling people, “Hey! CRC is going up! You should get screened!” If you’re interested in public health, that’s the most important thing. But if you’re interested in unraveling the mystery of CRC going up, it’s important to note that CRC isn’t really unique at all.

TLDR

No:

Colorectal cancer is going up in young people.

Yes:

Various kinds of cancer are going up in later generations. (Definitely at younger ages, possibly at all ages.)

Reminder

This blog endorses colorectal cancer screening. We don’t yet know if colonoscopies are better than other methods of screening (sigmoidoscopy, stool tests), but we do know that screening is better than not screening. When caught early, CRC is highly treatable, often with only surgery (no chemotherapy or radiation) and a return to normal activities within a couple weeks.

What’s with all the slide decks?

2026-05-13 08:00:00

News from the world of real jobs: Apparently, sometime between 10 and 20 years ago, it became standard for people to communicate by sending slide decks around. These slides are never presented. They aren’t intended to be presented. They’re born, they’re sent around, and they die. What?

I stress, the question is not why (or if) people give bad presentations.

The mystery is why everyone is using presentation software for communication that is not a presentation.

Theory 1: Everybody dumb

Is it because we’re all dummies? I’m putting this theory first because I suspect that you, beloved readers, will favor it.

True, if you ask people why they make slides instead of writing, they’ll usually say, “because nobody wants to read”. So there’s that. But I don’t consider this much of an explanation. Dummies though we may be, we’ve been like that a long time. If we entered the Slideocene 15 years ago, why then? Why not before?

Theory 2: The decline of reading

Did we get worse at reading? The Discourse seems to have decided this is true, but is it true, or just moral panic?

Since 1971, the US has tested 13-year-olds to measure long-term trends in reading ability. This shows a slow improvement until 2012, then a slow decline, and finally a post-COVID drop. The declines seem too small and too late to explain our mystery.

Since 2000, PISA has tested reading performance in 15-year-olds around the world. This shows a decline on average, but it’s smaller in rich countries and nonexistent in the United States. (It’s the same story for science and a bit more negative for math.)

Among adults, data is scarce. Basic literacy is generally improving, and American time use data shows a decline in reading for pleasure from around 23 minutes per day in 2003 to around 16 minutes per day in 2023. But this seems to miss time people spend reading on their phones.

So it’s unclear if people got worse at reading. It feels plausible that people now spend less of their adulthood grappling with complex written arguments, and so got worse at that. But there’s little firm evidence.

Theory 3: Technological change

Another obvious theory is that we now have computers and software and the internet. Without these things, it would be impossible to email slides to each other. This seems relevant!

Yes, but we had those things for a while before slide culture really took hold. And think about the situation before computers. Photocopiers were ubiquitous in corporate offices by the mid-1980s, and mimeographs were around decades before that. If slides were really that great, people could have made them by hand. But no one did.

Of course, making slides by hand is inferior. But it’s not that inferior. So slides can’t be that big of a win.

What actually happened?

And… that’s pretty much the end of the obvious theories. None of them are very satisfying. So let’s take a step back. Historically, how did the slide-as-document displace the memo?

As best I can tell, this was driven by management consultancies. If you go back to 1960, they delivered detailed written memos. The memo was the product. They’d likely give a presentation as well, but that was a separate ancillary thing, likely done using flipcharts or chalkboards.

In the 1970s, the memo was still the product, but consultancies started to enforce a top-down logical structure (the Pyramid principle). Presentations shifted to acetate transparencies. Both memos and presentations often included hand-drawn graphics like the nine-box or growth-share matrices.

In the 1980s, the memo was still the product, but presentations became increasingly lengthy and polished. Expensive computers like the Genigraphics started to be used to generate charts.

The 1990s were when things started to shift. By then, PowerPoint was everywhere, and junior analysts were expected to create presentations themselves. Consultancies gradually started to notice that (1) clients didn’t always read the memos; (2) clients loved slides and passed them around long after the presentation was over; and (3) creating a memo and a polished presentation was a lot of work. They put more and more effort into the slides. McKinsey especially evolved towards treating slides as the primary product, and mostly stopped writing long memos. Other consultancies followed.

During the 2000s, slides became even more ornate. Consultancies evolved their formatting rules, and created fancy data-dense charts. They learned that a 200 slide deck made clients feel like they got a lot for their money. Gradually, they oriented their entire business around slides. Projects would start with managers creating a template presentation with “ghost slides” and assigning different parts to junior analysts. Soon, this spread outwards, both from people who interacted with consultants and from the ex-consultant diaspora. People everywhere started thinking and communicating in slides, and now everything is slides, yay!

Alternative history

That story makes slides-as-documents sound inevitable: People liked them, so they became popular. But there’s an alternative timeline in which we resisted the slide into slide maximalism. That timeline is Amazon.com, Inc.

In 2004, Jeff Bezos famously instituted a no-presentations policy at Amazon. His logic was that slides hide poor reasoning and are a tool to persuade rather than inform. Instead, everyone involved with strategic decisions at Amazon needs to learn to write a six-page memo. Meetings begin with everyone sitting and silently reading one of these memos.

Presentation software is not banned at Amazon. The ban is only for using it for internal meetings and decision-making. They use slides for external communication. There is no policy that prohibits someone from making slides and emailing them around.

And yet, people don’t make slides and email them around, because it’s not part of Amazon’s culture. In effect, Amazon is a counter-movement. Most of the world decided that slides are good, because slides are easy. Bezos decided that writing is good because writing is hard.

There are millions of articles explaining why Bezos’ policy is pure genius. They claim that constructing a narrative requires deeper analytical thinking and exposes flaws in logic. I want to believe those theories. I now realize they’re very similar to some of my arguments for why writing with too much formatting is bad.

I’m not sure if writing is the secret to Amazon’s success. But Amazon is successful. This demonstrates that slide life is a choice, not technological destiny—institutions can choose writing over slides and flourish anyway.

OK so then what’s happening?

Warning: If you like your theories simple and mono-causal, you aren’t going to like this.

  1. Slides are a win, but a small one. The shift to slides wasn’t a “mistake”, it happened because people like it. But if sharing slides outside of presentations became illegal, this wouldn’t cause per-capita GDP to crash. That’s why people didn’t scratch slides into mimeograph stencils back in the 1950s. It wasn’t worth the modest effort.
  2. When computers and software showed up, it became easier to share slides. But people didn’t immediately shift to slides-as-documents because the win isn’t that big, because culture changes slowly, and because everyone had pre-existing skills for reading and writing documents.
  3. Consultancies happened to be in the economic niche with the strongest selection pressure to evolve towards slides-as-documents. So when making slides became cheaper, they shifted. Slowly, that norm spread outwards, people got used to communicating in slides, and here we are.
  4. Institutions can resist that norm and still be successful. If you take modern people and force them to read and write, they do just fine.
  5. Humans evolved to learn and communicate in a fragmented, interactive, and visual style. It’s hard to argue that any shift in that direction is a catastrophe.
  6. Except blogs. The decline of the blog must be arrested.