# fit_ANCHOR_ARL2_part2.m

Continued from fit_ANCHOR_ARL2_part1.m

Fit the ANCHOR2 model to the group ARL2 profiles of the Fdbk1 Experiment.

The main tool is .../work/models/anchor/fit_SSE/anchor_ARL2.m

    File: work/CMUExper/fdbk1/data/fit_ANCHOR_ARL2_part2.m
    Date: 2007-08-20
    Alexander Petrov, http://alexpetrov.com

## Contents

- Load the data
- Collapse across groups
- Fit INST on the same stimulus sequences, 11 per group
- Search parameters
- "Chance event" sets
- Cutoff parameter grid
- Main work
- Plot the SSE
- Plot the memory noise parameter
- Plot the temperature parameter
- Conclusion
- Clean up

## Load the data

Start from scratch, generate new chev's, etc. The only thing used from fit_ANCHOR_ARL2_part1.m are the new c_ratio=.75 parameter setting and the new starting point for the searches.

    clear all
    cd(fullfile(work_pathstr,'CMUExper','fdbk1','data')) ;
    load('S2.mat') ;
    ARL2 = [S2(:).ARL2] ;    % 9x55
    gr=[S2(:).group]' ;
    ugr = unique(gr) ;
    N_groups = length(ugr) ;
    ugr_descr = {'U1' 'L1' 'H1', 'L2' 'H2' } ;   % [1 2 3, 5 6]

## Collapse across groups

    grARL2 = zeros(size(ARL2,1),N_groups) ;   % 9x5
    gr_idx = cell(1,N_groups) ;
    for k = 1:N_groups
        gr_idx{k} = find(gr==ugr(k))' ;
        grARL2(:,k) = mean(ARL2(:,gr_idx{k}),2) ;
    end

## Fit INST on the same stimulus sequences, 11 per group

    stim = [S2(:).dist] ;   % 476x55
    fdbk = [S2(:).fdbk] ;

## Search parameters

Same search settings as in fit_ANCHOR_ARL2_part1.m Search strategy: 1. Fix c_ratio = .75 once and for all 1. Explore cutoff on a grid 2. Explore history on a grid 3. Search for mem_k and temper using FMINCON as before but start from mem_k = .085, temper = .030 % perc_k = .040 as always

    fminconp = 1 ;
    flags = [0 1 1 0 0 0 0 0] ;   % [perc_k mem_k temper hist cutoff xx xx c_ratio]
    Sparams = anchor_search_params2(flags,fminconp) ;
    optns = optimset(Sparams.optns,'TolX',1e-2,'Display','off') ;
    Sparams.optns = optns ;
    Sparams.target_vals = grARL2
    c_ratio = .75 ;
    Sparams.params.cutoffs = .65 .* [-3 -1 c_ratio 3*c_ratio] ;
    Sparams.params.mem_k = .085 ;
    Sparams.params.temper = .030 ;
    Sparams.params.history = .040 ;
    Sparams.params

    Sparams =
         model_name: 'anchor_ARL2'
             params: [1x1 struct]
          p2v_templ: {'VAL = PARAMS.mem_k * 10 ;'  'VAL = PARAMS.temper * 10 ;'}
          v2p_templ: {'PARAMS.mem_k = VAL / 10 ;'  'PARAMS.temper = VAL / 10 ;'}
             bounds: [2x2 double]
         ARL_params: [1x1 struct]
        funfun_name: 'fmincon'
              optns: [1x1 struct]
         lsfun_name: 'sumsqerr'
        target_vals: [9x5 double]
    ans =
           scale: 'LINEAR'
           N_cat: 7
         SM_conv: 1.0000e-03
          cat_sz: 0.0500
          perc_k: 0.0400
           mem_k: 0.0850
           avail: [7x1 double]
         anchors: [7x6 double]
         cutoffs: [-1.9500 -0.6500 0.4875 1.4625]
          temper: 0.0300
         history: 0.0400
           alpha: 0.3000
           decay: 0.5000
             ITI: 4
        M_raster: 7
        A_raster: [5 5 3 3]
        mnfieldp: 1

## "Chance event" sets

    N_chevs = 2 ;

    % Pack into "model data" structures suitable for passing as arguments.
    wfname = 'work_ANCHOR.mat' ;
    if (file_exists(wfname))
        load(fname) ;
    else
      Mdata = cell(1,N_chevs) ;
      for k = 1:N_chevs
          Mdata{k}.stim = stim ;
          Mdata{k}.fdbk = fdbk ;
          Mdata{k}.group_idx = gr_idx ;
          %Mdata{k}.params = Sparams.params ;    % will be set by SUMSQERR
          Mdata{k}.chev = make_anchor_chev(size(stim,1),size(stim,2),7) ;
          Mdata{k}.ARL_params = Sparams.ARL_params ;
      end
    end

## Cutoff parameter grid

    cutoff_levels = [.55 .60 .65 .70]' ;        % c- in categ_sz units
    N_cutoff_levels = length(cutoff_levels) ;
    history_levels = [.020 .030 .040 .050 .060] ;
    N_history_levels = length(history_levels) ;

## Main work

    fname = 'grid_search_ANCHOR_ARL2_part2.mat' ;
    if (file_exists(fname))
        load(fname) ;
    else
      grid_SSE = zeros([N_cutoff_levels,N_history_levels,N_chevs]) ;
      grid_optX = cell([N_cutoff_levels,N_history_levels,N_chevs]) ;
      grid_det = cell([N_cutoff_levels,N_history_levels,N_chevs]) ;
      tic
      for k1 = 1:N_cutoff_levels
          c = cutoff_levels(k1) ;
          cutoffs = c .* [-3 -1 c_ratio 3*c_ratio] ;
          Sparams.params.cutoffs = cutoffs ;
          fprintf('\n cutoff %4.2f: ',c) ;
          for k2 = 1:N_history_levels
              H = history_levels(k2) ;
              Sparams.params.history = H ;
              for k = 1:N_chevs
                  [par,SSE,optX,det] = paramsearch(Mdata{k},Sparams) ;  % <-- Sic!
                  grid_SSE(k1,k2,k) = SSE ;
                  grid_optX{k1,k2,k} = optX ;
                  grid_det{k1,k2,k} = det ;
                  fprintf('%5.3f ',SSE) ;
                  save(fname,'grid_SSE','grid_optX','grid_det','Sparams',...
                       'cutoff_levels','history_levels') ;
              end
              fprintf(', ') ;
          end
      end
      fprintf('\n') ;
      toc
    end % if file_exists ...

## Plot the SSE

    SSE = mean(grid_SSE,3)   % average across the chev's
    [X,Y] = meshgrid(history_levels,cutoff_levels) ;
    contourf(X,Y,SSE) ; colorbar ; title('SSE') ;
    xlabel('History weight H') ; ylabel('c- cutoff') ;

    SSE =
        1.8085    1.0660    0.9972    1.0284    0.9776
        1.6768    1.0070    1.0666    1.0177    1.0052
        1.6504    1.0508    1.0680    1.0876    1.0769
        1.5760    1.0721    1.0415    1.0580    1.0693

## Plot the memory noise parameter

    mem_k = zeros(size(grid_optX)) ;
    temper = zeros(size(grid_optX)) ;
    for k1 = 1:N_cutoff_levels
        for k2 = 1:N_history_levels
            for k = 1:N_chevs
                mem_k(k1,k2,k) = grid_optX{k1,k2,k}(1) / 10 ;
                temper(k1,k2,k) = grid_optX{k1,k2,k}(2) / 10 ;
            end
        end
    end

    mem_k = mean(mem_k,3)
    contourf(X,Y,mem_k) ; colorbar ; title('Memory noise') ;
    xlabel('History weight H') ; ylabel('c- cutoff') ;

    mem_k =
        0.1000    0.0984    0.0839    0.0932    0.0718
        0.1000    0.0991    0.0827    0.0797    0.0646
        0.1000    0.0997    0.0853    0.0738    0.0413
        0.1000    0.0881    0.0717    0.0658    0.0390

## Plot the temperature parameter

    temper = mean(temper,3)
    contourf(X,Y,temper) ; colorbar ; title('Softmax temperature') ;
    xlabel('History weight H') ; ylabel('c- cutoff') ;

    temper =
        0.0200    0.0219    0.0297    0.0428    0.0517
        0.0200    0.0217    0.0320    0.0461    0.0505
        0.0200    0.0260    0.0347    0.0435    0.0687
        0.0200    0.0234    0.0310    0.0421    0.0689

## Conclusion

The SSE surface is quite flat in this region of the parameter space. The only region that is ruled out definitively is that for H<=.020. We are free to choose any history weight in the range .030-.060. This will be done to optimize (informally) the fit to the Assim profiles. We are also free to choose any cutoff in the range .55-.65. For roundness and specificity, let it be cutoff = .60. The other two parameters vary systematically as a function of H:

    history:  .030   .040   .050   .060
    mem_k:    .099   .083   .080   .065
    temper:   .022   .032   .046   .050

The fitting effort continues in ./final_ARL2_fits.m

## Clean up

    clear k k1 k2 X Y ;