<div dir="ltr">Dear Burkhard,<div><br></div><div>Thank you very much for your input. I totally missed the bandwidth point. I rerun the cluster based comparing the 500hz lowpass filtered at 40hz and the downsampled data to 125hz (see code below). As you suggested, the cluster analysis output is almost identical.</div><div><br></div><div>Best,</div><div><br></div><div>Diego</div><div><br></div><div><br></div><div>%-------------------------------</div><div><div><br></div><div>fsample = 500;</div><div>sigma = 0.5;</div><div>ferf = 6.0; </div><div>Aerf1 = -0.7;</div><div>Aerf2 = -0.2;</div><div>tau1 = 0.1;</div><div>tau2 = 0.05;</div><div>t = -0.8:1/fsample:0.8; </div><div>signoise = 0.2;</div><div>t0 = 0.05;</div><div>t0idx = nearest(t,t0);</div><div>ntrials = 100;</div><div><br></div><div>data1.label{1}='Oz';</div><div>data2.label{1}='Oz';</div><div><br></div><div>for k=1:ntrials;</div><div>  freq1 = normrnd(ferf,sigma);</div><div>  freq2 = normrnd(ferf,sigma);</div><div>  for tk = 1:size(t,2);</div><div>    phi1 = random('uniform',0,pi,1,1);</div><div>    phi2 = random('uniform',0,pi,1,1);</div><div>    if tk > t0idx;</div><div>      Serf1(1,tk) = Aerf2 * exp(1 - ((t(1,tk)-t0)/tau1)) * sin(2*pi*freq1*(t(1,tk)-t0)+phi1);</div><div>      Serf2(1,tk) = Aerf2 * exp(1 - ((t(1,tk)-t0)/tau2)) * sin(2*pi*freq2*(t(1,tk)-t0)+phi2);</div><div>    end</div><div>    Snoise1 = signoise.*randn(size(t));</div><div>    Snoise2 = signoise.*randn(size(t));</div><div>  end</div><div>  data1.trial{k}(1,:) = Serf1 + Snoise1;</div><div>  data1.time{k} = t;</div><div>  data2.trial{k}(1,:) = Serf2 + Snoise2;</div><div>  data2.time{k} = t;</div><div>end</div><div><br></div><div>cfg = [];</div><div>cfg.keeptrials = 'yes';</div><div>timelock1 = ft_timelockanalysis(cfg, data1);</div><div>timelock2 = ft_timelockanalysis(cfg, data2);</div><div><br></div><div>diff = timelock1;</div><div>diff.avg = timelock1.avg-timelock2.avg;</div><div><br></div><div>figure;plot(t,[timelock1.avg' timelock2.avg' diff.avg']);</div><div>legend('condition 1', 'condition 2', 'difference');</div><div><br></div><div>cfg = [];</div><div>cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];</div><div>cfg.ivar = 1;</div><div>cfg.method = 'montecarlo';</div><div>cfg.statistic = 'indepsamplesT';</div><div>cfg.correctm = 'cluster';</div><div>cfg.numrandomization = 5000;</div><div>stat = ft_timelockstatistics(cfg, timelock1, timelock2);</div><div><br></div><div>figure;</div><div>subplot(4,1,1); plot(stat.time, stat.stat); ylabel('t-value');</div><div>title('raw data: unfiltered')</div><div>subplot(4,1,2); plot(diff.time, diff.avg); ylabel('avg1-avg2 (uV)');</div><div>subplot(4,1,3); semilogy(stat.time, stat.prob); ylabel('prob'); </div><div>subplot(4,1,4); plot(stat.time, stat.mask); ylabel('significant'); </div><div><br></div><div><br></div><div>%% low pass 40 Hz</div><div>cfg          = [];</div><div>cfg.lpfilter = 'yes';</div><div>cfg.lpfreq   = 40;</div><div>data1_lp40   = ft_preprocessing(cfg, data1);</div><div>data2_lp40   = ft_preprocessing(cfg, data2);</div><div><br></div><div>cfg = [];</div><div>cfg.keeptrials = 'yes';</div><div>timelock1 = ft_timelockanalysis(cfg, data1_lp40);</div><div>timelock2 = ft_timelockanalysis(cfg, data2_lp40);</div><div><br></div><div>diff_lp40 = timelock1;</div><div>diff_lp40.avg = timelock1.avg-timelock2.avg;</div><div><br></div><div>figure;plot(t,[timelock1.avg' timelock2.avg' diff_lp40.avg']);</div><div><br></div><div><br></div><div>cfg = [];</div><div>cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];</div><div>cfg.ivar = 1;</div><div>cfg.method = 'montecarlo';</div><div>cfg.statistic = 'indepsamplesT';</div><div>cfg.correctm = 'cluster';</div><div>cfg.numrandomization = 5000;</div><div>stat_lp40 = ft_timelockstatistics(cfg, timelock1, timelock2);</div><div><br></div><div>figure;</div><div>subplot(4,1,1); plot(stat_lp40.time, stat_lp40.stat); ylabel('t-value');</div><div>title('lowpass filtering 40Hz')</div><div>subplot(4,1,2); plot(diff_lp40.time, diff_lp40.avg); ylabel('avg1-avg2 (uV)');</div><div>subplot(4,1,3); semilogy(stat_lp40.time, stat_lp40.prob); ylabel('prob'); </div><div>subplot(4,1,4); plot(stat_lp40.time, stat_lp40.mask); ylabel('significant'); </div><div><br></div><div><br></div><div>%% boxcar 0.25ms</div><div>cfg = [];</div><div>cfg.boxcar = 0.25;</div><div>data1_box   = ft_preprocessing(cfg, data1);</div><div>data2_box   = ft_preprocessing(cfg, data2);</div><div><br></div><div>cfg = [];</div><div>cfg.keeptrials = 'yes';</div><div>timelock1 = ft_timelockanalysis(cfg, data1_box);</div><div>timelock2 = ft_timelockanalysis(cfg, data2_box);</div><div><br></div><div>diff = timelock1;</div><div>diff.avg = timelock1.avg-timelock2.avg;</div><div><br></div><div>figure;plot(t,[timelock1.avg' timelock2.avg' diff.avg']);</div><div><br></div><div>cfg = [];</div><div>cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];</div><div>cfg.ivar = 1;</div><div>cfg.method = 'montecarlo';</div><div>cfg.statistic = 'indepsamplesT';</div><div>cfg.correctm = 'cluster';</div><div>cfg.numrandomization = 5000;</div><div>stat = ft_timelockstatistics(cfg, timelock1, timelock2);</div><div><br></div><div>figure;</div><div>subplot(4,1,1); plot(stat.time, stat.stat); ylabel('t-value');</div><div>title('boxcar filter 0.25s')</div><div>subplot(4,1,2); plot(diff.time, diff.avg); ylabel('avg1-avg2 (uV)');</div><div>subplot(4,1,3); semilogy(stat.time, stat.prob); ylabel('prob'); </div><div>subplot(4,1,4); plot(stat.time, stat.mask); ylabel('significant'); </div><div><br></div><div><br></div><div>%% downsample the data</div><div>cfg = [];</div><div>cfg.resamplefs = 125;</div><div>cfg.demean = 'yes';</div><div>data1_res = ft_resampledata(cfg, data1);</div><div>data2_res = ft_resampledata(cfg, data2);</div><div><br></div><div>cfg = [];</div><div>cfg.keeptrials = 'yes';</div><div>timelock1 = ft_timelockanalysis(cfg, data1_res);</div><div>timelock2 = ft_timelockanalysis(cfg, data2_res);</div><div><br></div><div>diff_res = timelock1;</div><div>diff_res.avg = timelock1.avg-timelock2.avg;</div><div><br></div><div>figure;plot(diff_res.time,[timelock1.avg' timelock2.avg' diff_res.avg']);</div><div><br></div><div>cfg = [];</div><div>cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];</div><div>cfg.ivar = 1;</div><div>cfg.method = 'montecarlo';</div><div>cfg.statistic = 'indepsamplesT';</div><div>cfg.correctm = 'cluster';</div><div>cfg.numrandomization = 5000;</div><div>stat_res = ft_timelockstatistics(cfg, timelock1, timelock2);</div><div><br></div><div>figure;</div><div>hold all;subplot(4,1,1); plot(stat_res.time, stat_res.stat); ylabel('t-value');</div><div>title('downsample to 125 Hz')</div><div>hold all;subplot(4,1,2); plot(diff_res.time, diff_res.avg); ylabel('avg1-avg2 (uV)');</div><div>hold all;subplot(4,1,3); semilogy(stat_res.time, stat_res.prob); ylabel('prob'); </div><div>subplot(4,1,4); plot(stat_res.time, stat_res.mask); ylabel('significant'); </div><div><br></div><div><br></div><div>%% all in one plot</div><div>figure;</div><div>subplot(4,1,1); plotyy(stat_res.time, stat_res.stat, stat_lp40.time, stat_lp40.stat); ylabel('t-value');</div><div>subplot(4,1,2); plotyy(diff_res.time, diff_res.avg, diff_lp40.time, diff_lp40.avg); ylabel('avg1-avg2 (uV)');</div><div>subplot(4,1,3); semilogy(stat_res.time, stat_res.prob); hold all;semilogy(stat_lp40.time, stat_lp40.prob); ylabel('prob'); </div><div>subplot(4,1,4); plotyy(stat_res.time, stat_res.mask,stat_lp40.time, stat_lp40.mask); ylabel('significant'); </div><div>legend('downsampled 125hz','500hz + lpfilt 40hz')</div></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 27 June 2018 at 13:58, Burkhard Maess <span dir="ltr"><<a href="mailto:maess@cbs.mpg.de" target="_blank">maess@cbs.mpg.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Irina and Diego,<br>
<br>
I am also expecting that the permutation test is rather insensitive to the bandwidth of the underlying data. I only would like to comment on the resampling issue: as a rule of thumb, often a third of the sampling frequency is assumed to represent the available bandwidth. With this ratio - the 500Hz sampled data represents about 160Hz bandwidth. Applying a lowpass of 40Hz (of similar steepness as the one used during the recording) will divide the bandwidth by four. Consequently, dividing the sampling rate by 4 is appropriate: 125Hz, which corresponds to delta-t of 8ms. The suggested 25ms by the reviewer are related to the 40Hz, but averaging over the 25ms would constitute an additional lowpass of poor quality. <br>
I would therefore recommend to rerun the cluster analysis using subsampled data. In principle, you may retrieve four different sets from the subsampling routine by taking either always the first, the second, the third or the forth sample of the 8ms interval. However, the results of the cluster analysis should be almost identical.<br>
<br>
best wishes,<br>
Burkhard<br>
<br>
<br>
<br>
--<br>
Dr. Burkhard Maess<br>
Max Planck Institute for Human Cognitive and Brain Sciences<br>
Stephanstr. 1a, D-04301 Leipzig, Germany<br>
phone/fax: +49 341 9940-2526/-2511   mail: maess 'at' <a href="http://cbs.mpg.de" rel="noreferrer" target="_blank">cbs.mpg.de</a>,   <a href="http://www.cbs.mpg.de" rel="noreferrer" target="_blank">http://www.cbs.mpg.de</a><br>
<div><div class="h5"><br>
----- Original Message -----<br>
| From: "Diego Lozano-Soldevilla" <<a href="mailto:dlozanosoldevilla@gmail.com">dlozanosoldevilla@gmail.com</a>><br>
| To: "FieldTrip discussion list" <<a href="mailto:fieldtrip@science.ru.nl">fieldtrip@science.ru.nl</a>><br>
| Sent: Wednesday, 27 June, 2018 12:09:43<br>
| Subject: Re: [FieldTrip] low-pass filtering<br>
<br>
| Hi Irina,<br>
| <br>
| On the one hand, the smoothing can indeed influence the cluster size. On the<br>
| other hand, the "type" of smoothing will influence how sensitive are you to<br>
| detect the potential differences too. I would try to illustrate the reviewer<br>
| the trade off between the type of differences you may have (transient vs<br>
| sustained; regarding the temporal domain) and the filter type that can be more<br>
| appropriate to detect the differences to justify your pipeline. I have no idea<br>
| about the type of ERF you're studying but I hope the example is illustrative<br>
| enough<br>
| <br>
| Look at the attached screenshot. In the first column, I simulated a transient<br>
| ERF with added noise (code below) and I ran the non-parametric cluster-based<br>
| permutation test that showed some significant and discontinuous differences.<br>
| The second column represents the same data but with a lowpass filter (40 Hz)<br>
| and I find longer significant clusters. If you look at the filtered ERFs, the<br>
| structure is very similar to the noisy, unfiltered version. The third column is<br>
| what I understand is requested by the reviewer. Suddenly, no significant<br>
| differences are found because the ground truth simulated difference was too<br>
| short and weak to survive the 0.25ms averaging. In case of a long and sustained<br>
| ERF, may be the three plots would had been more congruent.<br>
| <br>
| I guess that the permutation part of the cluster-based nonparametric test will<br>
| take into account the non-independecy in the data resulting from low-pass<br>
| filtering. This non-independency will be the same for the original and the<br>
| permuted surrogates.<br>
| <br>
| I hope that helps!<br>
| <br>
| Diego<br>
| <br>
| <br>
| <br>
| %-----------------------------<wbr>----<br>
| <br>
| fsample = 600;<br>
| sigma = 0.5;<br>
| ferf = 6.0;<br>
| Aerf1 = -0.7;<br>
| Aerf2 = -0.2;<br>
| tau1 = 0.1;<br>
| tau2 = 0.05;<br>
| t = -0.8:1/fsample:0.8;<br>
| signoise = 0.2;<br>
| t0 = 0.05;<br>
| t0idx = nearest(t,t0);<br>
| ntrials = 100;<br>
| <br>
| data1.label{1}='Oz';<br>
| data2.label{1}='Oz';<br>
| <br>
| for k=1:ntrials;<br>
| freq1 = normrnd(ferf,sigma);<br>
| freq2 = normrnd(ferf,sigma);<br>
| for tk = 1:size(t,2);<br>
| phi1 = random('uniform',0,pi,1,1);<br>
| phi2 = random('uniform',0,pi,1,1);<br>
| if tk > t0idx;<br>
| Serf1(1,tk) = Aerf2 * exp(1 - ((t(1,tk)-t0)/tau1)) *<br>
| sin(2*pi*freq1*(t(1,tk)-t0)+<wbr>phi1);<br>
| Serf2(1,tk) = Aerf2 * exp(1 - ((t(1,tk)-t0)/tau2)) *<br>
| sin(2*pi*freq2*(t(1,tk)-t0)+<wbr>phi2);<br>
| end<br>
| Snoise1 = signoise.*randn(size(t));<br>
| Snoise2 = signoise.*randn(size(t));<br>
| end<br>
| data1.trial{k}(1,:) = Serf1 + Snoise1;<br>
| data1.time{k} = t;<br>
| data2.trial{k}(1,:) = Serf2 + Snoise2;<br>
| data2.time{k} = t;<br>
| end<br>
| <br>
| cfg = [];<br>
| cfg.keeptrials = 'yes';<br>
| timelock1 = ft_timelockanalysis(cfg, data1);<br>
| timelock2 = ft_timelockanalysis(cfg, data2);<br>
| <br>
| diff = timelock1;<br>
| diff.avg = timelock1.avg-timelock2.avg;<br>
| <br>
| figure;plot(t,[timelock1.avg' timelock2.avg' diff.avg']);<br>
| legend('condition 1', 'condition 2', 'difference');<br>
| <br>
| cfg = [];<br>
| cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];<br>
| cfg.ivar = 1;<br>
| cfg.method = 'montecarlo';<br>
| cfg.statistic = 'indepsamplesT';<br>
| cfg.correctm = 'cluster';<br>
| cfg.numrandomization = 5000;<br>
| stat = ft_timelockstatistics(cfg, timelock1, timelock2);<br>
| <br>
| figure;<br>
| subplot(4,1,1); plot(stat.time, stat.stat); ylabel('t-value');<br>
| title('raw data: unfiltered')<br>
| subplot(4,1,2); plot(diff.time, diff.avg); ylabel('avg1-avg2 (uV)');<br>
| subplot(4,1,3); semilogy(stat.time, stat.prob); ylabel('prob');<br>
| subplot(4,1,4); plot(stat.time, stat.mask); ylabel('significant');<br>
| <br>
| <br>
| %% low pass 40 Hz<br>
| cfg = [];<br>
| cfg.lpfilter = 'yes';<br>
| cfg.lpfreq = 40;<br>
| data1_lp40 = ft_preprocessing(cfg, data1);<br>
| data2_lp40 = ft_preprocessing(cfg, data2);<br>
| <br>
| cfg = [];<br>
| cfg.keeptrials = 'yes';<br>
| timelock1 = ft_timelockanalysis(cfg, data1_lp40);<br>
| timelock2 = ft_timelockanalysis(cfg, data2_lp40);<br>
| <br>
| diff = timelock1;<br>
| diff.avg = timelock1.avg-timelock2.avg;<br>
| <br>
| figure;plot(t,[timelock1.avg' timelock2.avg' diff.avg']);<br>
| <br>
| <br>
| cfg = [];<br>
| cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];<br>
| cfg.ivar = 1;<br>
| cfg.method = 'montecarlo';<br>
| cfg.statistic = 'indepsamplesT';<br>
| cfg.correctm = 'cluster';<br>
| cfg.numrandomization = 5000;<br>
| stat = ft_timelockstatistics(cfg, timelock1, timelock2);<br>
| <br>
| figure;<br>
| subplot(4,1,1); plot(stat.time, stat.stat); ylabel('t-value');<br>
| title('lowpass filtering 40Hz')<br>
| subplot(4,1,2); plot(diff.time, diff.avg); ylabel('avg1-avg2 (uV)');<br>
| subplot(4,1,3); semilogy(stat.time, stat.prob); ylabel('prob');<br>
| subplot(4,1,4); plot(stat.time, stat.mask); ylabel('significant');<br>
| <br>
| <br>
| %% boxcar 0.25ms<br>
| cfg = [];<br>
| cfg.boxcar = 0.25;<br>
| data1_box = ft_preprocessing(cfg, data1);<br>
| data2_box = ft_preprocessing(cfg, data2);<br>
| <br>
| cfg = [];<br>
| cfg.keeptrials = 'yes';<br>
| timelock1 = ft_timelockanalysis(cfg, data1_box);<br>
| timelock2 = ft_timelockanalysis(cfg, data2_box);<br>
| <br>
| diff = timelock1;<br>
| diff.avg = timelock1.avg-timelock2.avg;<br>
| <br>
| figure;plot(t,[timelock1.avg' timelock2.avg' diff.avg']);<br>
| <br>
| cfg = [];<br>
| cfg.design = [ 1*ones(1,ntrials) 2*ones(1,ntrials) ];<br>
| cfg.ivar = 1;<br>
| cfg.method = 'montecarlo';<br>
| cfg.statistic = 'indepsamplesT';<br>
| cfg.correctm = 'cluster';<br>
| cfg.numrandomization = 5000;<br>
| stat = ft_timelockstatistics(cfg, timelock1, timelock2);<br>
| <br>
| figure;<br>
| subplot(4,1,1); plot(stat.time, stat.stat); ylabel('t-value');<br>
| title('boxcar filter 0.25s')<br>
| subplot(4,1,2); plot(diff.time, diff.avg); ylabel('avg1-avg2 (uV)');<br>
| subplot(4,1,3); semilogy(stat.time, stat.prob); ylabel('prob');<br>
| subplot(4,1,4); plot(stat.time, stat.mask); ylabel('significant');<br>
| <br>
| <br>
| <br>
| <br>
| <br>
| On 26 June 2018 at 17:16, Simanova, I. (Irina) < <a href="mailto:i.simanova@donders.ru.nl">i.simanova@donders.ru.nl</a> ><br>
| wrote:<br>
| <br>
| <br>
| <br>
| Dear experts,<br>
| <br>
| We recently submitted a paper where we use a cluster permutation analysis of<br>
</div></div>| ERFs (testing conditions exchangeability) . The EEG was sampled at 500 Hz and<br>
<span class="">| low-pass filtered at 40 Hz during preprocessing. One of the reviewers has<br>
</span>| indicated that u sing this temporal resolution for the analysis seems<br>
<div class="HOEnZb"><div class="h5">| unnecessary given the low-pass filter, which makes each time point not<br>
| independent due to smoothing. He further asks: " Do all key significant<br>
| components replicate if the analysis is performed using a mean amplitude that<br>
| is averaged for larger time bins (25 ms bins) instead of individual time<br>
| points?"<br>
| <br>
| I understand that when doing parametric analysis one might want to reduce the<br>
| number of comparisons by averaging ERF samples over time bins. But here we<br>
| solve the MCP with the cluster analysis. But it also seems like the reviewer is<br>
| concerned about non-independecy in the data resulting from low-pass filtering.<br>
| I wanted to check with you: can smoothing time-series indeed compromise the<br>
| cluster-based analysis (e.g. affect the cluster size)?<br>
| <br>
| Thank you,<br>
| Kind regards,<br>
| Irina<br>
| <br>
| <br>
| <br>
| <br>
| ______________________________<wbr>_________________<br>
| fieldtrip mailing list<br>
| <a href="https://mailman.science.ru.nl/mailman/listinfo/fieldtrip" rel="noreferrer" target="_blank">https://mailman.science.ru.nl/<wbr>mailman/listinfo/fieldtrip</a><br>
| <a href="https://doi.org/10.1371/journal.pcbi.1002202" rel="noreferrer" target="_blank">https://doi.org/10.1371/<wbr>journal.pcbi.1002202</a><br>
| <br>
| <br>
| ______________________________<wbr>_________________<br>
| fieldtrip mailing list<br>
| <a href="https://mailman.science.ru.nl/mailman/listinfo/fieldtrip" rel="noreferrer" target="_blank">https://mailman.science.ru.nl/<wbr>mailman/listinfo/fieldtrip</a><br>
| <a href="https://doi.org/10.1371/journal.pcbi.1002202" rel="noreferrer" target="_blank">https://doi.org/10.1371/<wbr>journal.pcbi.1002202</a><br>
______________________________<wbr>_________________<br>
fieldtrip mailing list<br>
<a href="https://mailman.science.ru.nl/mailman/listinfo/fieldtrip" rel="noreferrer" target="_blank">https://mailman.science.ru.nl/<wbr>mailman/listinfo/fieldtrip</a><br>
<a href="https://doi.org/10.1371/journal.pcbi.1002202" rel="noreferrer" target="_blank">https://doi.org/10.1371/<wbr>journal.pcbi.1002202</a><br>
</div></div></blockquote></div><br></div>