阶段二 · 核心分析能力 · 模块 3 · 第 7 课 / 共 28 课

ERP 指标测量:峰值、平均幅值与潜伏期

波形画出来只是第一步。这一课把波形变成能进表格、能进统计的数字:测什么 (峰值还是平均幅值)、在哪测(时间窗)、怎么测(潜伏期),以及哪些错不能犯。

🕐 45 分钟🎯 难度:进阶✅ 前置:3.1

🎯 本节学习目标

  • 理解峰值测量为什么对噪声敏感:它总是倾向于"抓住"噪声尖峰
  • 掌握平均幅值与 ROI 的计算,理解它作为首选指标的理由
  • 会用"文献依据 + 数据驱动"两条线索确定时间窗,并能在方法部分说明理由
  • 会计算峰值潜伏期与 50% 分数面积潜伏期,知道各自的适用场景
  • 牢记测量窗口跨条件、跨被试必须一致,能对照常见错误清单自查

一、从波形到数字:为什么必须"测量"

统计软件吃的是数字,不是图。要做"条件 A 和条件 B 有没有差异"的检验, 你需要为每个被试 × 每个条件提炼出一个数(比如 P300 的幅值)。 这个从波形到一个数的过程,就是测量(measurement)。它看起来不起眼, 却直接决定统计的结论——测错了,后面全白做。

① 确定要测的成分(P300、N170、N400……)
② 确定时间窗:文献依据优先,数据驱动为辅
③ 确定电极或 ROI(一组电极的集合)
④ 选择指标:平均幅值(首选)/ 峰值 / 潜伏期
⑤ 每个被试 x 每个条件得到一个数 → 交给 3.3 做统计

二、峰值测量:直观,但怕噪声

峰值幅值(peak amplitude)= 测量窗内的最大值(正波)或最小值(负波); 峰值潜伏期(peak latency)= 极值出现的时刻。这是最古老、最直观的测法, 也方便与早期文献对比。

Matlab
%% 峰值幅值与峰值潜伏期(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));

问题在噪声。峰值取的是窗口内单个点的极值——而噪声恰恰喜欢制造尖峰。 对正波来说,"最大值"几乎总是落在某个正向噪声尖上:幅值被系统性抬高; 至于尖峰出现在哪一格,全看噪声心情——所以峰值潜伏期会跳来跳去。 信噪比越低、试次越少,这两个问题越严重。

Matlab · 小实验
%% 峰值 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(被噪声抬高),且波动更大

三、平均幅值:把窗口摊平了量(首选)

📖 概念:平均幅值(mean amplitude)

测量窗内所有时间点电位的平均值。窗口内几十上百个采样点的噪声 互相抵消(还是 √N 那套逻辑),所以它比峰值稳定得多——这是没有特殊理由时的默认选择。

Matlab
%% 平均幅值:单电极版 + 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 使用。这不是风格偏好,而是抗噪声能力的差别——上面的模拟实验已经演示过了。

四、时间窗怎么选:两条依据,一个禁区

窗口选择的正当来源有两个:

  1. 文献依据(首选):同类范式、同类成分下,前人用的窗口。例如 oddball 范式的 P300 常用 300-500ms 或峰前后各 100ms;
  2. 数据驱动(需说明):在自己的跨条件总平均波形上,看成分的起止,据此定窗。允许,但必须在方法部分写明"窗口依据组平均波形确定"。

窗口宽度以盖住成分主体为准:太窄会切掉信号,太宽会稀释效应、混入邻近成分。

⚠️ 窗口不能"看着结果挑"

分别在每个条件里找最大值再定窗,等于先偷看答案再出题:窗口必然落在两条件差异最大处, 几乎"必然显著"。这是循环论证,审稿人一眼就能识破。数据驱动定窗必须基于 跨条件的总平均(grand average across conditions),且各条件用同一个窗。

五、潜伏期:峰值潜伏期与 50% 分数面积潜伏期

潜伏期回答"成分什么时候出现"。最直接的测法是峰值潜伏期,但它继承峰值的所有毛病 (噪声尖峰在哪,它就在哪)。更稳健的替代是分数面积潜伏期: 在覆盖整个成分的窗口里累积面积,面积达到总面积 50% 的时刻。 它把整个成分的形状都算进来,个别噪声尖峰撼动不了它。

Matlab
%% 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 的选择同理:预先定好、写进分析计划,不要"试几个电极挑显著的那个"。

七、常见错误清单

  1. 挑窗口:看着哪里差异大就在哪测——循环论证,结果无效;
  2. 以峰值搜索定窗:让程序在数据里自动找最大值来确定窗口中心,把噪声尖峰当成了成分;
  3. 跨被试窗口不一致:比如"每个被试各自找自己的波峰",各人测的不是同一回事,组间无法比较;
  4. 跨条件窗口不一致:A 条件用 250-350ms、B 条件用 300-400ms,差异由窗口"制造";
  5. 高噪声数据上直接用峰值潜伏期:测到的是噪声的时间,不是脑的时间;
  6. 峰值与平均幅值混着报告:同一指标在不同分析间混用,读者无法比较,也容易被质疑选择性报告。

📌 本节小结

  • 峰值总倾向于抓住噪声尖峰:幅值被系统性抬高,潜伏期随机跳动
  • 平均幅值把窗口内所有点摊平了量,噪声互相抵消——没有特别理由时的首选
  • 时间窗两条依据:文献优先;数据驱动必须基于跨条件总平均,并在方法部分如实说明
  • 潜伏期首选 50% 分数面积潜伏期:对噪声稳健,反映成分整体的时间移动
  • 窗口跨条件、跨被试一致是铁律;"看结果挑窗口"是审稿人一抓一个准的错误

✏️ 课后练习

  1. 运行噪声敏感性小实验,把噪声幅度依次改成 3、8、15 uV,记录峰值测量与均值测量的个体间标准差,整理成一张对比表。
  2. 对你的 ERP 计算 Pz 的三个数:250-350ms 平均幅值、窗口内峰值幅值、250-450ms 的 50% 分数面积潜伏期,整理成一行结果表。
  3. 对照常见错误清单逐条自查你的分析方案,把每条的答案写成一句话——这几句话就是你方法部分的雏形。