Open In Colab   Open in Kaggle

はじめに

概要

本日は因果関係について話します。因果関係とは、ある変数が他の変数にどのように影響を与えるかを問うためのツールです。神経科学のあらゆる場面で因果的な問いは存在します。ニューロンは互いにどのように影響し合うのか?薬物はニューロンにどのような影響を与えるのか?刺激は行動にどのように影響するのか?これらの因果的な問いにどう答えられるかを考えます。チュートリアル1では因果関係の定義を学び、システムへの摂動を考えることで因果関係が自然に導かれる様子を見ます。チュートリアル2では相関が因果の代理としてしばしば用いられること、しかし大規模なシステムではこの直感が誤りであることを学びます。チュートリアル3では標準的なアプローチとして回帰分析で測定されていない変数を補正する方法と、その際に生じるバイアスを見ます。最後にチュートリアル4では、時に因果関係をバイアスなく学べる手法である操作変数法について学びます。イントロでは基本概念を教え、アウトロでは慎重な科学的検証の必要性について広く概観します。全体として、本日は因果的な問いに伴う避けられない問題点と、時に推定を可能にするアプローチを学びます。

因果的な問いは神経科学のあらゆる分野で重要です。例えばモデルフィッティング(W1D3)、機械学習(W1D4)、次元削減(W1D5)は因果モデルの是非を議論する際によく用いられます。例えば、回帰分析はfMRIデータに基づきある脳領域が別の脳領域に影響を与えていると主張するために使われることがあります。本日の教材はこのアプローチに伴う問題点をより深く理解させてくれます。因果関係とベイズ統計学(W3D1)には密接な関連があり、ベイズ手法は因果推定に用いられます(例:Judea Pearlの研究)。因果関係は科学の基盤と見なされることが多く、本日の教材は何であるかについて明確にします。

因果的アプローチは神経科学の中心的な役割を果たします。実験を行う際には、しばしば被験者を治療群と対照群にランダムに割り当てます。あるいは動物をランダムな時間に刺激します。これらはすべてチュートリアル1で扱うランダム化された摂動のバリエーションであり、神経科学の大部分を占めるでしょう。またモデルフィッティング(チュートリアル2と3参照)を頻繁に用いて脳の働きについて議論を進めます。これはスパイクデータ、EEGデータ、イメージングデータなどで一般的です。最後に、操作変数法を用いて薬物治療などの効果を推定できる場合もあります。本日の教材は神経科学の核心にありながら、しばしば無視されがちです。

# @title Install and import feedback gadget


from vibecheck import DatatopsContentReviewContainer
def content_review(notebook_section: str):
    return DatatopsContentReviewContainer(
        "",  # No text prompt
        notebook_section,
        {
            "url": "https://pmyvdlilci.execute-api.us-east-1.amazonaws.com/klab",
            "name": "neuromatch_cn",
            "user_key": "y1x3mpx5",
        },
    ).render()


feedback_prefix = "W3D5_Intro"

ビデオ

# @markdown
from ipywidgets import widgets
from IPython.display import YouTubeVideo
from IPython.display import IFrame
from IPython.display import display


class PlayVideo(IFrame):
  def __init__(self, id, source, page=1, width=400, height=300, **kwargs):
    self.id = id
    if source == 'Bilibili':
      src = f'https://player.bilibili.com/player.html?bvid={id}&page={page}'
    elif source == 'Osf':
      src = f'https://mfr.ca-1.osf.io/render?url=https://osf.io/download/{id}/?direct%26mode=render'
    super(PlayVideo, self).__init__(src, width, height, **kwargs)


def display_videos(video_ids, W=400, H=300, fs=1):
  tab_contents = []
  for i, video_id in enumerate(video_ids):
    out = widgets.Output()
    with out:
      if video_ids[i][0] == 'Youtube':
        video = YouTubeVideo(id=video_ids[i][1], width=W,
                             height=H, fs=fs, rel=0)
        print(f'Video available at https://youtube.com/watch?v={video.id}')
      else:
        video = PlayVideo(id=video_ids[i][1], source=video_ids[i][0], width=W,
                          height=H, fs=fs, autoplay=False)
        if video_ids[i][0] == 'Bilibili':
          print(f'Video available at https://www.bilibili.com/video/{video.id}')
        elif video_ids[i][0] == 'Osf':
          print(f'Video available at https://osf.io/{video.id}')
      display(video)
    tab_contents.append(out)
  return tab_contents


video_ids = [('Youtube', 'GjZfhXfn42w'), ('Bilibili', 'BV1U5411a7vy')]
tab_contents = display_videos(video_ids, W=854, H=480)
tabs = widgets.Tab()
tabs.children = tab_contents
for i in range(len(tab_contents)):
  tabs.set_title(i, video_ids[i][0])
display(tabs)

スライド

# @markdown
from IPython.display import IFrame
link_id = "fsxkt"
print(f"If you want to download the slides: https://osf.io/download/{link_id}/")
IFrame(src=f"https://mfr.ca-1.osf.io/render?url=https://osf.io/{link_id}/?direct%26mode=render%26action=download%26mode=render", width=854, height=480)
# @title Submit your feedback
content_review(f"{feedback_prefix}_Video")