<div dir="ltr"><div><div>This is immensely helpful, thank you. I was very confused about why some versions of the pipeline I saw were using group calculate and others were using interaction delay reconstruction and what that meant, and I think I have a more clear idea of what the different steps of the pipeline are doing. There are still a few things I'm a bit confused about though in terms of the pipeline. For instance, whether or not I need to do TEprepare before group prepare, and if I need to do graph analysis (which I'm not sure I fully understand but also haven't looked deeply into) before group stats. <br><br></div>If you don't mind me taking you up on your offer, I think seeing your example script might help clarify some of these issues.<br><br></div>Thank you!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 9, 2014 at 8:16 AM, Patricia Wollstadt <span dir="ltr"><<a href="mailto:Patricia.Wollstadt@gmx.de" target="_blank">Patricia.Wollstadt@gmx.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Hello Max,<br>
    <br>
    I added a few comments to the questions regarding individual
    parameters below. To address the general problem of TRENTOOL telling
    you, that there are not enough sample points in your data: From what
    I can see in your script, you probably don't have enough data points
    in each time series to robustly estimate TE. You analyze 800 ms of
    data sampled at 300 Hz, which gives you 240 samples per time series.
    Can you maybe avoid downsampling to 300 Hz and downsample to 600 Hz
    instead? Or could you analyze a longer time window of interest?<br>
    Note that you also 'lose' data to embedding and the interaction
    delay: The first point that can be used for TE estimation is at max.
    embedding length + max. interaction delay in samples. For example:
    max. embedding length = dim * tau_factor * ACT = 10 * 0.4 * 5 = 20
    samples plus the max interaction delay of 30 ms = 9 samples. In this
    example, you would be left with 240 - 29 samples for TE estimation
    per trial. There is also the possibility to estimate time resolved
    TE/TE for shorter time windows of interest (see section 4.4 in the
    manual); however, this method requires the use of a GPU for TE
    estimation.<br>
    <br>
    I would further recommend to use the new pipeline for group
    statistics described in the manual in section 4.5 (the function
    'TEgroup_calculate' is deprecated). The new pipeline allows you to
    reconstruct the interaction delay and uses the following functions
    (see also comments in the script):<br>
    <br>
    TEgroup_prepare    -> prepares all data sets (all subjects/all
    conditions) for group analysis (this means finding common embedding
    parameters such that estimates are not biased between groups)<br>
    InteractionDelayReconstruction_calculate     -> estimates TE for
    individual data sets and all assumed interaction delays u<br>
    InteractionDelayReconstruction_analyze       -> reconstructs the
    interaction delay by selecting the u that maximizes TE for each
    channel<br>
    TEgroup_stats        -> calculate group statistics using a
    permutation test<br>
    <br>
    I can send you an example script for group TE analysis using this
    pipeline to get you started. I hope this helps you to get the group
    analysis running. Just write again if you're having trouble setting
    up the pipeline or something is not clear about the parameters/my
    comments.<br>
    <br>
    Best,<br>
    Patricia<span class=""><br>
    <br>
    <br>
    <br>
    <br>
    On 09/04/2014 08:30 PM, Max Cantor wrote:<br>
    <blockquote type="cite">
      <div dir="ltr">
        <div>
          <div>
            <div>Hi fieldtrippers,<br>
              <br>
            </div>
            I know trentool is not produced by the Donders Institute, so
            I'm not 100% sure if it is appropriate to ask questions
            about it here, but to the best of my knowledge they do not
            have a mailing list and I saw a few trentool questions in
            the archives, so I'm going to assume it's ok...<br>
            <br>
          </div>
          In any case, below is my current pipeline (slightly modified
          for comprehensibility):<br>
          <br>
        </div>
        (notes in bold are comments/questions made in this email, not
        present in the pipeline. Sorry in advance for the long post! Any
        help would be greatly appreciated as I'm a bit over my head on
        this but I think I'm close!)<br>
        <div><br>
          *****<br>
          <br>
          % Prepare group TE data<br>
          <br>
          cfgP                        = [];<br>
          cfgP.Path2TSTOOL  = <b>TSTOOLPATH</b> <br>
          cfgP.TEcalctype       = 'VW_ds';<br>
          cfgP.channel            = {'ctfdip_LAC'  'ctfdip_RAC'}; <br>
          <br>
          <b>I'm trying to find the transfer entropy between the left
            and right auditory cortices in my experiment. The input is
            virtual sensor data that was produced using SAM in fieldtrip
            on real MEG data. </b><br>
                  <br>
          % specify u to be scanned <br>
          <br>
          cfgP.predicttime_u    = 30; <br>
          cfgP.toi                    = [-0.4 0.4]; <br>
          <br>
        </div>
      </div>
    </blockquote>
    </span><blockquote type="cite">
      <div dir="ltr">
        <div><b>For clarification, the predicttime_u is in seconds but
            the toi is in milliseconds. If I understand correctly, the
            predicttime_u must fit within the toi, but beyond that are
            there any benefits to it being earlier or later?</b> PW: The
          predictiontime_u is in milliseconds and the toi is in seconds.
          The prediction time is the assumed interaction delay between
          your two sources and should fit within your toi. In general it
          is preferable to use the method for interaction delay
          reconstruction for TE estimation, because it allows you to
          reconstruct the actual delay between your source and target
          times series. A non-optimal u/interaction delay may cause an
          underestimation of TE, so it is recommended to use the
          pipeline for interaction delay reconstruction whenever
          estimating TE for unknown delays. <br>
          If you use the methods for interaction delay reconstruction
          'predicttime_u' is replaced by<br>
          cfgTEP.predicttimemin_u % minimum u to be scanned<br>
          cfgTEP.predicttimemax_u % maximum u to be scanned<br>
          cfgTEP.predicttimestepsize % time steps between u to be
          scanned   <br>
          A large range for u values to be scanned increases computing
          time a lot, so it is best to limit the u range to values that
          are physiologically plausible. <br>
              <br>
        </div>
      </div>
    </blockquote>
    <blockquote type="cite">
      <div dir="ltr"><span class="">
        <div>% ACT (Autocorrelation Time) estimation and constraints<br>
          <br>
          cfgP.maxlag              = 150; <br>
          cfgP.actthrvalue         = 7.5; <br>
          cfgP.minnrtrials          = 5; <br>
          <br>
        </div>
        </span><div><b>My understanding is maxlag should be 1/2 the sampling
            rate, so since the data are downsampled to 300hz, it should
            be 150. I know that the sample rate and filters are used to
            determine the actthrvalue, but I don't actually know the
            calculation. 7.5 was a rough guess just to test the
            pipeline. I'm also uncertain of what minnrtrials should be.</b>
          PW: You can set the actthrvalue based on the filtering you did
          prior to TE analysis. If you for example highpass filtered at
          10 Hz, you shouldn't find an ACT higher than 30 samples,
          because you filtered out any components of the signal slower
          than 10 Hz/30 samples (given your sampling frequency of 300
          Hz). So in this scenario the actthrvalue would be 30.<br>
          A good value for cfgP.minnrtrials is 12 (a minimum number of
          trials is needed to realize the  permutation test for
          estimated TE values). </div>
      </div>
    </blockquote>
    <blockquote type="cite">
      <div dir="ltr"><span class="">
        <div> </div>
        <div>        <br>
          % Optimization<br>
          <br>
          cfgP.optimizemethod   = 'ragwitz';<br>
          cfgP.ragdim                 = 4:8;<br>
          cfgP.ragtaurange          = [0.2 0.4];<br>
          cfgP.ragtausteps          = 15;<br>
          cfgP.repPred                = 100;<br>
          <b><br>
          </b></div>
        </span><div><b>I am completely at a loss for this. I've done some
            reading into transfer entropy, mutual information, etc.,
            cited in trentool, but I'm yet to understand how exactly
            this optimization works and what the configuration should
            be, given my data and experimental intentions.</b> PW: The
          Ragwitz criterion tries to find optimal embedding parameters
          dim and tau for the data. To do that, the method iteratively
          takes all possible combinations of dim and tau values that are
          provided in cfgP.ragdim and cfgP.ragtaurange/.ragtausteps and
          tests how well these combinations embed the data. To test an
          embedding, the method builds the embedding vectors from the
          data; it then tests for each point how well the next point in
          time can be predicted from the reference point's nearest
          neighbours. So for each embedded point, the method searches
          for the nearest neighbours and calculates the average of those
          nearest neighbours. The difference between the
          averaged/predicted point and the actual next point is the
          error of the local predictor. The Ragwitz criterion will then
          return the parameter combination for which this error over all
          points is minimal. <br>
          The parameters set the following: 'ragdim' are dimensions to
          be tested by the method (I would reccomend to start with
          2:10), 'ragtaurange' together with 'ragtausteps' specifies the
          tau values to be tested (TRENTOOL will build a vector from 0.2
          to 0.4 in 15 steps). Note, that the values here are factors
          that are later multiplied with the ACT to obtain the actual
          tau. 'repPred' is the number of points that will be used for
          the local prediction, i.e. the Ragwitz criterion will test the
          local prediction and calculate the error for the first 100
          points in your time series. The two parameters 'flagNei' ans
          'sizeNei' below specify the type of neighbour search conducted
          by the Ragwitz criterion: 'flagNei' tells the method to either
          conduct a kNN or range search; 'sizeNei' specifies the number
          of neighbours or the radius to be searched by a range search.<br>
          <br>
        </div>
      </div>
    </blockquote>
    <blockquote type="cite"><div><div class="h5">
      <div dir="ltr">
        <div>        <br>
          % Kernel-based TE estimation<br>
          <br>
          cfgP.flagNei                  = 'Mass';<br>
          cfgP.sizeNei                  = 4; % Default<br>
                  <br>
          cfgP.ensemblemethod    = 'no';<br>
          cfgP.outputpath              = <b>OUTPUT PATH</b>; <br>
          <br>
          if ~exist(<b>Path for TEprepare data object</b>)<br>
              load VSdat;<br>
              TE_Wrd                     = {};    <br>
              for i                           = 1:nConds<br>
                  for j                       = 1:Nsub<br>
                      TE_Wrd{i}{j}        = TEprepare(cfgP,
          VSdat{i}{j});<br>
                  end<br>
              end<br>
              clear VSdat;<br>
              save('TE_Wrd', 'TE_Wrd');<br>
          end<br>
          <b><br>
          </b></div>
        <div><b>The configuration and virtual sensor data, organized in
            a 3 x 15 cell of structures (condition by subject) are the
            input. The TEprepare substructure is added to each
            individual condition x subject .mat files' data structure
            which are stored on disk independently.</b> <br>
        </div>
        <div><br>
          % Use object_to_mat_conversion.m to replace individual
          condition x subject virtual sensor data<br>
          % .mat files with their TE_Wrd equivalent<br>
          <b><br>
          </b></div>
        <div><b>I'm using a separate script to make some manipulations
            to the objects from disk; this will all eventually be
            integrated into the main pipeline</b>.<b> TRENTOOL seems to
            handle data output very differently from fieldtrip and I've
            had trouble thinking through the most logical way to handle
            the data so it's a bit haphazard right now.</b><br>
        </div>
        <div><br>
          load cond080sub01.mat<br>
          <br>
          cfgG                               = [];<br>
          cfgG.dim                         =
          cond080sub01.TEprepare.optdim;<br>
          cfgG.tau                          =
          cond080sub01.TEprepare.opttau;<br>
          <br>
          if isfield(cond080sub01, 'TEprepare')<br>
                                        TEgroup_prepare(cfgG, fileCell);<br>
          else<br>
              error('Need to run TEprepare before TEgroup_prepare');<br>
          end<br>
          <b><br>
          </b></div>
        <div><b>For clarification, fileCell is a cell with the name of
            each condition x subject .mat file, which as I said before
            is collectively the same as the 3 x 15 VSdat structure
            (condition x subject).</b><br>
        </div>
        <div><br>
          % Replace .mat files with '_for_TEgroup_calculate' version in<br>
          % object_to_mat_conversion.m<br>
          <br>
          % TE Group Calculate<br>
          <br>
          load cond080sub01.mat<br>
          if isfield(cond080sub01, 'TEgroupprepare')<br>
              for i                   = 1:length(fileCell)<br>
                                        TEgroup_calculate(fileCell{i});<br>
              end<br>
          else<br>
              error('Need to run TEgroup_prepare before
          TEgroup_calculate');<br>
          end<br>
          <b><br>
          </b></div>
        <div><b>At this step I get the following error:<br>
            <br>
            Error using transferentropy (line 337)<br>
            \nTRENTOOL ERROR: not enough data points left after
            embedding<br>
            <br>
            Error in TEgroup_calculate (line 133)<br>
            [TEresult] = transferentropy(cfg,data);</b><br>
        </div>
        <div><br>
          % TE Group Stats<br>
          <br>
          cfgGSTAT                              = [];<br>
          cfgGSTAT.design(1,1:2*Nsub) = [ones(1,Nsub) 2*ones(1,Nsub)];<br>
          cfgGSTAT.design(2,1:2*Nsub) = [1:Nsub 1:Nsub];<br>
          <br>
          cfgGSTAT.uvar                       = 1;<br>
          cfgGSTAT.ivar                        = 2;<br>
          cfgGSTAT.fileidout                  = 'test_groupstats';<br>
          <br>
                                        TEgroup_stats(cfgGSTAT,
          fileCell);<br>
          <br>
        </div>
        <div><b>Given the error above, I am yet to get to this step, but
            it does not seem fundamentally different from normal
            fieldtrip stats.</b><br clear="all">
        </div>
        <div>
          <div>
            <div>
              <div><br>
                *****<br>
                <br>
              </div>
              <div>In case my notes were not clear or you skipped to the
                bottom, <b>my primary concern is whether the error I'm
                  getting in TEgroup_calculate is a pipeline issue</b>
                (I noticed the example pipeline in trentool, the manual,
                and published methods articles all seem to have slightly
                or significantly different pipeline compositions), <b>or

                  if the error is</b> due to ACT, ragwitz optimization,
                or some other faulty parameterization <b>on my part due
                  to a lack of understanding of how transfer entropy
                  works on a more theoretical/mathematical level</b>. If
                the latter is the case, is there any relatively
                straightforward way to conceptualize this, or is this
                something where I'm just going to have to keep reading
                and rereading until it eventually makes sense? I've
                already done quite a bit of that and it hasn't pierced
                my thick skull yet but I'm sure it will eventually!<br>
                <br>
              </div>
              <div>Thank you so much,<br>
                <br>
              </div>
              <div>Max Cantor<br>
              </div>
              <div><br>
                <br>
                -- <br>
                <div dir="ltr">Max Cantor
                  <div>Lab Manager</div>
                  <div>Computational Neurolinguistics Lab</div>
                  <div>University of Michigan</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      </div></div><pre>_______________________________________________
fieldtrip mailing list
<a href="mailto:fieldtrip@donders.ru.nl" target="_blank">fieldtrip@donders.ru.nl</a>
<a href="http://mailman.science.ru.nl/mailman/listinfo/fieldtrip" target="_blank">http://mailman.science.ru.nl/mailman/listinfo/fieldtrip</a></pre><span class="HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="HOEnZb"><font color="#888888">
    <br>
    <div>-- <br>
      
      
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif">------------------------------------------------------------<br>
              <br>
            </font></small></font></address>
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif">Patricia Wollstadt, PhD Student<br>
              <br>
            </font></small></font></address>
      <address><font color="#666666"><small> </small></font></address>
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif"> MEG Unit, Brain Imaging Center</font></small></font></address>
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif"> Goethe University, Frankfurt, Germany<br>
              <br>
            </font></small></font></address>
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif">Heinrich Hoffmann Strasse 10, Haus 93 B</font></small></font></address>
      <address><font color="#666666"><small><font face="Helvetica,
              Arial, sans-serif">D - 60528 Frankfurt am Main</font></small></font></address>
    </div>
  </font></span></div>

<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></blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr">Max Cantor<div>Lab Manager</div><div>Computational Neurolinguistics Lab</div><div>University of Michigan</div></div>
</div>