1. Intoroduction
- ホルモンの時間パターンは単純なステップ刺激ではない(が、通常の実験での刺激パターンはいわゆる"入れっぱなし"=ステップ刺激)
- 刺激パターンを忠実に再現するためには、「パルス刺激(一過性の変化)」・「ランプ刺激(穏やかな変化)」に分解する必要がある。
- パルス・ランプ刺激に対する応答は、ネットワークを見ても直感的には良くわからない。→実際にシミュレーションしてみよう!!
今日のテーマ
異なる刺激パターン(今まではステップ刺激。今回はパルス刺激やランプ刺激)に対するRas,Rap1の応答から、Ras,Rap1経路の特性を学ぶ
In [1]:
import numpy as np
import matplotlib.pyplot as plt
2. パルス刺激時のRas,Rap1モデルの応答特性
- パルス刺激に対するRas,Rap1の応答シミュレーション
- パルス刺激幅を変えた時のRas,Rap1の応答のシミュレーション
- パルス刺激幅と最大応答の関係性
In [2]:
def stimulatHandler(stimulat):
if stimulat["name"] == "step":
basal = stimulat["basal"] # 普段の刺激の強さ
start = stimulat["start"] # ステップ刺激を加え始める時間
intensity = stimulat["intensity"] # ステップ刺激の強さ
func = lambda t:intensity if t>=start else basal
elif stimulat["name"] == "pulse":
basal = stimulat["basal"] # 普段の刺激の強さ
start = stimulat["start"] # パルス刺激を加え始める時間
duration = stimulat["duration"] # パルス刺激を受け取る時間
intensity = stimulat["intensity"] # パルス刺激の強さ
func = lambda t: intensity if (start <= t and t<=duration) else basal
elif stimulat["name"] == "ramp":
basal = stimulat["basal"] # 普段の刺激の強さ
start = stimulat["start"] # ランプ刺激を加え始める時間
duration = stimulat["duration"] # ランプ刺激が増す時間
intensity = stimulat["intensity"] # ランプ刺激の最大値
velocity = intensity/duration # ランプ刺激の速度
func = lambda t: basal if t<start else t*velocity if t<=duration else intensity
elif stimulat["name"] == "step_wise":
basal = stimulat["basal"] # 最初の刺激の強さs
start = stimulat["start"] # ステップ刺激を加え始める時間
duration = stimulat["duration"] # ステップ刺激が大きくなる間隔
fold_change = stimulat["fold change"] # 刺激の増幅量(×fold change)
func = lambda t: (fold_change ** ((t//duration)+1) ) * basal if start<=t else basal
else:
print("Error!! The stimulat name '{}' was not recognized!!".format(stimulat["name"]))
return func
In [3]:
# Rasの応答シミュレーション関数
def plot_Ras(ax, stimulat, dt=0.01, min_t=0, max_t=100,
k1=0.5, k2=5, k3=0.0005, k4=0.005, k5=0.05, k6=100,
S=1, GEFa=0, GAPa=0, Rasa=0,
color=None, return_max=None):
time = np.arange(min_t,max_t,dt)
Rasa_vals = np.zeros(len(time))
func = stimulatHandler(stimulat)
maxval=0
for i,t in enumerate(time):
dS = 0 * dt
dGEFa = (k1*S*(1-GEFa) - k2*GEFa) * dt
dGAPa = (k3*S*(1-GAPa) - k4*GAPa) * dt
dRasa = (k5*GEFa*(1-Rasa) - k6*GAPa*Rasa) * dt
GEFa+=dGEFa; GAPa+=dGAPa; Rasa+=dRasa
S = func(t) # 刺激は制御を受けている。
Rasa_vals[i] = Rasa # Rasaの刺激を記録。
if t>=0 and maxval<Rasa: maxval=Rasa # Rasaの最大値を記録。(t>=0のみ)
ax.plot(time, Rasa_vals, label=stimulat["label"], color=color)
if return_max: return ax, maxval
return ax
In [4]:
# Rap1の応答シミュレーション関数
def plot_Rap1(ax, stimulat, dt=0.01, min_t=0, max_t=100,
k1=0.5, k2=0.5, k3=0.2, k4=10,
S=1, GEFa=0, GAPa=0.005, Rap1a=0,
color=None, return_max=None):
time = np.arange(min_t,max_t,dt)
Rap1a_vals = np.zeros(len(time))
func = stimulatHandler(stimulat)
maxval=0
for i,t in enumerate(time):
dS = 0 * dt
dGEFa = (k1*S*(1-GEFa) - k2*GEFa) * dt
dGAPa = 0 * dt
dRap1a = (k3*(1-Rap1a)*GEFa - k4*Rap1a*GAPa) * dt
GEFa+=dGEFa; GAPa+=dGAPa; Rap1a+=dRap1a
S = func(t) # 刺激は制御を受けている。
Rap1a_vals[i] = Rap1a # Rap1aの刺激を記録。
if t>=0 and maxval<Rap1a: maxval=Rap1a # Rap1aの最大値を記録。(t>=0のみ)
ax.plot(time, Rap1a_vals, label=stimulat["label"], color=color)
if return_max: return ax, maxval
return ax
課題1.1:パルス刺激に対するRas,Rap1の応答シミュレーション¶
In [5]:
pulse_kadai1_1 = {
"name":"pulse",
"label":"pulse",
"basal": 0,
"start": 0,
"duration":10,
"intensity":1,
}
In [6]:
step_kadai1_1 = {
"name":"step",
"label":"step",
"basal":0,
"start":0,
"intensity":1,
}
In [7]:
fig = plt.figure(figsize=(12,8))
Ras_yticks = [0,5,10,15,20]
# Ras model
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_Ras(ax1, step_kadai1_1, color="blue")
ax1 = plot_Ras(ax1, pulse_kadai1_1, color="red")
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response ×$10^{-3}$")
ax1.set_yticks([i*1e-3 for i in Ras_yticks])
ax1.set_yticklabels(Ras_yticks)
ax1.legend()
# Rap1 model
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_Rap1(ax2, step_kadai1_1, color="blue")
ax2 = plot_Rap1(ax2, pulse_kadai1_1, color="red")
ax2.set_title("Rap1 model simulation.")
ax2.set_xlabel("time")
ax2.set_ylabel("response")
ax2.set_ylim(0,1)
ax2.legend()
plt.show()
課題1.2:パルス刺激幅を変えた時のRas,Rap1の応答のシミュレーション¶
In [8]:
pulse_kadai1_2_10sec = {
"name":"pulse",
"label":"pulse 10sec",
"basal": 0,
"start": 0,
"duration":10,
"intensity":1,
}
pulse_kadai1_2_60sec = {
"name":"pulse",
"label":"pulse 60sec",
"basal":0,
"start":0,
"duration":60,
"intensity":1,
}
step_kadai1_2 = {
"name":"step",
"label":"step",
"basal":0,
"start":0,
"intensity":1,
}
In [9]:
fig = plt.figure(figsize=(12,8))
Ras_yticks = [0,5,10,15,20]
# Ras model
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_Ras(ax1, step_kadai1_2, color="blue")
ax1 = plot_Ras(ax1, pulse_kadai1_2_10sec, color="red")
ax1 = plot_Ras(ax1, pulse_kadai1_2_60sec, color="green")
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response ×$10^{-3}$")
ax1.set_yticks([i*1e-3 for i in Ras_yticks])
ax1.set_yticklabels(Ras_yticks)
ax1.legend()
# Rap1 model
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_Rap1(ax2, step_kadai1_2, color="blue")
ax2 = plot_Rap1(ax2, pulse_kadai1_2_10sec, color="red")
ax2 = plot_Rap1(ax2, pulse_kadai1_2_60sec, color="green")
ax2.set_title("Rap1 model simulation.")
ax2.set_xlabel("time")
ax2.set_ylabel("response")
ax2.set_ylim(0,1)
ax2.legend()
plt.show()
課題1.3:パルス刺激幅と最大応答の関係性¶
In [10]:
duration_times = [10*i for i in range(1,11)]
In [11]:
pulses_kadai1_3 = [{
"name":"pulse",
"label":None,
"basal": 0,
"start": 0,
"duration":t,
"intensity":1,
} for t in duration_times]
In [12]:
fig = plt.figure(figsize=(12,8))
# Ras model
ax1 = fig.add_subplot(2,2,1)
Ras_maxres = []
for pulse in pulses_kadai1_3:
ax1,max_res = plot_Ras(ax1, pulse, return_max=True)
Ras_maxres.append(max_res)
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response")
ax1.set_yticks([0,0.005,0.01,0.015,0.02])
ax2 = fig.add_subplot(2,2,2)
ax2.plot(duration_times, Ras_maxres)
ax2.set_xlabel("duration time of pulse stimulat")
ax2.set_ylabel("max response")
ax2.set_ylim(0,0.02)
ax2.set_yticks([0,0.005,0.01,0.015,0.02])
# Rap1 model
ax3 = fig.add_subplot(2,2,3)
Rap1_maxres = []
for pulse in pulses_kadai1_3:
ax3,max_res = plot_Rap1(ax3, pulse, return_max=True)
Rap1_maxres.append(max_res)
ax3.set_title("Rap1 model simulation.")
ax3.set_xlabel("time")
ax3.set_ylabel("response")
ax3.set_yticks([0,0.5,1])
ax4 = fig.add_subplot(2,2,4)
ax4.plot(duration_times, Rap1_maxres)
ax4.set_xlabel("duration time of pulse stimulat")
ax4.set_ylabel("max response")
ax4.set_ylim(0,1)
ax4.set_yticks([0,0.5,1])
plt.tight_layout()
plt.show()
ここまでのまとめ
Rap1は短いパルスに応答しない→ノイズをキャンセルし、長期的な入力のみを認識できる。
3. ランプ刺激時のRas,Rap1モデルの応答特性
- ランプ刺激に対するRas,Rap1の応答シミュレーション
- ランプ刺激の刺激速度と最大応答の関係性
課題2.1:ランプ刺激に対するRas,Rap1の応答シミュレーション¶
In [13]:
ramp_kadai2_1 = {
"name":"ramp",
"label":"ramp",
"basal":0,
"start":0,
"duration":100,
"intensity":1,
}
step_kadai2_1 = {
"name":"step",
"label":"step",
"basal":0,
"start":0,
"intensity":1,
}
In [14]:
fig = plt.figure(figsize=(12,8))
# Ras model
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_Ras(ax1, step_kadai2_1, color="blue")
ax1 = plot_Ras(ax1, ramp_kadai2_1, color="red")
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response")
ax1.legend()
# Rap1 model
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_Rap1(ax2, step_kadai2_1, color="blue")
ax2 = plot_Rap1(ax2, ramp_kadai2_1, color="red")
ax2.set_title("Rap1 model simulation.")
ax2.set_xlabel("time")
ax2.set_ylabel("response")
ax2.legend()
plt.show()
課題2.2:ランプ刺激の刺激速度と最大応答の関係性¶
In [15]:
duration_times = [10*i for i in range(1,11)]
In [16]:
ramps_kadai2_2 = [{
"name":"ramp",
"label":None,
"basal":0,
"start":0,
"duration":t,
"intensity":1,
} for t in duration_times]
In [17]:
fig = plt.figure(figsize=(12,8))
# Ras model
ax1 = fig.add_subplot(2,2,1)
Ras_maxres = []
for ramp in ramps_kadai2_2:
ax1,max_res = plot_Ras(ax1, ramp, return_max=True)
Ras_maxres.append(max_res)
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response")
ax1.set_yticks([0,0.005,0.01,0.015,0.02])
ax2 = fig.add_subplot(2,2,2)
ax2.plot(duration_times, Ras_maxres)
ax2.set_xlabel("duration time of pulse stimulat")
ax2.set_ylabel("max response")
ax2.set_ylim(0,0.02)
ax2.set_yticks([0,0.005,0.01,0.015,0.02])
# Rap1 model
ax3 = fig.add_subplot(2,2,3)
Rap1_maxres = []
for ramp in ramps_kadai2_2:
ax3,max_res = plot_Rap1(ax3, ramp, return_max=True)
Rap1_maxres.append(max_res)
ax3.set_title("Rap1 model simulation.")
ax3.set_xlabel("time")
ax3.set_ylabel("response")
ax3.set_yticks([0,0.5,1])
ax4 = fig.add_subplot(2,2,4)
ax4.plot(duration_times, Rap1_maxres)
ax4.set_xlabel("duration time of pulse stimulat")
ax4.set_ylabel("max response")
ax4.set_ylim(0,1)
ax4.set_yticks([0,0.5,1])
plt.tight_layout()
plt.show()
ここまでのまとめ
Rap1は短いパルスに応答しない→ノイズをキャンセルし、長期的な入力のみを認識できる。
Rasはランプ刺激の刺激強度の変化が遅いと活性が減少←new
Rasモデルのfold-change detection
- ここまで調べてきた応答特性は、工学(信号処理)の枠組みの延長→生物学に特有の応答特性はあるか?
- 生物学的システムの応答特性
- 適応(Adaptation)
- ウェーバーの法則(Weber's law):「生物の感覚は、現在の環境に対して相対的」※類似概念:「限界効用逓減の法則」(経済学)
- 適応+ウェーバーの法則 = Fold-change dbetection:「生物の感覚は入力の倍変化(fold-change)に特異的な応答をする」
Fold-change dbetection¶
- 論文:Fold-change detection in biological systems
- 色々な生物種・機能に見られる
- 走化性
- 走光性
- シグナル伝達系
- 嗅覚・視覚神経
- Fold-change detectionを実現する回路は大きく分けて2種類ある
- フィードフォワード型(下画像のA)
- フィードバック型(下画像のB)
Rasモデルは、フィードフォワード型FCD回路に似ている
→Rasモデルがfold-change detectionを示すか調べる!!
課題3.1:Ras, Rap1モデルのステップワイズ刺激に対する応答¶
In [18]:
step_kadai3_1 = {
"name":"step",
"label":"step",
"basal":0.1,
"start":0,
"intensity": 0.5,
}
step_wise_kadai3_1 = {
"name":"step_wise",
"label":"step_wise",
"basal":0.1,
"start":0,
"duration": 500,
"fold change": 5,
}
In [19]:
fig = plt.figure(figsize=(12,8))
Ras_yticks = [0,1,2,3,4]
# Ras model
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_Ras(ax1, step_kadai3_1, color="blue", min_t=-1000, max_t=1000)
ax1 = plot_Ras(ax1, step_wise_kadai3_1, color="red", min_t=-1000, max_t=1000)
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response ×$10^{-3}$")
ax1.set_yticks([i*1e-3 for i in Ras_yticks])
ax1.set_yticklabels(Ras_yticks)
ax1.set_xlim(0,1000)
ax1.set_ylim(0,4*1e-3)
ax1.legend()
# Rap1 model
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_Rap1(ax2, step_kadai3_1, color="blue", min_t=-1000, max_t=1000)
ax2 = plot_Rap1(ax2, step_wise_kadai3_1, color="red", min_t=-1000, max_t=1000)
ax2.set_title("Rap1 model simulation.")
ax2.set_xlabel("time")
ax2.set_ylabel("response")
ax2.set_xlim(0,1000)
ax2.set_ylim(0,1)
ax2.legend()
plt.show()
課題3.2:Ras, Rap1モデルの同じfold-changeで異なるbasalのパルス刺激に対する応答¶
In [20]:
step_kadai3_2_1 = {
"name":"pulse",
"label":"pulse basal=0.1",
"basal":0.1,
"start":0,
"intensity": 0.5,
"duration":60,
}
step_kadai3_2_2 = {
"name":"pulse",
"label":"pulse basal=0.2",
"basal":0.2,
"start":0,
"intensity": 1.0,
"duration":60,
}
In [21]:
fig = plt.figure(figsize=(12,8))
Ras_yticks = [0,1,2,3,4]
# Ras model
ax1 = fig.add_subplot(2,2,1)
ax1 = plot_Ras(ax1, step_kadai3_2_1, color="blue", min_t=-1000)
ax1 = plot_Ras(ax1, step_kadai3_2_2, color="red", min_t=-1000)
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response ×$10^{-3}$")
ax1.set_yticks([i*1e-3 for i in Ras_yticks])
ax1.set_yticklabels(Ras_yticks)
ax1.set_xlim(0,100)
ax1.set_ylim(0,4*1e-3)
ax1.legend()
# Rap1 model
ax2 = fig.add_subplot(2,2,2)
ax2 = plot_Rap1(ax2, step_kadai3_2_1, color="blue", min_t=-1000)
ax2 = plot_Rap1(ax2, step_kadai3_2_2, color="red", min_t=-1000)
ax2.set_title("Rap1 model simulation.")
ax2.set_xlabel("time")
ax2.set_ylabel("response")
ax2.set_xlim(0,100)
ax2.set_ylim(0,1)
ax2.legend()
plt.show()
課題3.3:同じfold-change で異なるbasalのパルス刺激におけるbasalと最大応答の関係性¶
In [22]:
basals = np.arange(0,0.2,0.02) + 0.02
In [23]:
fold_change = 5
In [24]:
step_kadai3_3 = [{
"name":"pulse",
"label":None,
"basal":basal,
"start":0,
"intensity":basal*fold_change,
"duration":60,
} for basal in basals]
In [25]:
fig = plt.figure(figsize=(12,8))
Ras_yticks = [0,1,2,3,4]
# Ras model
ax1 = fig.add_subplot(2,2,1)
Ras_maxres = []
for stimulat in step_kadai3_3:
ax1,max_res = plot_Ras(ax1, stimulat, return_max=True, min_t=-1000)
Ras_maxres.append(max_res)
ax1.set_title("Ras model simulation.")
ax1.set_xlabel("time")
ax1.set_ylabel("response ×$10^{-3}$")
ax1.set_yticks([i*1e-3 for i in Ras_yticks])
ax1.set_yticklabels(Ras_yticks)
ax1.set_xlim(0,100)
ax1.set_ylim(0,4*1e-3)
ax2 = fig.add_subplot(2,2,2)
ax2.plot(basals, Ras_maxres)
ax2.set_xlabel("basal")
ax2.set_ylabel("max response ×$10^{-3}$")
ax2.set_yticks([i*1e-3 for i in Ras_yticks])
ax2.set_yticklabels(Ras_yticks)
# Rap1 model
ax3 = fig.add_subplot(2,2,3)
Rap1_maxres = []
for stimulat in step_kadai3_3:
ax3,max_res = plot_Rap1(ax3, stimulat, return_max=True, min_t=-1000)
Rap1_maxres.append(max_res)
ax3.set_title("Rap1 model simulation.")
ax3.set_xlabel("time")
ax3.set_ylabel("response")
ax3.set_yticks([0,0.5,1])
ax3.set_xlim(0,100)
ax4 = fig.add_subplot(2,2,4)
ax4.plot(basals, Rap1_maxres)
ax4.set_xlabel("basal")
ax4.set_ylabel("max response")
ax4.set_ylim(0,1)
ax4.set_yticks([0,0.5,1])
plt.tight_layout()
plt.show()
結論
Rasモデルはfold-change detectionを示す!
Rasモデルはfold-change detectionを示す!
fold-change detectionを示す意義・利点とは?
→環境の変化を「相対値」で見ることができる点。外部シグナルは大抵ノイズが相対値でのっているので、その値を捉えることができること…? </b>
In [ ]: