-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcluster_iESsites.m
183 lines (142 loc) · 6.28 KB
/
cluster_iESsites.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
% cluster-permutaion TMS L-DLPFC vs R-Parietal
clear all;
ies_DLPFC = readtable('/Users/xianqliu/Library/CloudStorage/OneDrive-UniversityofIowa/1_TMS_iEEG/3_ProcessedData_Backup/site_specificity_amy/TEP/archived/TEP_amy_ies_LDLPFC.csv');
ies_Parietal = readtable('/Users/xianqliu/Library/CloudStorage/OneDrive-UniversityofIowa/1_TMS_iEEG/3_ProcessedData_Backup/site_specificity_amy/TEP/archived/TEP_amy_ies_RParietal.csv');
condition = ies_DLPFC.Time > 25;
ies_DLPFC = ies_DLPFC(condition, :);
condition = ies_Parietal.Time > 25;
ies_Parietal = ies_Parietal(condition, :);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
laterality = 'R'; % B, L, R;
subdivision = 1; % 2(whole), 0(medial), 1(lateral)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if laterality == 'L'
condition = ismember(ies_DLPFC.DKT, ['Left-Amygdala']);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.DKT, ['Left-Amygdala']);
ies_Parietal = ies_Parietal(condition, :);
if subdivision == 0 % medial
condition = ismember(ies_DLPFC.is_lateral, [0]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [0]);
ies_Parietal = ies_Parietal(condition, :);
elseif subdivision == 1 % lateral
condition = ismember(ies_DLPFC.is_lateral, [1]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [1]);
ies_Parietal = ies_Parietal(condition, :);
end
elseif laterality == 'R'
condition = ismember(ies_DLPFC.DKT, ['Right-Amygdala']);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.DKT, ['Right-Amygdala']);
ies_Parietal = ies_Parietal(condition, :);
if subdivision == 0 % medial
condition = ismember(ies_DLPFC.is_lateral, [0]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [0]);
ies_Parietal = ies_Parietal(condition, :);
elseif subdivision == 1 % lateral
condition = ismember(ies_DLPFC.is_lateral, [1]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [1]);
ies_Parietal = ies_Parietal(condition, :);
end
else
if subdivision == 0 % medial
condition = ismember(ies_DLPFC.is_lateral, [0]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [0]);
ies_Parietal = ies_Parietal(condition, :);
elseif subdivision == 1 % lateral
condition = ismember(ies_DLPFC.is_lateral, [1]);
ies_DLPFC = ies_DLPFC(condition, :);
condition = ismember(ies_Parietal.is_lateral, [1]);
ies_Parietal = ies_Parietal(condition, :);
end
end
channel_DLPFC = unique(ies_DLPFC.Channel);
channel_Parietal = unique(ies_Parietal.Channel);
target_data = zeros(height(channel_DLPFC), 475);
for subject = 1:height(channel_DLPFC)
condition = ismember(ies_DLPFC.Channel, channel_DLPFC(subject));
data_temp = ies_DLPFC(condition, :);
target_data(subject,:) = data_temp.iTEP_norm;
end
control_data = zeros(height(channel_Parietal), 475);
for subject = 1:height(channel_Parietal)
condition = ismember(ies_Parietal.Channel, channel_Parietal(subject));
data_temp = ies_Parietal(condition, :);
control_data(subject,:) = data_temp.iTEP_norm;
end
%% cluster-based statistics
target_data; % subject/electrodes * frequency/time
control_data;
time_num = size(target_data,2);
ttest_result = zeros(time_num,3);
for time_i = 1:time_num
[h,p,ci,stats] = ttest2(target_data(:,time_i),control_data(:,time_i));
ttest_result(time_i,1) = h;
ttest_result(time_i,2) = p;
ttest_result(time_i,3) = stats.tstat;
end
output_clusters = U_clusters_lzr(ttest_result(:,3),ttest_result(:,2),0.05); % input: all statistics, p, threshold for cluster
cluster_real_raw = output_clusters;
temp_data = zeros(size(output_clusters,2),3);
for temp_i = 1:size(output_clusters,2)
temp_data(temp_i,1) = sum(output_clusters{1,temp_i}.zs); % cluster feature1: sum of statistics, most common
temp_data(temp_i,2) = max(output_clusters{1,temp_i}.zs); % cluster feature2: max of statistics
temp_data(temp_i,3) = mean(output_clusters{1,temp_i}.zs); % cluster feature3: mean of statistics
end
cluster_real = temp_data;
%%
perm_num = 1000; % >= 1000
tic
cluster_perm = zeros(perm_num,3);
for perm_i = 1:perm_num
% shuffling method 1: channel level, shuffling the group labels among all sub/ch
target_num = size(target_data,1);
control_num = size(control_data,1);
raw_data = [target_data; control_data];
rand_info = randperm(target_num+control_num);
temp_data1 = raw_data(find(rand_info<=target_num),:);
temp_data2 = raw_data(find(rand_info>target_num),:);
% or!!!!!
% shuffling method 2: trial level, shuffling the trial labels for each sub/ch
% for example: tms vs. sham
ttest_result = zeros(time_num,3);
for time_i = 1:time_num
[h,p,ci,stats] = ttest2(temp_data1(:,time_i),temp_data2(:,time_i));
ttest_result(time_i,1) = h;
ttest_result(time_i,2) = p;
ttest_result(time_i,3) = stats.tstat;
end
output_clusters = U_clusters_lzr(ttest_result(:,3),ttest_result(:,2),0.05);
if ~isempty(output_clusters)
temp_data = zeros(size(output_clusters,2),3);
for temp_i = 1:size(output_clusters,2)
temp_data(temp_i,1) = sum(output_clusters{1,temp_i}.zs);
temp_data(temp_i,2) = max(output_clusters{1,temp_i}.zs);
temp_data(temp_i,3) = mean(output_clusters{1,temp_i}.zs);
end
if size(output_clusters,2) > 1
cluster_perm(perm_i,:) = max(temp_data); % only save the maximum of cluster features
else
cluster_perm(perm_i,:) = temp_data;
end
end
end
toc
%%
for i = 1:height(cluster_real)
% Sort the distribution data
sortedData = sort(cluster_perm(:,1));
% Find the position of the cluster_real(i,1) in sorted data
position = find(sortedData >= cluster_real(i,1), 1);
% Calculate the percentile rank
if isempty(position)
percentile(i,1) = 100; % If the value is greater than all elements
else
percentile(i,1) = (position / length(sortedData)) * 100;
end
end