I’ve had an entertaining last week trying to set up a TCID50 calculation template for some assay development work I’m doing. The long and short of it is that I found out that a Yale professor and the WHO (not to be confused with The Who) are not immune to making mistakes…

My company has a very nice Excel workbook for a different assay that runs using macros and spits out a neat summary sheet for multiple samples, but the problem is that it’s locked down to an initial dilution of 1:10 and serial dilutions of 1:10 and the person who wrote it left years ago before we were bought by the Shogunate and even before I started working at TinyVaccineStartup, which makes it useless for assay development work.

So I turned to the lazy virologist’s solution, that is the popular Brett Lindenbach spreadsheet which implements the Reed-Muench method of calculation. The first thing I realised was that one of my colleagues had basically deleted the original author’s name and other information out of it and made it an appendix to an in-house SOP even though it says “may be freely distributed in an unmodified form”. Tak faham bahasa… (My own intention was only to use it as a temporary solution for development work and build my own later anyway, as it only lets you input data for one plate at a time as opposed to pasting in multiple data tables which is what you’d want for a template to be appended to an SOP for routine testing of many samples.)

So I went direct to the Lindenbach Lab’s website to download the latest version 3 which was published in 2011 and contains a helpful citation in addition to the author’s name. The link to the Excel file is currently down for reasons which I can only guess at, as Dr. Lindenbach hasn’t yet replied to me. I’m hosting copies here:

- Lindenbach Reed-Muench calculator, version 2, 2008
- Lindenbach Reed-Muench calculator, version 3, 2011

I can’t remember what exactly it was that tipped me off that something funny was wrong. Either I was playing around typing fake data into the sheet and the results didn’t match what I expected, or I had decided to compare it to WHO monograph 23 from the beginning in my attempt to understand how it worked. The WHO monograph 23 “Laboratory Techniques in Rabies” appendix is the best source I could find explaining various 50% endpoint calculation methods that wasn’t paywalled. The outputs from the spreadsheet matched up with neither what I expected by eyeball nor manual calculation according to WHO mono 23. The errors were less than order of magnitude, which is why I hadn’t noticed them when I used it while doing my Master’s some years ago, but they were systematic.

After a lot of messing around and printing out all the formulas and doodling all over the printouts and using four different highlighters, this is what I figured out:

*For clarity, any mention of “dilution” below refers to numbers < 1 as analyte/diluent and any mention of “dilution FACTOR” below refers to numbers > 1 as diluent/analyte. E.g. dilution of 0.0008 = dilution factor of 1250. Therefore the log of “dilution” will be negative log of “dilution factor”. TCID50 below refers to the 50% endpoint dilution, not dilution factor.*

*Also please note that the =LOG(number, base) function in Excel defaults to base 10 if the base argument is omitted. All logs in the following are base 10 unless specified otherwise.*

In the original Reed & Muench 1938 paper, the term “proportional distance” that is, the distance of the 50% endpoint from the next lower dilution compared to the next higher dilution, is to be scaled by the log of the serial dilution factor, then added to the log of the next lower dilution factor, to obtain the log of the TCID50 dilution factor. That is:

(a) Log(1/TCID50) = log(next lower dilution factor) + [log(serial dilution factor) * proportional distance]

This could also be expressed as:

(b) Log(TCID50) = log(next lower dilution) – [log(serial dilution factor) * proportional distance]

(TCID50/mL is then calculated as 1/(TCID50 * mL per well))

The problem with the 2008 version of the Lindenbach calculator is that it *omits* to scale prop. dist. by the log(serial dilution factor) hence introducing inaccuracy in that term for any serial dilution other 1:10, as log10(10) = 1.

The mindboggling thing is that the 2011 version 3 calculator, while it does scale prop. dist. by the serial dilution factor, uses a completely different method of calculating TCID50 which I have not had the time to understand yet. It also gives results that are obviously incorrect as it outputs TCID50 values > 1 and TCID50/mL values < 1. Meanwhile they seem to have removed the file from the Lindenbach Lab website since I downloaded it several weeks ago as the link is broken, so I would hope someone else has pointed out the error to them as well.

The other *bang head against wall* moment was when I realised that WHO mono 23 *also* contains a mathematical error in the footnote on page 331. The reason I was looking at it is because Lindenbach uses this variation of treating “starting point dilution” as the next above the 50% endpoint instead of next below, and I prefer this too just for plate layout reasons. Here’s the footnote:

The last sentence should say either

“…added to the logarithm of the reciprocal of the starting point dilution.” [positive term, for calculating TCID50 by method (a) above]

Or

“…subtracted from the logarithm of the starting point dilution.” [negative term, for calculating TCID50 by method (b) above]

You have no idea how much bloody time I wasted “troubleshooting” my own spreadsheet on the assumption that that footnote was correct.

If you are at an institution that has access to the original Reed-Muench paper do read it. It’s short and a nice illustration of how people used to calculate things in the stone age when they had to do with with graph paper, log tables, and dividers. I always complain that Malaysia is a major manufacturer of consumer electronics yet they made us use graph paper and log tables even for Additional Mathematics at the upper secondary level. I guess it would be useful for calculating titers in the event of a zombie apocalypse.

Last couple of things to note is that each calculation method has pros and cons. Reed-Muench is not robust to missing replicates (e.g. if one of your wells was contaminated with bacteria, pipette tip fell off while adding substrate etc.) so the WHO monograph 23 advises using Spearman-Karber in this case. S-K takes the sum of the individual positive/total ratio at each dilution instead of ratios of cumulative positive up and negative down.

On the other hand, S-K requires that the dilution series be broad enough to bracket both a dilution with 100% positives and 100% negatives. So you don’t want to use it for super low titer or super high titer samples with a small serial dilution factor.

*EDIT: More “bang head against wall”. As a reader kindly pointed out (see comments) I uploaded a version with an error. I actually caught the error in my work shortly after but was too lazy to update the blog post because I thought nobody reads my blog. The corrected version is now here. *~~ Anyway, here’s my own draft calculation template.~~ It’s got sheets to paste in absorbance data if you’re using an ELISA detection method, or you can type in ones and zeros for positive and negative if you’re scoring visually. The formulas are only set up for a specific plate layout and only for rows A–D so if you want to calculate more samples at a go, expanding the layout is left as an exercise for the reader 😉

TCID50 calculation templates (draft) by Shi-Hsia HWA is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Hello there. I think there’s something wrong with your spreadsheet. When all rows up to a certain point are positive, the TCID50/ml is a certain number. If I add a positive in the adjacent all negative row, the TCID50/ml goes down.

Thanks for catching that error. I guess that would go along with the “Don’t believe everything you read on the internet”.

I actually realised there was a mistake in that version shortly after I wrote that post but then I got busy and didn’t have time to update the blog post, and it seemed like nobody was reading it anyway so I didn’t bother. I’ve now uploaded what should be the correct version. Could you please let me know if it works for you?