Eelke,<div><br></div><div>I haven't used  cfg.output = 'fourier'; but if it returns complex numbers, your lines of code below won't give phase information. Matlab's real( ) function gives the real part of the complex pair --I believe it would be the signal filtered by the wavelet transform ( the a part of a + b<i>i ). </i>The angle( ) function will give phase angles. Maybe someone who thinks in polar coordinates (not my specialty) can comment? </div>
<div><br></div><div>Once you get phase angles, you'll need a circular-linear correlation (phase is circular; amplitude is linear). Check out the CircStat toolbox for Matlab. <i> </i></div><div><br></div><div>% extract freqs X samples matrices to compute correlations on<br>
>    phSig = real(squeeze(tfrPh.fourierspctrm(1,match_str(tfrPh.label,<br>> chansPh(k)), :, :)));</div><div><br></div><div>-karl doron</div><div><br></div><div><br><div class="gmail_quote">On Fri, Mar 18, 2011 at 5:25 AM, Eelke Spaak <span dir="ltr"><<a href="mailto:eelke.spaak@donders.ru.nl">eelke.spaak@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;">Hmm, actually my own suggestion of switching around the time and trial<br>
dimensions seems to be very promising (and makes intuitive sense I<br>
guess, having thought about it some more).<br>
<br>
Best,<br>
Eelke<br>
<br>
2011/3/18 Eelke Spaak <<a href="mailto:eelke.spaak@donders.ru.nl">eelke.spaak@donders.ru.nl</a>>:<br>
<div><div></div><div class="h5">> Dear FieldTrip community,<br>
><br>
> At the moment, I am analysing some data to see whether a correlation<br>
> exists between phase and amplitude over different frequencies, and in<br>
> different channels. Computing the signals of interest (i.e., the phase<br>
> and amplitude time series) works fine, and computing the correlation<br>
> is also easily done with Matlab's corrcoef function. Now comes the<br>
> tricky part. I would like to use the FT statistics framework to assess<br>
> the significance of the found correlation, and use clustering in<br>
> frequency-frequency space to correct for multiple comparisons. I<br>
> understand that this requires a statfun_correlationPearson (or<br>
> something like it), and I do not think I'll encounter any problems<br>
> implementing this. Before I start doing so, however, I am not sure how<br>
> to pass the design and the data to the higher-level statistics<br>
> functions, such as ft_freqstatistics.<br>
><br>
> My data structure is custom-imported, and contains a single 100s-long<br>
> trial, on which the phase/amplitude analysis should be conducted:<br>
><br>
> data =<br>
>        hdr: [1x1 struct]<br>
>    fsample: 1000<br>
>      trial: {[24x100000 double]}<br>
>       time: {[1x100000 double]}<br>
>      label: {24x1 cell}<br>
>        cfg: [1x1 struct]<br>
><br>
> The phase and amplitude time series are generated by convolution with<br>
> Morlet wavelets using ft_freqanalysis:<br>
><br>
>    % perform wavelet convolution for amplitude data<br>
>    cfg = [];<br>
>    cfg.channel = chansAmpl;<br>
>    cfg.method = 'wavelet';<br>
>    cfg.output = 'fourier';<br>
>    cfg.keeptrials = 'yes';<br>
>    cfg.width = 7;<br>
>    cfg.gwidth = 4;<br>
>    cfg.foi = freqAmpl;<br>
>    cfg.toi = data.time{1}; % compute estimate for each sample<br>
>    tfr = ft_freqanalysis(cfg, data);<br>
><br>
>    % perform wavelet convolution for phase data<br>
>    cfg.channel = chansPh;<br>
>    cfg.foi = freqPh;<br>
>    tfrPh = ft_freqanalysis(cfg, data);<br>
><br>
> where chansAmpl = {'CH10'}, chansPh = {'CH17'}, freqAmpl = 3:5:98,<br>
> freqPh = 2:2:30. Simply computing the correlation of interest is done<br>
> in the following manner:<br>
><br>
>    % extract freqs X samples matrices to compute correlations on<br>
>    phSig = real(squeeze(tfrPh.fourierspctrm(1,match_str(tfrPh.label,<br>
> chansPh(k)), :, :)));<br>
>    amplSig = abs(squeeze(tfr.fourierspctrm(1,match_str(tfr.label,<br>
> chansAmpl(l)), :, :)));<br>
><br>
>    % compute correlations<br>
>    r = corr(phSig', amplSig', 'rows', 'pairwise'); % use only non-NaN rows<br>
><br>
> The correlation matrix r I get out of this nicely corresponds to the<br>
> results I found by using algorithms implemented elsewhere: so far so<br>
> good. My (unsuccessful) attempts to use the statistics framework have<br>
> been variations on the following:<br>
><br>
>    % add amplitude spectrum to the TFR (which now only has fourierspctrm)<br>
>    tfr.amplspctrm = abs(tfr.fourierspctrm);<br>
><br>
>    cfg = [];<br>
>    cfg.method = 'montecarlo';<br>
>    cfg.statistic = 'corr'; % I have made a (now empty) statfun_corr<br>
>    cfg.parameter = 'amplspctrm';<br>
>    cfg.numrandomization = 100;<br>
>    cfg.design = real(tfrPh.fourierspctrm);<br>
>    stat = ft_freqstatistics(cfg, tfr);<br>
><br>
> For your information, the tfr and cfg fields look like this before the<br>
> call to ft_freqstatistics:<br>
><br>
> cfg =<br>
>              method: 'montecarlo'<br>
>           statistic: 'corr'<br>
>           parameter: 'amplspctrm'<br>
>    numrandomization: 100<br>
>              design: [4-D double]<br>
><br>
> tfr =<br>
>            label: {'CH10'}<br>
>           dimord: 'rpttap_chan_freq_time'<br>
>             freq: [3 8 13 18 23 28 33 38 43 48 53 58 63 68 73 78 83 88 93 98]<br>
>             time: [1x100000 double]<br>
>    fourierspctrm: [4-D double]<br>
>        cumtapcnt: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]<br>
>              cfg: [1x1 struct]<br>
>       amplspctrm: [4-D double]<br>
><br>
> The statfun_corr gets a dat variable, that appears to be a column<br>
> vector constructed by concatenating all the samples in the amplitude<br>
> spectrum. How should my function treat this? I am aware that<br>
> specifying a 4D design matrix is a bit odd, but it does contain my 15<br>
> regressors X 100000 samples (X 2 singleton dimensions that correspond<br>
> to the 1 trial and 1 channel that I analysed). If I squeeze() the<br>
> matrix before calling ft_freqstatistics, I get an error 'the size of<br>
> the design matrix does not match the number of observations in the<br>
> data'.<br>
><br>
> I realize my question is a bit vague, but I am somewhat lost as to how<br>
> to proceed. In short, what I want is this: (1) compute a correlation<br>
> (across samples) for each phase time series with each amplitude time<br>
> series (each time series corresponds to a single frequency); (2)<br>
> shuffle the phase time series around, computing correlations on the<br>
> shuffled data to assess significance of the observed correlation; (3)<br>
> prune away correlations that are isolated in frequency-frequency<br>
> space, retain only large clusters of correlations.<br>
><br>
> All the documentation about the cluster-based statistics is focused on<br>
> comparing variables that differ across trials and/or subjects, and my<br>
> 'problem' might be that I only have a single trial. Chopping up the<br>
> data into 100000 trials, each 1 sample long, is maybe a possibility?<br>
> But it seems a bit artificial.<br>
><br>
> (It would actually probably not be very difficult to implement my<br>
> desired functionality 'by hand', but I guess it should be possble<br>
> within FT's statistics framework. That would have quite some<br>
> advantages.)<br>
><br>
> Many thanks in advance for any input you can offer.<br>
><br>
> Best,<br>
><br>
> Eelke<br>
><br>
<br>
_______________________________________________<br>
fieldtrip mailing list<br>
<a href="mailto:fieldtrip@donders.ru.nl">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>
</div></div></blockquote></div><br></div>