3S
  • Portfolio Top
  • Categories
  • Tags
  • Archives

シミュレーション実習 Day4

シミュレーション実習¶

Day.4: シグナル伝達系の応答特性

  • 担当:黒田研究室
  • 実習のwiki:Slides and programs

概要¶

  1. Intoroduction
  2. パルス刺激時のRas,Rap1モデルの応答特性
  3. ランプ刺激時のRas,Rap1モデルの応答特性
  4. Rasモデルのfold-change detection

1. Intoroduction

  • ホルモンの時間パターンは単純なステップ刺激ではない(が、通常の実験での刺激パターンはいわゆる"入れっぱなし"=ステップ刺激)
  • 刺激パターンを忠実に再現するためには、「パルス刺激(一過性の変化)」・「ランプ刺激(穏やかな変化)」に分解する必要がある。
  • パルス・ランプ刺激に対する応答は、ネットワークを見ても直感的には良くわからない。→実際にシミュレーションしてみよう!!
今日のテーマ

異なる刺激パターン(今まではステップ刺激。今回はパルス刺激やランプ刺激)に対するRas,Rap1の応答から、Ras,Rap1経路の特性を学ぶ

In [1]:
import numpy as np
import matplotlib.pyplot as plt

2. パルス刺激時のRas,Rap1モデルの応答特性

  1. パルス刺激に対するRas,Rap1の応答シミュレーション
  2. パルス刺激幅を変えた時のRas,Rap1の応答のシミュレーション
  3. パルス刺激幅と最大応答の関係性
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()

  • Ras: 応答の最大値は変わらない。
  • Rap1: 応答の最大値が減少。
  • 課題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()
    

  • Ras: $10,60$ の両方の刺激に応答できる。
  • Rap1: $60$ の刺激にのみ応答できる。
  • 課題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()
    

  • Ras: $10$ 以上のパルス幅がないと十分応答できない。
  • Rap1: $40$ 以上のパルス幅がないと十分応答できない。
  • ここまでのまとめ

    Rap1は短いパルスに応答しない→ノイズをキャンセルし、長期的な入力のみを認識できる。

    3. ランプ刺激時のRas,Rap1モデルの応答特性

    1. ランプ刺激に対するRas,Rap1の応答シミュレーション
    2. ランプ刺激の刺激速度と最大応答の関係性

    課題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

    • ここまで調べてきた応答特性は、工学(信号処理)の枠組みの延長→生物学に特有の応答特性はあるか?
    • 生物学的システムの応答特性
      1. 適応(Adaptation)
      2. ウェーバーの法則(Weber's law):「生物の感覚は、現在の環境に対して相対的」※類似概念:「限界効用逓減の法則」(経済学)
      3. 適応+ウェーバーの法則 = 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を示す!

    fold-change detectionを示す意義・利点とは?

    →環境の変化を「相対値」で見ることができる点。外部シグナルは大抵ノイズが相対値でのっているので、その値を捉えることができること…? </b>

    In [ ]:
     
    

    • « シミュレーション実習 Day3
    • 生体物質化学Ⅱ 第12回 »
    hidden
    Table of Contents
    Published
    Jul 12, 2019
    Last Updated
    Jul 12, 2019
    Category
    生命科学基礎実験
    Tags
    • 3S 95
    • 生命科学基礎実験 14
    Contact
    Other contents
    • Home
    • Blog
    • Front-End
    • Kerasy
    • Python-Charmers
    • Translation-Gummy
      • 3S - Shuto's Notes
      • MIT
      • Powered by Pelican. Theme: Elegant