第4章: 前処理 — フィルタリングとリファレンス¶
前処理では、連続した Raw 信号をエポックに切り出す前にきれいにします。この章では、フィルタリング(不要な周波数成分の除去)と、再基準化(第1章の基準電極方式の変更)を扱います。
import mne
import matplotlib.pyplot as plt
from pathlib import Path
# 日本語の文字がグラフ内で正しく表示されるよう、フォントを設定する
plt.rcParams["font.sans-serif"] = ["Yu Gothic", "Meiryo", "MS Gothic", "DejaVu Sans"]
plt.rcParams["axes.unicode_minus"] = False
mne.set_log_level("WARNING")
sample_folder = Path(mne.datasets.sample.data_path()) / "MEG" / "sample"
raw = mne.io.read_raw_fif(sample_folder / "sample_audvis_raw.fif", preload=True)
raw.pick(["eeg", "eog"])
raw
| General | ||
|---|---|---|
| Filename(s) | sample_audvis_raw.fif | |
| MNE object type | Raw | |
| Measurement date | 2002-12-03 at 19:01:10 UTC | |
| Participant | Unknown | |
| Experimenter | MEG | |
| Acquisition | ||
| Duration | 00:04:38 (HH:MM:SS) | |
| Sampling frequency | 600.61 Hz | |
| Time points | 166,800 | |
| Channels | ||
| EEG | and | |
| EOG | ||
| Head & sensor digitization | 146 points | |
| Filters | ||
| Highpass | 0.10 Hz | |
| Lowpass | 172.18 Hz | |
フィルタリング¶
フィルタは、選択した周波数範囲の外側にある信号を除去します。EEGの前処理では、主に3種類のフィルタが登場します。
- ハイパスフィルタ(カットオフより低い周波数を除去。例: 1 Hz): 発汗、電極/皮膚のインピーダンス変化、アンプのドリフトによる緩やかなドリフトを取り除きます。
- ローパスフィルタ(カットオフより高い周波数を除去。例: 40 Hz): 筋活動やその他の高周波ノイズを取り除きます。ほとんどのERP成分は、いずれにせよ30 Hz以下に存在します。
- バンドパスフィルタ: ハイパスとローパスを1回の呼び出しで組み合わせたもの —
raw.filter(l_freq=1.0, h_freq=40.0)。 - ノッチフィルタ: 狭い周波数帯域を除去します。特に、50 Hz(世界の大半)または60 Hz(南北アメリカ、アジアの一部)の商用電源ノイズとその高調波を狙って除去します。
実際にフィルタをかけて、パワースペクトルを前後で比較してみましょう。
raw.compute_psd(picks="eeg").plot()
plt.gcf().suptitle("フィルタ前")
plt.show()
raw_filt = raw.copy().filter(l_freq=1.0, h_freq=40.0)
raw_filt.compute_psd(picks="eeg").plot()
plt.gcf().suptitle("1-40 Hz バンドパス適用後")
plt.show()


フィルタ後のプロットでは、1 Hz以下や40 Hz以上のパワーがほぼ消えていることに注目してください。これらの帯域は取り除かれました。このサンプルデータセットは、たまたますでに強い電源ノイズがない状態ですが、ノイズの多い記録(あなた自身のデータなど)に同じ処理を行う場合は、ノッチフィルタも必要です。
LINE_FREQ = 50 # あなたの国の商用電源周波数に応じて 60 に設定する
raw_filt.notch_filter(freqs=LINE_FREQ)
なぜエポック化の後ではなく前にフィルタをかけるのか? フィルタには、端のアーティファクトを避けるために、適用対象の区間の両端にある程度の「助走(runway)」となるデータが必要です。まず連続記録全体にフィルタをかけてから短いエポックに切り出すことで、それぞれの短いエポックの始まりと終わりが歪むのを防げます。
再基準化(リファレンスの変更)¶
第1章を思い出してください。すべてのEEGの値は「この電極 マイナス 基準」です。set_eeg_reference() を使えば、記録後でも数学的に基準を切り替えられます。ERP研究で最も一般的な目標は平均基準です。すべてのチャンネルの基準を、全EEGチャンネルの平均にします。
raw_avg_ref = raw_filt.copy().set_eeg_reference(ref_channels="average")
raw_avg_ref
| General | ||
|---|---|---|
| Filename(s) | sample_audvis_raw.fif | |
| MNE object type | Raw | |
| Measurement date | 2002-12-03 at 19:01:10 UTC | |
| Participant | Unknown | |
| Experimenter | MEG | |
| Acquisition | ||
| Duration | 00:04:38 (HH:MM:SS) | |
| Sampling frequency | 600.61 Hz | |
| Time points | 166,800 | |
| Channels | ||
| EEG | and | |
| EOG | ||
| Head & sensor digitization | 146 points | |
| Filters | ||
| Highpass | 1.00 Hz | |
| Lowpass | 40.00 Hz | |
他の選択肢としては、連結乳様突起リファレンスのための set_eeg_reference(ref_channels=["M1", "M2"]) や、単一チャンネル基準のための ref_channels=["Cz"] があります。普遍的に「正しい」選択というものはなく、あなたの研究デザインや、あなたの分野・比較対象となる先行研究での慣習によって決まります。迷ったら、探索的なERP解析においては平均基準が妥当なデフォルトです。
あなた自身のデータについての補足: あなたのファイルのチャンネルは、すでに CPz を基準にしています(元のチャンネル名 Fp1-CPz などに表れています)。これはすでに有効な単一チャンネル基準であり、そのままにしておいても構いませんし、何か理由があれば(例えば特定の既発表の実験パラダイムの慣習に合わせたいなど)、ここで示したのと同じ方法で平均基準や乳様突起基準に変更することもできます。
まとめ¶
- バンドパスフィルタ(例: 1–40 Hz)はドリフトと高周波ノイズを除去し、ノッチフィルタは電源ノイズを除去します。
- フィルタは必ず、エポック化する前の連続した
Rawデータに適用します。 set_eeg_reference()は、記録後に基準方式を数学的に切り替えます。