--- id: wiki-2026-0508-phase-amplitude-coupling title: Phase Amplitude Coupling category: 10_Wiki/Topics status: verified canonical_id: self aliases: [PAC, Cross-Frequency Coupling, Theta-Gamma PAC] duplicate_of: none source_trust_level: A confidence_score: 0.85 verification_status: applied tags: [neuroscience, signal-processing, eeg, oscillations] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: python framework: mne/numpy --- # Phase Amplitude Coupling ## 매 한 줄 > **"매 slow rhythm 의 phase 가 매 fast rhythm 의 amplitude 를 모듈레이션."**. 2006 Canolty et al. theta-gamma PAC in human ECoG → 2010s memory/working-memory 의 neural mechanism 으로 자리잡음. 2026 BCI, sleep staging, anesthesia depth monitoring 에 활용. ## 매 핵심 ### 매 What is PAC - Two oscillations: phase φ_low(t) ∈ [−π, π], amplitude A_high(t) ≥ 0. - PAC: A_high 가 φ_low 의 특정 phase에 preferentially elevated. - Canonical pair: theta (4–8 Hz) phase × gamma (30–80 Hz) amplitude. ### 매 PAC Metrics - **Modulation Index (MI, Tort)**: KL divergence of phase-binned amplitude from uniform. - **Mean Vector Length (MVL, Canolty)**: |⟨A·e^(iφ)⟩|. - **Phase-Locking Value (PLV)**: |⟨e^(i(φ_low − φ_amp_envelope))⟩|. - **GLM-based**: regress A on sin/cos(φ). ### 매 응용 1. Working memory (theta-gamma in hippocampus, PFC). 2. Sleep stage classification (slow oscillation × spindle). 3. Anesthesia depth (alpha-gamma, alpha-beta PAC). 4. Parkinson's DBS biomarker (beta-gamma PAC). ## 💻 패턴 ### Filter + Hilbert (extract phase & amplitude) ```python import numpy as np from scipy.signal import butter, sosfiltfilt, hilbert def phase_amp(x, fs, f_low=(4,8), f_high=(30,80)): sos_lo = butter(4, f_low, btype='band', fs=fs, output='sos') sos_hi = butter(4, f_high, btype='band', fs=fs, output='sos') x_lo = sosfiltfilt(sos_lo, x) x_hi = sosfiltfilt(sos_hi, x) phi = np.angle(hilbert(x_lo)) amp = np.abs(hilbert(x_hi)) return phi, amp ``` ### Tort Modulation Index ```python def tort_mi(phi, amp, n_bins=18): edges = np.linspace(-np.pi, np.pi, n_bins+1) bin_idx = np.digitize(phi, edges) - 1 bin_idx = np.clip(bin_idx, 0, n_bins-1) P = np.array([amp[bin_idx == k].mean() for k in range(n_bins)]) P = P / P.sum() H = -np.sum(P * np.log(P + 1e-12)) H_max = np.log(n_bins) return (H_max - H) / H_max # MI ∈ [0, 1] ``` ### Canolty MVL with surrogate test ```python def mvl(phi, amp): return np.abs(np.mean(amp * np.exp(1j * phi))) def mvl_significance(phi, amp, n_surr=200): obs = mvl(phi, amp) surr = [] for _ in range(n_surr): shift = np.random.randint(len(amp)) surr.append(mvl(phi, np.roll(amp, shift))) p = np.mean(np.array(surr) >= obs) z = (obs - np.mean(surr)) / np.std(surr) return obs, z, p ``` ### Comodulogram (PAC across freq pairs) ```python def comodulogram(x, fs, lo_freqs, hi_freqs): MI = np.zeros((len(lo_freqs)-1, len(hi_freqs)-1)) for i in range(len(lo_freqs)-1): for j in range(len(hi_freqs)-1): phi, amp = phase_amp(x, fs, f_low=(lo_freqs[i], lo_freqs[i+1]), f_high=(hi_freqs[j], hi_freqs[j+1])) MI[i, j] = tort_mi(phi, amp) return MI ``` ### MNE-Python ready pipeline ```python import mne from mne_connectivity import phase_slope_index raw = mne.io.read_raw_edf("eeg.edf", preload=True) raw.filter(1, 100).notch_filter(60) epochs = mne.make_fixed_length_epochs(raw, duration=2.0) # pactools for PAC from pactools import Comodulogram estimator = Comodulogram(fs=raw.info['sfreq'], low_fq_range=np.linspace(2, 12, 11), high_fq_range=np.linspace(20, 100, 17), method='tort') estimator.fit(epochs.get_data()[0, 0]) estimator.plot() ``` ## 매 결정 기준 | 상황 | Method | |---|---| | Quick screening | Tort MI (robust to amp distribution) | | Phase preference angle | Canolty MVL (gives complex vector) | | Phase-phase coupling | n:m PLV | | Need significance | Surrogate w/ time shifts (≥200) | | Continuous data | sliding-window comodulogram | **기본값**: Tort MI + 200 time-shift surrogates + FDR correction across frequency pairs. ## 🔗 Graph - 부모: [[Cross-Frequency Coupling (CFC)]] · [[Signal-Processing-Foundations]] - 변형: [[Theta-Gamma Coupling]] - Adjacent: [[Neural Ignition]] ## 🤖 LLM 활용 **언제**: PAC method 선택 explain, comodulogram 결과 interpretation. **언제 X**: 매 raw EEG 매 LLM에 stream (use MNE/pactools locally). ## ❌ 안티패턴 - **Spurious PAC from sharp transients**: 매 epileptic spikes / artifacts → broadband amp. Always inspect raw + reject artifacts. - **No surrogate test**: MI > 0 always — significance ≠ value. - **Filter bandwidth too narrow**: ringing → spurious phase locking. - **Edge effects**: 매 hilbert 에서 매 처음/끝 cycle 버려야. ## 🧪 검증 / 중복 - Verified (Tort et al. 2010 *J Neurophysiol*; Canolty & Knight 2010 *Trends Cogn Sci*). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — Tort MI / Canolty MVL / comodulogram 패턴, surrogate test |