ERP 指标测量:峰值、平均幅值与潜伏期
波形画出来只是第一步。这一课把波形变成能进表格、能进统计的数字:测什么 (峰值还是平均幅值)、在哪测(时间窗)、怎么测(潜伏期),以及哪些错不能犯。
🎯 本节学习目标
- 理解峰值测量为什么对噪声敏感:它总是倾向于"抓住"噪声尖峰
- 掌握平均幅值与 ROI 的计算,理解它作为首选指标的理由
- 会用"文献依据 + 数据驱动"两条线索确定时间窗,并能在方法部分说明理由
- 会计算峰值潜伏期与 50% 分数面积潜伏期,知道各自的适用场景
- 牢记测量窗口跨条件、跨被试必须一致,能对照常见错误清单自查
一、从波形到数字:为什么必须"测量"
统计软件吃的是数字,不是图。要做"条件 A 和条件 B 有没有差异"的检验, 你需要为每个被试 × 每个条件提炼出一个数(比如 P300 的幅值)。 这个从波形到一个数的过程,就是测量(measurement)。它看起来不起眼, 却直接决定统计的结论——测错了,后面全白做。
① 确定要测的成分(P300、N170、N400……) ② 确定时间窗:文献依据优先,数据驱动为辅 ③ 确定电极或 ROI(一组电极的集合) ④ 选择指标:平均幅值(首选)/ 峰值 / 潜伏期 ⑤ 每个被试 x 每个条件得到一个数 → 交给 3.3 做统计
二、峰值测量:直观,但怕噪声
峰值幅值(peak amplitude)= 测量窗内的最大值(正波)或最小值(负波); 峰值潜伏期(peak latency)= 极值出现的时刻。这是最古老、最直观的测法, 也方便与早期文献对比。
%% 峰值幅值与峰值潜伏期(ERP 为 3.1 算好的 通道 x 时间 矩阵)
win = [250 350]; % 测量窗口 (ms)
idx = EEG.times >= win(1) & EEG.times <= win(2); % 窗口内时间点下标
tWin = EEG.times(idx); % 窗口内的时间轴
wave = ERP(chIdx, idx); % 该电极在窗口内的波形
[vMax, iMax] = max(wave); % 正波峰值(如 P300)
[vMin, iMin] = min(wave); % 窗口内最小值(负波用)
fprintf('峰值: %.2f uV @ %.0f ms\n', vMax, tWin(iMax));
fprintf('谷值: %.2f uV @ %.0f ms\n', vMin, tWin(iMin));
问题在噪声。峰值取的是窗口内单个点的极值——而噪声恰恰喜欢制造尖峰。 对正波来说,"最大值"几乎总是落在某个正向噪声尖上:幅值被系统性抬高; 至于尖峰出现在哪一格,全看噪声心情——所以峰值潜伏期会跳来跳去。 信噪比越低、试次越少,这两个问题越严重。
%% 峰值 vs 平均幅值:谁更怕噪声?
% 20 个"被试":同样的信号 + 各自不同的随机噪声
fs = 500; t = 0 : 1/fs : 0.6;
sig = 6 * exp(-((t - 0.3) / 0.05).^2); % 300ms、峰值 6 uV 的成分
idxWin = t >= 0.25 & t <= 0.35; % 250-350ms 测量窗
nSub = 20;
peakVals = zeros(nSub, 1); meanVals = zeros(nSub, 1);
for s = 1:nSub
wave = sig + 8 * randn(size(t)); % 一个人的"一次测量"
peakVals(s) = max(wave(idxWin)); % 窗口内最大值
meanVals(s) = mean(wave(idxWin)); % 窗口内均值
end
fprintf('峰值测量: 均值 %.2f,个体间标准差 %.2f\n', mean(peakVals), std(peakVals));
fprintf('均值测量: 均值 %.2f,个体间标准差 %.2f\n', mean(meanVals), std(meanVals));
% 反复运行几次:峰值普遍高于 6(被噪声抬高),且波动更大
三、平均幅值:把窗口摊平了量(首选)
测量窗内所有时间点电位的平均值。窗口内几十上百个采样点的噪声 互相抵消(还是 √N 那套逻辑),所以它比峰值稳定得多——这是没有特殊理由时的默认选择。
%% 平均幅值:单电极版 + ROI 版
meanAmp = mean(ERP(chIdx, idx)); % 一个数 (uV)
fprintf('Pz 250-350ms 平均幅值: %.2f uV\n', meanAmp);
% ROI 版:一组电极一起平均,空间上再稳一层
roi = {'Pz','P3','P4','CPz','CP1','CP2'}; % 顶叶 ROI(预先确定,别事后挑)
roiIdx = find(ismember({EEG.chanlocs.labels}, roi));
meanAmpROI = mean(ERP(roiIdx, idx), 'all'); % 电极 x 时间 一起平均
fprintf('顶叶 ROI 平均幅值: %.2f uV\n', meanAmpROI);
| 指标 | 怎么算 | 优点 | 缺点 |
|---|---|---|---|
| 峰值幅值 | 窗口内单点极值 | 直观;便于与早期文献对比 | 被噪声尖峰抬高;个体间波动大 |
| 平均幅值 | 窗口内所有点的均值 | 稳定,不受单点噪声支配 | 对很窄或时间上不对称的效应敏感度略低 |
除非你的研究问题本身关于"峰"(或需要与只报告峰值的老文献对比),否则一律首选平均幅值, 配合 ROI 使用。这不是风格偏好,而是抗噪声能力的差别——上面的模拟实验已经演示过了。
四、时间窗怎么选:两条依据,一个禁区
窗口选择的正当来源有两个:
- 文献依据(首选):同类范式、同类成分下,前人用的窗口。例如 oddball 范式的 P300 常用 300-500ms 或峰前后各 100ms;
- 数据驱动(需说明):在自己的跨条件总平均波形上,看成分的起止,据此定窗。允许,但必须在方法部分写明"窗口依据组平均波形确定"。
窗口宽度以盖住成分主体为准:太窄会切掉信号,太宽会稀释效应、混入邻近成分。
分别在每个条件里找最大值再定窗,等于先偷看答案再出题:窗口必然落在两条件差异最大处, 几乎"必然显著"。这是循环论证,审稿人一眼就能识破。数据驱动定窗必须基于 跨条件的总平均(grand average across conditions),且各条件用同一个窗。
五、潜伏期:峰值潜伏期与 50% 分数面积潜伏期
潜伏期回答"成分什么时候出现"。最直接的测法是峰值潜伏期,但它继承峰值的所有毛病 (噪声尖峰在哪,它就在哪)。更稳健的替代是分数面积潜伏期: 在覆盖整个成分的窗口里累积面积,面积达到总面积 50% 的时刻。 它把整个成分的形状都算进来,个别噪声尖峰撼动不了它。
%% 50% 分数面积潜伏期
win = [250 450]; % 注意:要覆盖整个成分,比峰值窗宽
idx = EEG.times >= win(1) & EEG.times <= win(2);
tWin = EEG.times(idx);
w = squeeze(ERP(chIdx, idx)); % 窗口内波形(行向量)
% 若测负波(如 N170),先翻转符号:w = -w;
w = w - min(w); % 抬升到 0 以上,面积才有意义
areaTot = trapz(tWin, w); % 总面积
areaCum = cumtrapz(tWin, w); % 从窗口起点开始的累积面积
lat50 = interp1(areaCum, tWin, 0.5 * areaTot); % 面积达到 50% 的时刻
fprintf('50%% 分数面积潜伏期: %.0f ms\n', lat50);
| 方法 | 定义 | 优点 | 适用场景 |
|---|---|---|---|
| 峰值潜伏期 | 极值出现的时刻 | 简单、直观 | 信噪比高的成分;与早期文献对比 |
| 50% 分数面积潜伏期 | 累积面积达 50% 的时刻 | 对噪声稳健,反映成分整体的时间移动 | 比较两条件"谁更快"时的首选 |
六、铁律:一把尺子量到底
同一个指标在所有条件、所有被试、(原则上)所有电极上必须用同一个窗口。 窗口不同,测的就不是同一个东西,"差异"的大小完全由窗口选择制造。 电极与 ROI 的选择同理:预先定好、写进分析计划,不要"试几个电极挑显著的那个"。
七、常见错误清单
- 挑窗口:看着哪里差异大就在哪测——循环论证,结果无效;
- 以峰值搜索定窗:让程序在数据里自动找最大值来确定窗口中心,把噪声尖峰当成了成分;
- 跨被试窗口不一致:比如"每个被试各自找自己的波峰",各人测的不是同一回事,组间无法比较;
- 跨条件窗口不一致:A 条件用 250-350ms、B 条件用 300-400ms,差异由窗口"制造";
- 高噪声数据上直接用峰值潜伏期:测到的是噪声的时间,不是脑的时间;
- 峰值与平均幅值混着报告:同一指标在不同分析间混用,读者无法比较,也容易被质疑选择性报告。
📌 本节小结
- 峰值总倾向于抓住噪声尖峰:幅值被系统性抬高,潜伏期随机跳动
- 平均幅值把窗口内所有点摊平了量,噪声互相抵消——没有特别理由时的首选
- 时间窗两条依据:文献优先;数据驱动必须基于跨条件总平均,并在方法部分如实说明
- 潜伏期首选 50% 分数面积潜伏期:对噪声稳健,反映成分整体的时间移动
- 窗口跨条件、跨被试一致是铁律;"看结果挑窗口"是审稿人一抓一个准的错误
✏️ 课后练习
- 运行噪声敏感性小实验,把噪声幅度依次改成 3、8、15 uV,记录峰值测量与均值测量的个体间标准差,整理成一张对比表。
- 对你的 ERP 计算 Pz 的三个数:250-350ms 平均幅值、窗口内峰值幅值、250-450ms 的 50% 分数面积潜伏期,整理成一行结果表。
- 对照常见错误清单逐条自查你的分析方案,把每条的答案写成一句话——这几句话就是你方法部分的雏形。