<div>Dear Jan-Mathijs,</div><div><br></div><div>Thanks for your reply. I know my post was a large one. I have two further questions that are borne out in more detail below: 1) how would one do connectivity analyses with 'fourier' data (the issue for "next time")? and 2) what's the difference between using 'powandcsd' and 'fourier'?</div>

<div><br></div><div>1. I'm still confused about the last case that you said to keep for next time (cfg.method='mtmconvol', cfg.output='fourier').</div>
<div>How do FT users run ft_freqstatistics on ft_connectivityanalysis data (processed as output='fourier') in a within-subjects experiment if the stats throw an error because of "chan_chan" in dimord? It seems like one must reshape plvspctrm/cohspctrm and modify dimord. However, for me, reshaping plvspctrm produces a dimension that is more than twice as large as it should be.</div>


<div>size(data_conn.plvspctrm)=129   129     9    33 (i.e., chan_chan_freq_time)</div><div>If I then reshape with</div><div>siz = size(data_conn.plvspctrm);</div><div>size(reshape(data_conn.plvspctrm,siz(1)*siz(2),siz(3),siz(4))) = 16641           9          33</div>


<div>and (16641-129)/2 = 8256, which are the nchoosek(129,2)=8256 channel combinations that I *should* have. So it seems that ft_connectivityanalysis is producing duplicate channel combinations (i.e., 'E1_E2' and 'E2_E1' when those should be equal) plus auto-correlations ('E1_E1'), and making some imagesc plots of the data confirms this.</div>


<div>People here are surely running PLV/coherence analyses (there have been questions about single-subject analyses with statfun_indepsamplesZcoh, which requires fourier input), so there must be a way to use fourier input.</div>


<div><br></div><div>The only thing I can figure is to instead use cfg.output='powandcsd' and implement the label-field creation trick you suggested. However, this doesn't seem like it's the only option because statfun_indepsamplesZcoh requires 'fourier'. Nonetheless, I tried using 'powandcsd' with the label trick and I was able to run ft_freqstatistics (finally!! doing both a t-test and a clusteranalysis), but it seems like FT could/should deal with the issue more elegantly instead of needing the trick. Maybe all coh/plv analyses ever done with FT have required this hack and maybe the correct reshape for fourier data still needs to be implemented, both of which are completely fine with me, but in that case I'm curious what hacks other people are using.</div>


<div><br></div><div>2. Despite being successful with powandcsd data, I still can't figure out how to use fourier data. That leads me to ask, what's the functional different between fourier and powandcsd output? Or rather, what can/can't I do with complex Fourier spectra? Will FT perform "better" (faster?) with one or the other? Are they used in different situations (it seems like I should be able to use either for PLV/coherence, especially since statfun_indepsamplesZcoh requires fourier)? If I also want to look at power, can I calculate it from the complex Fourier spectra? Sorry for my lack of knowledge in this department.</div>


<div><br></div><div>Thanks again for all the information.</div><div>Matt</div><div><br></div><br><div class="gmail_quote">On Wed, Mar 16, 2011 at 2:25 AM, jan-mathijs schoffelen <span dir="ltr"><<a href="mailto:jan.schoffelen@donders.ru.nl" target="_blank">jan.schoffelen@donders.ru.nl</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear Matt,<br>
<br>
As usual, thanks for your detailed report (although one also shouldn't exaggerate ;o) ).<br>
Reading your mail and attachment, it seems there are several features/problems in the code that restrict your analysis.<br>
In the following, I pasted your script and will provide some comments<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
=================================================================<br>
cfg_freq.method = 'wavelet';<br>
cfg_freq.output = 'powandcsd';<br>
cfg_freq.channelcmb = {'all','all'}; % 129 channels<br>
<br>
--------------------------------------<br>
ft_freqanalysis<br>
data_freq =<br>
        label: {129x1 cell}<br>
       dimord: 'chan_freq_time'<br>
         freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
         time: [1x33 double]<br>
    powspctrm: [129x9x33 double]<br>
     labelcmb: {8256x2 cell}<br>
    crsspctrm: [8256x9x33 double]<br>
          cfg: [1x1 struct]<br>
<br>
ft_connectivityanalysis with 'plv'<br>
data_conn =<br>
      labelcmb: {8256x2 cell}<br>
       dimord: 'chan_freq_time'<br>
    plvspctrm: [8256x9x33 double]<br>
         freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
         time: [1x33 double]<br>
          cfg: [1x1 struct]<br>
<br>
--------------------------------------<br>
FAILURE: can't run ft_freqgrandaverage on data_conn because there is no label field<br>
</blockquote>
<br>
This has indeed been noted by you and posted on bugzilla. We didn't find time to work on it yet, but as a general remark ft_freqgrandaverage (and ft_timelockgrandaverage and ft_sourcegrandaverage) were designed to work on univariate data only, i.e. it fails on data which comes out of ft_connectivityanalysis. As such there is no other reason for it than a historical one (the averaging functions were there long before we started doing serious connectivity stuff). Of course it should be possible to combine the data into one structure and do statistics later on, although I guess the clustering in the channel dimension becomes really complicated. Note, also that I pointed out to you that as such ft_XXXgrandaverage is not mandatory before calling ft_XXXstatistics, you can also input a cell-array of data structures. Yet, this will not help you because then you probably encounter a crash later on.<br>




<br>
SOLUTION for now: rename plvspctrm into powspctrm and create a label-field, e.g. by   for i =1:size(data_conn.labelcmb,1) data_conn.label{k} = [data_conn.labelcmb{i,1},'_',data_conn.labelcmb{i,2}]; end (and remove the labelcmb field)<br>




<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
--------------------------------------<br>
FAILURE: can't run ft_singleplotTFR on data_conn<br>
<br>
cfg_ft.cohrefchannel = 'E3';<br>
cfg_ft.channel = 'E60';<br>
selected 1408 channels for plvspctrm<br>
??? Error using ==> ft_channelselection at 72<br>
data with non-unique channel names is not supported<br>
<br>
Error in ==> ft_singleplotTFR at 290<br>
selchannel = ft_channelselection(cfg.channel, data.label);<br>
</blockquote>
<br>
The plotting functions keep haunting me. I thought that with my recent overhaul I made them somewhat more robust for plotting connectivity data.<br>
It would be helpful if you create a bug out of this specific section, and add an attachment containing data_conn, and cfg_ft)<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
--------------------------------------<br>
FAILURE: can't run ft_topoplotTFR on data_conn<br>
<br>
creating layout from data.elec<br>
creating layout for egi128 system<br>
selected 1408 channels for plvspctrm<br>
Warning: Duplicate x-y data points detected: using average of the z values.<br>
> In griddata at 108<br>
  In ft_plot_topo at 146<br>
  In ft_topoplotER at 747<br>
  In ft_topoplotTFR at 116<br>
??? Error using ==> griddata at 122<br>
Not enough unique sample points specified.<br>
<br>
Error in ==> ft_plot_topo at 146<br>
[Xi,Yi,Zi] = griddata(chanX', chanY, dat, xi', yi, interpmethod); % interpolate the topographic data<br>
<br>
Error in ==> ft_topoplotER at 747<br>
    ft_plot_topo(chanX,chanY,datavector,'interpmethod',cfg.interpolation,...<br>
<br>
Error in ==> ft_topoplotTFR at 116<br>
cfg=ft_topoplotER(cfg, varargin{:});<br>
=================================================================<br>
=================================================================<br>
</blockquote>
<br>
You requested only a single pair to be plotted (1 cohrefchannel and 1 channel). A topography does not makes sense. FieldTrip does not detect this, but the low-level interpolation function starts complaining.<br>
<br>
SOLUTION: don't call ft_topoplotTFR if you want to look at 1 TFR only, as specified by the cfg. In that case it should be possible to specify cfg.interactive = 'yes', allowing you to toggle back and forth between topographies and selected sensors.<br>




<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
=================================================================<br>
cfg_freq.method = 'wavelet';<br>
cfg_freq.output = 'fourier'<div><br>
cfg_freq.channelcmb = {'E3','E60';'E3','E62';'E11','E60';'E11','E62'};<br></div>
cfg_freq.channel = unique(cfg_freq.channelcmb);<br>
<br>
have to set keeptapers to 'no' even though (as far as I know) there are no tapers used in wavelets (see ft_freqanalysis line 313)<div><br>
cfg_freq.keeptrials = 'no';<br>
cfg_freq.keeptapers = 'no';<br>
<br></div>
--------------------------------------<br>
ft_freqanalysis<br>
data_freq =<br>
            label: {4x1 cell}<br>
           dimord: 'chan_freq_time'<br>
             freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
             time: [1x33 double]<br>
    fourierspctrm: [4x9x33 double]<br>
              cfg: [1x1 struct]<br>
<br>
--------------------------------------<br>
FAILURE: can't run ft_connectivityanalysis on data_freq because there is no cumtapcnt field<br>
<br>
??? Reference to non-existent field 'cumtapcnt'.<br>
<br>
Error in ==> ft_checkdata>fixcsd at 844<br>
  sumtapcnt = [0;cumsum(data.cumtapcnt(:))];<br>
<br>
Error in ==> ft_checkdata at 594<br>
    data = fixcsd(data, cmbrepresentation, channelcmb);<br>
<br>
Error in ==> univariate2bivariate at 29<br>
        data    = ft_checkdata(data, 'cmbrepresentation', 'full');<br>
<br>
Error in ==> ft_connectivityanalysis at 234<br>
          [data, powindx, hasrpt] = univariate2bivariate(data, 'fourierspctrm', 'crsspctrm', dtype, 'cmb', cfg.channelcmb);<br>
=================================================================<br>
=================================================================<br>
</blockquote>
<br>
Thanks for noticing this. I never considered anybody to use the wavelet method before calling ft_connectivityanalysis. Why would you want to use it in the first place if there's mtmconvol ;o) ?<br>
<br>
SOLUTION: Don't use wavelet (and post a bug on bugzilla stating this specific problem: output to waveletanalysis cannot be processed by ft_connectivityanalysis).<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
=================================================================<div><br>
cfg_freq.method = 'mtmconvol';<br>
cfg_freq.output = 'powandcsd';<br></div><div>
cfg_freq.channelcmb = {'E3','E60';'E3','E62';'E11','E60';'E11','E62'};<br></div>
cfg_freq.channel = unique(cfg_freq.channelcmb);<div><br>
<br>
cfg_freq.keeptrials = 'no';<br>
cfg_freq.keeptapers = 'no';<br></div>
cfg_freq.taper = 'hanning';<br>
<br>
--------------------------------------<br>
ft_freqanalysis<br>
data_freq =<br>
        label: {4x1 cell}<br>
       dimord: 'chan_freq_time'<br>
         freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
         time: [1x33 double]<br>
    powspctrm: [4x9x33 double]<br>
     labelcmb: {4x2 cell}<br>
    crsspctrm: [4x9x33 double]<br>
    cumtapcnt: [173x9 double]<br>
          cfg: [1x1 struct]<br>
<br>
ft_connectivityanalysis with 'plv'<br>
data_conn =<br>
     labelcmb: {4x2 cell}<br>
       dimord: 'chan_freq_time'<br>
    plvspctrm: [4x9x33 double]<br>
         freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
         time: [1x33 double]<br>
          cfg: [1x1 struct]<br>
--------------------------------------<br>
FAILURE: can't run ft_freqgrandaverage on data_conn because there is no label field<br>
<br>
</blockquote>
<br>
See above.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
--------------------------------------<br>
SUCCESS: ft_singleplotTFR successfully makes a plot<br>
<br>
</blockquote>
<br>
Hurrah<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
--------------------------------------<br>
FAILURE: can't run ft_freqstatistics on data_conn because there's no label field<br>
<br>
??? Reference to non-existent field 'label'.<br>
<br>
Error in ==> prepare_timefreq_data>forcedimord at 509<br>
  output.label  = input.label;<br>
<br>
Error in ==> prepare_timefreq_data at 87<br>
  [remember{c}, hascrsspctrm] = forcedimord(varargin{c});<br>
<br>
Error in ==> statistics_wrapper at 217<br>
  [cfg, data] = prepare_timefreq_data(cfg, varargin{:});<br>
<br>
Error in ==> ft_freqstatistics at 127<br>
[stat, cfg] = statistics_wrapper(cfg, varargin{:});<br>
=================================================================<br>
=================================================================<br>
</blockquote>
<br>
<br>
See above<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
=================================================================<div><br>
cfg_freq.method = 'mtmconvol';<br>
cfg_freq.output = 'fourier';<br></div><div>
cfg_freq.channelcmb = {'E3','E60';'E3','E62';'E11','E60';'E11','E62'};<br></div>
cfg_freq.channel = unique(cfg_freq.channelcmb);<div><br>
<br>
cfg_freq.keeptrials = 'no';<br>
cfg_freq.keeptapers = 'no';<br></div>
cfg_freq.taper = 'hanning';<br>
<br>
--------------------------------------<br>
ft_freqanalysis<br>
data_freq =<br>
            label: {4x1 cell}<br>
           dimord: 'chan_freq_time'<br>
             freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
             time: [1x33 double]<br>
    fourierspctrm: [4x9x33 double]<br>
        cumtapcnt: [173x9 double]<br>
              cfg: [1x1 struct]<br>
<br>
--------------------------------------<br>
FAILURE: can't run ft_connectivityanalysis on data_freq<br>
<br>
??? Subscripted assignment dimension mismatch.<br>
<br>
Error in ==> ft_checkdata>fixcsd at 851<br>
        crsspctrm(p,:,:,m,k) = (tmpdat*tmpdat')./data.cumtapcnt(p);<br>
<br>
Error in ==> ft_checkdata at 594<br>
    data = fixcsd(data, cmbrepresentation, channelcmb);<br>
<br>
Error in ==> univariate2bivariate at 29<br>
        data    = ft_checkdata(data, 'cmbrepresentation', 'full');<br>
<br>
Error in ==> ft_connectivityanalysis at 234<br>
          [data, powindx, hasrpt] = univariate2bivariate(data, 'fourierspctrm', 'crsspctrm', dtype, 'cmb', cfg.channelcmb);<br>
=================================================================<br>
</blockquote>
<br>
This seems to be a bug in ft_freqanalysis. It should be very forbidden to run ft_freqanalysis with cfg.keeptrials = 'no' and cfg.output = 'fourier'. Just doesn't make sense. Could  you file this as a bug please?<br>




<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
=================================================================<br>
=================================================================<div><br>
cfg_freq.method = 'mtmconvol';<br>
cfg_freq.output = 'fourier';<br></div><div>
cfg_freq.channelcmb = {'E3','E60';'E3','E62';'E11','E60';'E11','E62'};<br></div>
cfg_freq.channel = unique(cfg_freq.channelcmb);<div><br>
<br>
cfg_freq.keeptrials = 'yes';<br>
cfg_freq.keeptapers = 'yes';<br></div>
cfg_freq.taper = 'hanning';<br>
<br>
--------------------------------------<br>
ft_freqanalysis<br>
data_freq =<br>
            label: {4x1 cell}<br>
           dimord: 'rpttap_chan_freq_time'<br>
             freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
             time: [1x33 double]<br>
    fourierspctrm: [4-D double]<br>
        cumtapcnt: [173x9 double]<br>
              cfg: [1x1 struct]<br>
<br>
ft_connectivityanalysis with 'plv'<br>
data_conn =<br>
        label: {4x1 cell}<br>
       dimord: 'chan_chan_freq_time'<br>
    plvspctrm: [4-D double]<br>
         freq: [2.9630 3.7037 4.4444 5.1852 5.9259 6.6667 7.4074 8.1481 8.8889]<br>
         time: [1x33 double]<br>
          dof: [173 173 173 173 173 173 173 173 173]<br>
          cfg: [1x1 struct]<br>
<br>
--------------------------------------<br>
FAILURE: can't run ft_freqgrandaverage on data_conn<br>
<br>
??? Error using ==> ft_freqgrandaverage at 170<br>
unsupported dimord<br>
<br>
--------------------------------------<br>
SUCCESS: ft_singleplotTFR makes a plot<br>
<br>
--------------------------------------<br>
FAILURE: can't do ft_freqstatistics on data_conn because of chan_chan in dimord<br>
<br>
??? Error using ==> size<br>
Dimension argument must be a positive integer scalar within indexing range.<br>
<br>
Error in ==> prepare_timefreq_data>forcedimord at 540<br>
    Nchan = size(output.dat, chandim);<br>
<br>
Error in ==> prepare_timefreq_data at 87<br>
  [remember{c}, hascrsspctrm] = forcedimord(varargin{c});<br>
<br>
Error in ==> statistics_wrapper at 217<br>
  [cfg, data] = prepare_timefreq_data(cfg, varargin{:});<br>
<br>
Error in ==> ft_freqstatistics at 127<br>
[stat, cfg] = statistics_wrapper(cfg, varargin{:});<br>
<br>
Error in ==> mm_ft_ttestTFR at 228<br>
  cfg_ana.(vs_str) = eval(sprintf('ft_freqstatistics(cfg_ft,%s);',subj_str));<br>
=================================================================<br>
</blockquote>
<br>
Let's keep this one for the next time...<br>
<br>
Best,<br>
<br>
Jan-Mathijs<br>
_______________________________________________<br>
fieldtrip mailing list<br>
<a href="mailto:fieldtrip@donders.ru.nl" target="_blank">fieldtrip@donders.ru.nl</a><br>
<a href="http://mailman.science.ru.nl/mailman/listinfo/fieldtrip" target="_blank">http://mailman.science.ru.nl/mailman/listinfo/fieldtrip</a><br>
</blockquote></div><br>