


spatial_nearest_neighbors() - Given a set of electrode coordinates, this
function returns a binary 2D matrix that indicates
which electrodes are close enough to be considered
neighbors. Specifically, the k nearest electrodes
to each electrode are defined as neighbors. For use
with cluster-based permutation tests. This method
was suggested by Manish Saggar is useful when your
electrode coordinates are different for each
subject or if you want to have relatively equal
statistical power across all electrodes. Defining
spatial neighbors by a simple distance threshold
(using spatial_neighbors.m) means that electrodes
on the edge of the montage will have fewer
neighbors than others and will thus have less
opportunities to join clusters.
Usage:
>>chan_hood=spatial_nearest_neighbors(chanlocs,k);
Required Inputs:
chanlocs - An EEGLAB chanlocs structure (e.g., EEG.chanlocs from an EEG
variable)
k - The number of electrodes that will be defined as a neighbor
of each electrode. The nearest k electrodes are chosen as
neighbors. In case of ties, the lowest indexed channels are
chosen over higher indexed channels. If this happens, you
should probably use a different value of k or manually
adjust chan_hood to avoid the issue.
Outputs:
chan_hood - A symmetric binary matrix indicating which channels are
neighbors. If chan_hood(a,b)=1, then Channel A and Channel
B are nieghbors.
Notes:
-See also the function spatial_neighbors.m
-This function won't work if it produces an asymmetric neighborhood
index, which appears to be hard to avoid.
Authors:
Idea from Manish Saggar
Written by David Groppe
Feinstein Institute for Medical Research, 3/2013

0001 % spatial_nearest_neighbors() - Given a set of electrode coordinates, this 0002 % function returns a binary 2D matrix that indicates 0003 % which electrodes are close enough to be considered 0004 % neighbors. Specifically, the k nearest electrodes 0005 % to each electrode are defined as neighbors. For use 0006 % with cluster-based permutation tests. This method 0007 % was suggested by Manish Saggar is useful when your 0008 % electrode coordinates are different for each 0009 % subject or if you want to have relatively equal 0010 % statistical power across all electrodes. Defining 0011 % spatial neighbors by a simple distance threshold 0012 % (using spatial_neighbors.m) means that electrodes 0013 % on the edge of the montage will have fewer 0014 % neighbors than others and will thus have less 0015 % opportunities to join clusters. 0016 % 0017 % Usage: 0018 % >>chan_hood=spatial_nearest_neighbors(chanlocs,k); 0019 % 0020 % Required Inputs: 0021 % chanlocs - An EEGLAB chanlocs structure (e.g., EEG.chanlocs from an EEG 0022 % variable) 0023 % k - The number of electrodes that will be defined as a neighbor 0024 % of each electrode. The nearest k electrodes are chosen as 0025 % neighbors. In case of ties, the lowest indexed channels are 0026 % chosen over higher indexed channels. If this happens, you 0027 % should probably use a different value of k or manually 0028 % adjust chan_hood to avoid the issue. 0029 % 0030 % Outputs: 0031 % chan_hood - A symmetric binary matrix indicating which channels are 0032 % neighbors. If chan_hood(a,b)=1, then Channel A and Channel 0033 % B are nieghbors. 0034 % 0035 % Notes: 0036 % -See also the function spatial_neighbors.m 0037 % -This function won't work if it produces an asymmetric neighborhood 0038 % index, which appears to be hard to avoid. 0039 % 0040 % Authors: 0041 % Idea from Manish Saggar 0042 % Written by David Groppe 0043 % Feinstein Institute for Medical Research, 3/2013 0044 0045 %%%%% Future Work %%%%%% 0046 % figure out how to deal with asymmetric 0047 0048 function chan_hood=spatial_nearest_neighbors(chanlocs,k) 0049 0050 n_chan=length(chanlocs); 0051 0052 chan_hood=zeros(n_chan,n_chan); 0053 n_neighbors=zeros(1,n_chan); 0054 chan_dist=zeros(1,n_chan*(n_chan-1)/2); 0055 ct=0; 0056 for c=1:n_chan, 0057 coordA=[chanlocs(c).X chanlocs(c).Y chanlocs(c).Z]; 0058 dists=zeros(1,n_chan); 0059 for d=1:n_chan, 0060 coordB=[chanlocs(d).X chanlocs(d).Y chanlocs(d).Z]; 0061 dists(d)=sum((coordA-coordB).^2); % Ok to keep distance in units squared 0062 end 0063 [vals ids]=sort(dists); 0064 chan_hood(c,ids(1:k+1))=1; %k+1 is used because each channel should be a neighbor with itself 0065 end 0066 0067 % Check for symmetry 0068 is_sym=1; 0069 for a=1:n_chan, 0070 for b=a+1:n_chan, 0071 if chan_hood(a,b)~=chan_hood(b,a) 0072 is_sym=0; 0073 break; 0074 end 0075 end 0076 end 0077 0078 if ~is_sym, 0079 error('Spatial neighborhood matrix is not symmetric. You need to change the value of k, define chan_hood manually, or use spatial_neighbors.m'); 0080 end