Lab archive

Research resources

Distinct symptom-specific targets for circuit-based neuromodulation (Am J Psychiatry, 2020)

Research resource recovered from the previous lab website. Original descriptions, figures, and resource links are preserved below. Source capture · 2025-05-16 ↗

Dysphoric-anxiosomatic targeting atlas is available here:
https://neurovault.org/images/787858/

Archived research figure

Symptom-specific targeting atlas

Below is the MATLAB code for symptom clustering:

MATLAB · archived sourceDownload code (.txt) ↓

Original code as archived. Formatting and dependencies have not been revalidated.

function [itemcorr ClusterMaps item_vs_voxel dCluster ClusterRatio SxClusterAssignment] = SymptomClusters(dItems,maps,mask,covariate)
%Written by Shan Siddiqi, results published in Siddiqi et al., AJP 2020.

%INPUTS:
%"dItems" is an M x N matrix where M rows represent individual patients, and
%each row contains N columns representing the scores for each individual
%symptom (or change in symptom) for that patient.

%"maps" is an N x M matrix where M columns represent individual patients, and
%each column contains N rows which represent a 1-dimensional column vector
%containing all of the voxels in each patient's seed map generated based on
%the connectivity of their TMS site (or other ROI of your choice).

%"mask" is a brain mask.

%"covariate" is a covariate to control for in the symptom maps.


%OUTPUTS:
% Figure references below refer to the 2020 AJP paper.
%itemcorr = cross-correlation matrix by symptom (see Fig. S2, left panels)
%item_vs_voxel = symptom-specific maps (see Fig. S1)
%dCluster = clinical symptom improvement by cluster
%ClusterRatio = ratio between rank-transformed symptom severity by cluster
%SxClusterAssignment = which symptoms belong to which cluster (see table S3)


gmmask = mask;
gmmask(gmmask~=0)=1;
dTotal = sum(dItems,2);
item_vs_voxel = corr(dItems,maps','rows','complete')';
if nargin>3
    item_vs_voxel = partialcorr(dItems,maps',covariate,'rows','complete')';
end
item_vs_voxel(gmmask==0,:)=0;
item_vs_voxel_masked = item_vs_voxel(gmmask==1,:);
item_vs_voxel = atanh(item_vs_voxel);
total_vs_voxel = corr(dTotal,maps','rows','complete');
total_vs_voxel(gmmask==0)=0;
%total_vs_voxel(find(isnan(total_vs_voxel)))=0;
total_vs_voxel = atanh(total_vs_voxel)';
itemcorr = corr(item_vs_voxel_masked,'rows','complete');

itemcorr(itemcorr<.25)=0;
%itemcorr = atanh(itemcorr);
%itemcorr_adj = matrix_thresholder(itemcorr,0.8,'kden');

%[SxClusterAssignment c sumd] = kmeans(itemcorr,2);
%item_vs_voxel_masked(find(isnan(item_vs_voxel_masked)))=0;
SxClusterAssignment = clusterdata(itemcorr,'distance','correlation','maxclust',2,'linkage','ward');
tmp = mean(abs(itemcorr));
mean_itemcorr = mean(tmp);

Cluster1 = dItems(:,SxClusterAssignment==1);
Cluster2 = dItems(:,SxClusterAssignment==2);
Cluster1 = sum(Cluster1,2);
Cluster2 = sum(Cluster2,2);
dCluster = [Cluster1 Cluster2];

%ClusterMaps = atanh(corr(dCluster,maps','rows','complete'))';
ClusterMaps(:,1) = mean(item_vs_voxel(:,SxClusterAssignment==1),2);
ClusterMaps(:,2) = mean(item_vs_voxel(:,SxClusterAssignment==2),2);
%tmp1 = corr(ClusterMaps(:,1),RefMap,'rows','complete');
%tmp2 = corr(ClusterMaps(:,2),RefMap,'rows','complete');
tmp1 = size(SxClusterAssignment(SxClusterAssignment==1),1);
tmp2 = size(SxClusterAssignment(SxClusterAssignment==2),1);
if tmp2<tmp1
    dCluster = [Cluster2 Cluster1];
    ClusterMaps = ClusterMaps(:,[2 1]);
end
TotalMap = total_vs_voxel;
ClusterRatio = tiedrank(Cluster2)./tiedrank(Cluster1);
ClusterRatioMap = corr(ClusterRatio,maps','rows','complete','type','Spearman');
ClusterMaps(find(isnan(ClusterMaps)))=0;

See the published paper

Click here