Weitere ähnliche Inhalte Ähnlich wie Rでシステムバイオロジー (20) Kürzlich hochgeladen (12) Rでシステムバイオロジー13. Step.2 モデル化
ここではMagnusモデル(Magnus G. Fagerlind, et. .al., 2003)を利用
21111
1
kCkAR
dt
dC
42322
2
kCkAR
dt
dC
63512
3
kCkAR
dt
dC
10
11
11
1121111
1
R
Ck
CV
RbkCkAR
dt
dR
R
R
R
20
12
12
226351242322
2
R
Ck
CV
RbkCkARkCkAR
dt
dR
R
R
R
0
1
1
S
Ck
CV
Sb
dt
dS
s
s
s
11110
1
1
11
116351221111
1
1
AAdA
K
S
K
CV
AbkCkARkCkAR
dt
dA
EX
S
A
A
A
22220
22
22
2242322
2
AAdA
CK
CV
AbkCkAR
dt
dA
EX
A
A
A
LasR
Cell membrane
LasR
RhlR
RhlR
RhlI
RsaL
LasI
lasR
lasI
rsaL
rhlI
Virulence
genes
rhlR
C12 C12
C4C4
-
+
+
+
+
+
+
+
8物質
23反応
31パラメーター
18. 補足:解析的に解く vs 数値的に解く
微分方程式を解く (解析的に解く)
言うならば、「微分方程式入門」みたいな数学の本は、これまで解析的に解け
る事が証明できてる式のカタログみたいなもの
ただし、システムバイオロジーの分野では、解析的に解けないモデルが殆ど
式変形
(ラプラス変換、フーリエ変換等
数学のテクニックを駆使)
−
dx
𝑑𝑡
= 𝑘 𝑎 𝑥0 − 𝑘𝑥
𝑥 =
𝑘 𝑎 𝐹 𝑥0
𝑘 𝑎 − 𝑘
(𝑒−𝑘𝑡
− 𝑒−𝑘 𝑎 𝑡
)
19. 補足:解析的に解く vs 数値的に解く
微分方程式を解く (数値的に解く = 数値計算、シミュレーション)
オイラー法(次頁)等
近似アルゴリズムを利用
タイムステップ( ∆𝑡 )毎に物質の濃度を少しづつ算出
𝑑𝑥
𝑑𝑡
= −𝑝𝑥 + 𝑝𝑦,
𝑑𝑦
𝑑𝑡
= −𝑥𝑧 + 𝑟𝑥 − 𝑦,
𝑑𝑧
𝑑𝑡
= 𝑥𝑦 − 𝑏𝑧
𝑥 𝑡+∆𝑡 = 𝑥 𝑡 + −𝑝𝑥 𝑡 + 𝑝𝑦𝑡 ×∆𝑡,
𝑦𝑡+∆𝑡 = 𝑦𝑡 + −𝑥 𝑡 𝑧𝑡 + 𝑟𝑥 𝑡 − 𝑦𝑡 ×∆𝑡,
𝑧𝑡+∆𝑡 = 𝑧𝑡 + 𝑥 𝑡 𝑦𝑡 + 𝑏𝑧𝑡 ×∆𝑡
time x y z
t = 0 1 1 1
t = 0.001 1.004 0.997 1.052
t = 0.002 1.008 0.980 1.204
…
漸化式
初期値を設定
20. 補足:オイラー法
𝑑𝑥
𝑑𝑡
= lim
∆𝑡→0
𝑓 𝑡 + ∆𝑡 − 𝑓(𝑡)
∆𝑡
計算機は極限という概
念が理解できない
∆𝑡を実際の小さい数字として使う
𝑑𝑥
𝑑𝑡
≈
𝑓 𝑡 + ∆𝑡 − 𝑓(𝑡)
∆𝑡
他にも、ルンゲクッタ法等、
数値計算手法は様々
𝑓 𝑡 + ∆𝑡 = 𝑓 𝑡 +
𝑑𝑥
𝑑𝑡
× ∆𝑡
例:
𝑑𝑥
𝑑𝑡
= 𝑡 + 2 の場合
f(t)は未知だが各ステップ毎に値はわかる
∆𝑡 = 0.01とする
Xの初期値は0とする
・t = 0
x = 1
・t = 0.01
x = 1 + ( 0 + 2 ) × 0.01
= 1.02
・t = 0.02
x = 1.02 + ( 0.01 + 2) × 0.01
= 1.0401
… これを数百~数万回繰り返す
21. Step.3 実装(R)
# ライブラリ読み込み
library(deSolve)
# ODEモデルを定義
QS <- function(t, x, p) {
# パラメーターを定義
k1 <- p["k1"]; k2 <- p["k2"]; k3 <- p["k3"]; k4 <- p["k4"]; k5 <- p["k5"]
k6 <- p["k6"]; bR1 <- p["bR1"]; bR2 <- p["bR2"]; bS <- p["bS"]
bA1 <- p["bA1"]; bA2 <- p["bA2"]; R10 <- p["R10"]; R20 <- p["R20"]
S0 <- p["S0"]; A10 <- p["A10"]; A20 <- p["A20"]; VR1 <- p["VR1"]
VR2 <- p["VR2"]; VS <- p["VS"]; VA1 <- p["VA1"]; VA2 <- p["VA2"]
KR1 <- p["KR1"]; KR2 <- p["KR2"]; KS <- p["KS"]; KA1 <- p["KA1"]
KA2 <- p["KA2"]; KS1 <- p["KS1"]; d1 <- p["d1"]; d2 <- p["d2"]
A1ex <- p["A1ex"]; A2ex <- p["A2ex"]
##### (次頁に続く)#####
http://journal.r-project.org/archive/2010-2/RJournal_2010-2_Soetaert~et~al.pdf
Rで微分方程式を解くパッケージ
22. Step.3 実装(R)
#####(前頁の続き)#####
# ODEを定義
F1 <- - k3 * x[1] * x[4] + k2 * x[6] - bR1 * x[1] + VR1 * x[6] / (KR1 + x[6]) + R10
F2 <- - k3 * x[2] * x[5] + k4 * x[7] - k5 * x[2] * x[4] + k6 * x[8] - bR2 * x[2] +
VR2 * x[6] / (KR2 + x[6]) + R20
F3 <- - k3 * x[2] * x[5] + k4 * x[7] - bR2 * x[2] + VR2 * x[6] / (KR2 + x[6]) + R20
F4 <- - k1 * x[1] * x[4] + k2 * x[6] - k5 * x[2] * x[5] + k6 * x[8] - bA1 * x[4] +
VA1 * x[6] / (x[6] + KA1 * (1 + (x[3] / KS1))) + A10 + d1 * (A1ex - x[4])
F5 <- - k3 * x[2] * x[5] + k4 * x[7] - bA2 * x[5] + VA2 * x[7] / (KA2 + x[7]) + A20
+ d2 * (A2ex - x[5])
F6 <- k1 * x[1] * x[4] - k2 * x[6]
F7 <- k3 * x[2] * x[5] - k4 * x[7]
F8 <- k5 * x[2] * x[4] - k6 * x[8]
list(c(F1, F2, F3, F4, F5, F6, F7, F8))
}
23. Step.4 計算(ODEを解く)
# パラメーターの値を設定
params <- c(
k1=0.0027, k2=0.00486, k3=0.0027, k4=0.00486, k5=0.0027, k6=0.00486,
bR1=0.000021, bR2=0.000021, bS=0.000021, bA1=0.000052, bA2=0.000052,
R10=0.000246, R20=0.000244, S0=0.000733, A10=0.000282, A20=0.000023,
VR1=0.13, VR2=0.13, VS=0.13, VA1=0.13, VA2=0.13,
KR1=5, KR2=5, KS=5, KA1=5, KA2=5, KS1=5,
d1=0.2, d2=0.4, A1ex=0, A2ex=0
)
# 初期値を設定
init <- c(0, 0, 0, 0, 0, 0, 0, 0)
# 計算ステップ(0.0001刻みで、0→50まで計算、50000ステップ)
times <- seq(0, 50, by=0.0001)
# ODEを解く
result <- ode(init, times, QS, params, method="euler")
deSolveは他にもODEを数値的に解く関数を多数用意
http://cran.r-project.org/web/packages/deSolve/vignettes/deSolve.pdf