細菌コロニー形成曲線

発端

「平板放置しといたらまえカウントした時よりコロニー増えてる…」
というようなことがあって、どっかで読んだような記憶があったので少し調べていました。
せっかくなので理解した分だけまとめておきます。

平板培養時の問題点

平板培養をする場合、適当な時間待ってコロニーが出現しきってからカウントする。しかしこの「適当な時間」というのを決めるのが難しい。

土の細菌を平板上で培養し、コロニーを作らせる実験で、誰もが一度は悩む深刻な問題があった。培養を何時間つづければよいかという問題である。普通実験室で培養している細菌は、12時間とか24時間とかいった時間培養すれば、すべてのコロニーが現れるのに十分であることが多い。しかし土の細菌の場合、一週間培養しても、二週間培養しても、新しいコロニーの出現はつづき、十分な培養時間だとはいえない。たとえ一ヶ月培養しても、十分だとはいえない。(服部勉『大地の微生物世界』pp.173-174)

そこで、コロニー形成は確率的に起こると考えてモデルを作ってみると上手くいく。

FOR(First Order Reaction)モデル

平板上にn個の細菌が撒かれたとする。n(t)を時刻tにおいてまだコロニーを形成していない細菌の数とし、同様にコロニーの数はN(t)としよう。N(t)=n(0)-n(t)となる。細菌たちは十分な時間が経過しさえすれば(t=∞)全てコロニーを形成すると仮定する。よって、最終コロニー数N(∞)はn(0)に等しい。よってN(t)=N(∞)-n(t)でもある。
撒かれた細菌のうち気の早いものはすぐに増殖を開始するだろうが、計数できるようなサイズのコロニーを形成するまでには10回かそこらの分裂が必要なので、最初のコロニーが出現するまでは少し時間がかかる。最初のコロニーが出現するまでの時間を遅延時間と呼び、trで表すことにしよう。
tr時間経過した後、まだコロニーを作っていない細菌は、一定の時間の間に一定の割合λでコロニーを作っていくと仮定する。数式で表現すると、微小時間\Delta t経過する間に減少するまだコロニーを作っていない細菌の数\Delta nは、比例定数λとnを掛けたものだということになる。
\frac{\Delta n}{\Delta t}=-\lambda n
ただし、λは定数といってもtr経過するまでは0であることに注意する。
さて、コロニー数N(t)を求めるためにはn(t)を求める必要があるが、これは上の式を変数分離して積分すれば得られる。
\int_0^t\frac{1}{n}dn=-\int_0^t\lambda dt
0からtrまでの間の積分はλが0なので0になることに注意して解けば、次の式が得られる。
n(t)=n(t_r)\exp(\lambda t_r-\lambda t)
n(tr)は仮定からn(0)と等しく、またN(∞)とも等しい。
N(t)=N(∞)-n(t)であるので、ここに今の式を代入すれば次式が得られる。
N(t)=N(\infty)(1-\exp(\lambda t_r-\lambda t))
この式には3つの未知変数(λ、tr、N(∞))が含まれているので、最低3回のコロニー数カウントデータがあればこれらのパラメータを推定することができる。

なんのこっちゃ分からんのでとりあえずプロットしてみよう

最後の式に適当なパラメータ(λ=0.3、tr=3、N(∞)=1000)を入れてプロットしてみるとこんな感じになる。

要するに遅延時間分経過したのちにコロニー形成が始まって、最終コロニー数に向かって漸近していくというそれだけのことで、モデルのところで説明した仮定やプロットの形からも分かるように考え方は反応速度論とかでいう一次反応と同じ。
このモデルだとtrは細菌の分裂速度を反映するし、コロニーが出現しきるのを待たなくても最終コロニー数を推定できるという点が優れている。いろんな種類の細菌が混ざっているような場合、細菌集団によってコロニー形成曲線が異なるためコロニー形成曲線を何段か重ねたような曲線が得られるだとか、細菌の生理状態を反映してλが変化するだとか色々あるようだけどそのへんは参考文献見てください。
あとプロットは例によってRで描いたのでコード置いときます。

NumColony <- function(t) {
  Ninf <- 1000                         # 最終コロニー数
  lambda <- 0.3                        # 単位時間内に増殖を開始するコロニー
  tr <- 3                              # 遅延時間
  ifelse(t < tr, 0,
         Ninf * (1 - exp(lambda * tr - lambda * t)) )
}
curve(NumColony, 0, 20,
      main = "コロニー形成曲線",
      xlab = "経過時間(t)",
      ylab = "コロニー数")
abline(v = 3, col = "red", lty = 2)         # 遅延時間
abline(h = 1000, col = "blue", lty = 2)     # 最終コロニー数
legend("bottomright",
       inset = 0.1,
       legend = c("遅延時間", "最終コロニー数"),
       col = c("red", "blue"),
       lty = c(2, 2),
       box.lty = 0)