いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【KNIME】curve fittingで酵素反応速度論的パラメータを推定してみたい(非線形回帰)。

酵素反応速度論的解析をする際に、モデルの式に数値を当てはめてパラメータを推定するcurve fittingをやりたかったのだけれど、KNIMEでのやり方が分からなかった。

Pythonなら出来そうだったので、KNIMEにPythonを入れ込んで、サンプルデータのfittingをやってみた。
・今回題材に選んだのは、酵素反応速度論解析で有名なMichaelis–Menten式で、要は「酵素の反応速度は、酵素反応速度Vmaxという定数、Kmという定数、基質濃度[S]という変数で表される関数にできるよ」というもの(下記URL参照)。細かくは近似するための条件があるらしいが、今回は無視する。
酵素反応速度V=Vmax*[S]/(Km+[S])で表され、生化学の授業で定番の非線形問題である。通常は、実験で[S]を複数の値で振ってVを計測し、VmaxとKmを推定する。
・実習で解く場合は逆数をとって1/Vを1/[S]を変数とする1次関数として処理するのが一般的だと思うが[S]とVが小さいときに誤差が大きくなるという欠点がある。
・ということで、実験のダミーデータを作成し、解いてみた(下図)。

f:id:choron81:20211219224445p:plain

・VmaxとKmを推定するだけであれば、入力データのノードとその一つ右のFittngのノードだけで終わっており、残りは図示のためにある。
・入力データをプロットすると以下のようになる。基質濃度を1000uM(←uはμの代わり)から適宜下げて、n=3で酵素反応速度を測定した。ダミーデータでばらつきは適当な正規分布に従わせている。生化学系の実習経験者は見覚えがあるグラフかもしれない。

f:id:choron81:20211219224706p:plain

Python Scriptの中身は以下の通り。

import pandas as pd 
import numpy as np 

y_in = np.array(input_table_1["v"])
x_in = np.array(input_table_1["[S](uM)"])

from scipy.optimize import curve_fit

def nonlinear_fit(x,Vmax,Km):
    return  Vmax*x/(Km+x)

popt, pcov=curve_fit(nonlinear_fit, x_in, y_in)#popt:最適推定値,pcov:共分散

#95%信頼区間の計算
stdev = np.sqrt(np.diag(pcov))
CI95 = 1.96 * stdev

result=np.stack([popt,popt-CI95,popt+CI95])
output_table_1 = pd.DataFrame(result, index=["val","LL","UL"], columns=["Vmax","Km"])

print(output_table_1 )

・標準誤差の出し方は以下を参考にした。

docs.scipy.org

Python Scriptノードの出力では、VmaxとKmとその95%信頼区間の下限と上限を出力することにした(下図)。

f:id:choron81:20211219225312p:plain

・ちなみに、ダミーデータ作成の際にVmaxを1、Kmを10に設定したので、結構良い線いっている気がする。

・最終的に元データとFittingして求めた曲線をプロットして眺めてみた(下図)。

f:id:choron81:20211219225538p:plain

・あっているのかどうかは分からないが、それなりにそれっぽい感じになった。

 

終わり。