OSCR

Enhancing depression diagnosis with augmented brain signal driven decorrelated graph neural networks.

Code ↔ Paper

4 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 4 matches
  1. [1] § Graph representation learning ↔ BrainADNet.ipynb, lines 78–142 · score 0.64 · adjacency matrix, KNN graph, correlation matrix, sparse, Fisher, transform
  2. [2] § BrainADNet framework › Skip-GCN ↔ BrainADNet.ipynb, lines 229–300 · score 0.62 · ChebConv, skip connections, ReLU, dropout, batch, layers
  3. [3] § BrainADNet framework ↔ BrainADNet.ipynb, lines 144–196 · score 0.52 · sliding window, KNN graph, Fisher, transformation, demographic, correlation
  4. [4] § BrainADNet framework › Skip-GCN ↔ BrainADNet.ipynb, lines 229–300 · score 0.52 · Skip connections, Cheb, softmax, linear, classes, global

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Jupyter notebook · 509 lines · 16 KB · no license · 4 matches

  1. # %%
  2. import os
  3. import scipy.io
  4. import numpy as np
  5. import random
  6. import pandas as pd
  7. import torch
  8. from sklearn.model_selection import train_test_split
  9. from torch_geometric.data import InMemoryDataset, Data
  10. from torch_geometric.utils import dense_to_sparse
  11. import torch.nn.functional as func
  12. import torch.optim as optim
  13. from torch_geometric.loader import DataLoader
  14. from torch_geometric.nn import GCNConv, global_mean_pool
  15. from torch_geometric.nn import GATConv, ChebConv
  16. import torch.nn as nn
  17. from collections import Counter
  18. import os.path as osp
  19. import csv
  20. from sklearn.metrics import roc_auc_score
  21. from sklearn.metrics import accuracy_score, f1_score, recall_score, confusion_matrix
  22. from sklearn.model_selection import StratifiedKFold, StratifiedShuffleSplit
  23. # %%
  24. seed=89
  25. atlas_name= "AAL"
  26. dataset_name = "MDDvHC"
  27. if atlas_name == "AAL":
  28. start = 0
  29. end = 116
  30. elif atlas_name == "Craddock":
  31. start = 228
  32. end = 428
  33. elif atlas_name == "Dosenbach":
  34. start = 1408
  35. end = 1568
  36. else:
  37. exit()
  38. # %%
  39. # Function to set seed
  40. def set_seed(seed):
  41. random.seed(seed)
  42. np.random.seed(seed)
  43. torch.manual_seed(seed)
  44. if torch.cuda.is_available():
  45. torch.cuda.manual_seed(seed)
  46. torch.cuda.manual_seed_all(seed)
  47. torch.backends.cudnn.deterministic = True
  48. torch.backends.cudnn.benchmark = False
  49. torch.use_deterministic_algorithms(True)
  50. # Environment variables for reproducibility
  51. os.environ['PYTHONHASHSEED'] = str(seed)
  52. os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
  53. os.environ['CUDA_LAUNCH_BLOCKING'] = '1'
  54. set_seed(seed)
  55. def seed_worker(worker_id):
  56. worker_seed = torch.initial_seed() % 2**32
  57. numpy.random.seed(worker_seed)
  58. random.seed(worker_seed)
  59. g = torch.Generator()
  60. g.manual_seed(0)
  61. # %%
  62. from sklearn.preprocessing import StandardScaler
  63. def normalize(matrix):
  64. scaler = StandardScaler()
  65. normalized_matrix = scaler.fit_transform(matrix)
  66. return normalized_matrix
  67. # %%
  68. import numpy as np
  69. from scipy.sparse import coo_matrix
  70. import torch
  71. from torch_geometric.utils import dense_to_sparse
  72. from torch_geometric.data import InMemoryDataset, Data
  73. def fisher_z_transform(correlation_matrix, epsilon=1e-5):
  74. return 0.5 * np.log((1 + correlation_matrix) / (1 - correlation_matrix + epsilon))
  75. def to_tensor(X_featgraph, X_adjgraph, Y):
  76. datalist = []
  77. for i in range(len(Y)):
  78. ty = Y[i]
  79. y = torch.tensor([ty]).long()
  80. adjacency = X_adjgraph[i]
  81. feature = X_featgraph[i]
  82. x = torch.from_numpy(feature).float()
  83. adj= adjacency
  84. adj = torch.from_numpy(adj).float()
  85. edge_index, edge_attr = dense_to_sparse(adj)
  86. datalist.append(Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y))
  87. return datalist
  88. def compute_KNN_graph(matrix, k_degree=10):
  89. """ Calculate the adjacency matrix from the connectivity matrix."""
  90. matrix = np.abs(matrix)
  91. idx = np.argsort(-matrix)[:, 0:k_degree]
  92. matrix.sort()
  93. matrix = matrix[:, ::-1]
  94. matrix = matrix[:, 0:k_degree]
  95. A = adjacency(matrix, idx).astype(np.float32)
  96. return A
  97. def adjacency(dist, idx):
  98. m, k = dist.shape
  99. assert m, k == idx.shape
  100. assert dist.min() >= 0
  101. # Weight matrix.
  102. I = np.arange(0, m).repeat(k)
  103. J = idx.reshape(m * k)
  104. V = dist.reshape(m * k)
  105. W = coo_matrix((V, (I, J)), shape=(m, m))
  106. # No self-connections.
  107. W.setdiag(0)
  108. # Non-directed graph.
  109. bigger = W.T > W
  110. W = W - W.multiply(bigger) + W.T.multiply(bigger)
  111. return W.todense()
  112. # %%
  113. def create_graph_sliding_window_demographics(X, D, Y, start, end, region=True):
  114. S = 30 # Sliding Step
  115. T = 60 # Window Size
  116. X_adjgraph=[]
  117. X_featgraph = []
  118. Y_list = []
  119. num_samples_per_subject = []
  120. for i in range(len(Y)):
  121. #select rows according to atlas
  122. bold_matrix = X[i]
  123. n = bold_matrix.shape[0]
  124. demog = D[i]
  125. demog_expanded = np.expand_dims(demog, axis=0)
  126. demog_expanded = np.repeat(demog_expanded, n, axis=0)
  127. temp_y = Y[i]
  128. num_rows, num_cols = bold_matrix.shape
  129. num_samples = 0
  130. for start_idx in range(0, num_cols - T + 1, S):
  131. end_idx = start_idx + T
  132. if end_idx <= num_cols:
  133. if region == True:
  134. window_data = bold_matrix[:, start_idx:end_idx] #RxR
  135. else:
  136. window_data = np.transpose(bold_matrix[:, start_idx:end_idx]) #TxT
  137. window_data1 = np.corrcoef(window_data)
  138. correlation_matrix_fisher = fisher_z_transform(window_data1)
  139. correlation_matrix_fisher = np.around(correlation_matrix_fisher, 8)
  140. result_matrix = np.concatenate((correlation_matrix_fisher, demog_expanded), axis=1)
  141. knn_graph = compute_KNN_graph(correlation_matrix_fisher)
  142. if region == True:
  143. X_featgraph.append(result_matrix)
  144. else:
  145. X_featgraph.append(window_data)
  146. X_adjgraph.append(knn_graph)
  147. Y_list.append(temp_y)
  148. num_samples = num_samples+1
  149. num_samples_per_subject.append(num_samples)
  150. return X_featgraph, X_adjgraph, Y_list, num_samples_per_subject
  151. # %%
  152. def create_graph_demographics(X, D, Y, start, end, region=True):
  153. X_adjgraph=[]
  154. X_featgraph = []
  155. for i in range(len(Y)):
  156. if region == True:
  157. bold_matrix = X[i] #RxR
  158. else:
  159. bold_matrix = np.transpose(X[i]) #TxT
  160. n= bold_matrix.shape[0]
  161. demog_expanded = np.expand_dims(D[i], axis=0)
  162. demog_expanded = np.repeat(demog_expanded, n, axis=0)
  163. window_data1 = np.corrcoef(bold_matrix)
  164. correlation_matrix_fisher = fisher_z_transform(window_data1)
  165. correlation_matrix_fisher = np.around(correlation_matrix_fisher, 8)
  166. knn_graph = compute_KNN_graph(correlation_matrix_fisher)
  167. result_matrix = np.concatenate((correlation_matrix_fisher, demog_expanded), axis=1)
  168. if region == True:
  169. X_featgraph.append(result_matrix)
  170. else:
  171. X_featgraph.append(bold_matrix)
  172. X_adjgraph.append(knn_graph)
  173. return X_featgraph, X_adjgraph, Y
  174. # %%
  175. import torch
  176. import torch.nn as nn
  177. import torch.nn.functional as F
  178. from torch_geometric.nn import ChebConv, global_mean_pool,GATConv
  179. class SkipConnModel(nn.Module):
  180. def __init__(self, num_features_R, num_classes, k_order, dropout_prob=0.5):
  181. super(SkipConnModel, self).__init__()
  182. self.dropout_prob = dropout_prob
  183. self.num_layers = 6
  184. self.convs = nn.ModuleList()
  185. self.bns = nn.ModuleList()
  186. self.convs.append(ChebConv(num_features_R, 128, K=3, normalization='sym'))
  187. self.bns.append(nn.BatchNorm1d(128))
  188. self.convs.append(ChebConv(128, 128, K=3, normalization='sym'))
  189. self.bns.append(nn.BatchNorm1d(128))
  190. self.convs.append(ChebConv(128, 128, K=3, normalization='sym'))
  191. self.bns.append(nn.BatchNorm1d(128))
  192. self.out_fc = nn.Linear(128, num_classes)
  193. self.weights = torch.nn.Parameter(torch.randn(len(self.convs)))
  194. def reset_parameters(self):
  195. for conv in self.convs:
  196. conv.reset_parameters()
  197. for bn in self.bns:
  198. bn.reset_parameters()
  199. self.out_fc.reset_parameters()
  200. torch.nn.init.normal_(self.weights)
  201. def forward(self, data_R):
  202. x1, edge_index1, edge_attr1 = data_R.x, data_R.edge_index, data_R.edge_attr
  203. batch1 = data_R.batch
  204. layer_out1 = []
  205. x1 = self.convs[0](x1, edge_index1, edge_attr1)
  206. x1 = self.bns[0](x1)
  207. x1 = F.relu(x1, inplace=True)
  208. layer_out1.append(x1)
  209. x1 = F.dropout(x1, p=self.dropout_prob, training=self.training)
  210. x1 = self.convs[1](x1, edge_index1, edge_attr1)
  211. x1 = self.bns[1](x1)
  212. x1 = F.relu(x1, inplace=True)
  213. x1 = x1 + 0.8 * layer_out1[0]
  214. layer_out1.append(x1)
  215. x1 = F.dropout(x1, p=self.dropout_prob, training=self.training)
  216. x1 = self.convs[2](x1, edge_index1, edge_attr1)
  217. x1 = self.bns[2](x1)
  218. x1 = F.relu(x1, inplace=True)
  219. x1 = x1 + 0.8 * layer_out1[1]
  220. layer_out1.append(x1)
  221. weight = F.softmax(self.weights, dim=0)
  222. weighted_outs = [layer_out1[i] * weight[i] for i in range(len(layer_out1))]
  223. emb = sum(weighted_outs)
  224. pooled_emb = global_mean_pool(emb, batch1)
  225. x = self.out_fc(pooled_emb)
  226. return x, pooled_emb
  227. # %%
  228. def DECOV(embeddings):
  229. embeddings_t = embeddings.T
  230. C = torch.cov(embeddings_t)
  231. C_fro_norm = torch.norm(C, p='fro')
  232. diag_elements = torch.diag(C,0)
  233. C2_l2norm_diag = torch.norm(diag_elements)
  234. L_DECOV = (C_fro_norm ** 2) - (C2_l2norm_diag ** 2)
  235. return L_DECOV
  236. # %%
  237. def GCN_train(loader):
  238. model.train()
  239. pred = []
  240. label = []
  241. loss_all = 0
  242. alpha= 1
  243. beta = 1e-8
  244. for data in loader:
  245. data = data.to(device)
  246. optimizer.zero_grad()
  247. output, pooled = model(data)
  248. pooled = pooled.to('cpu')
  249. loss_decov = DECOV(pooled)
  250. loss_decov = loss_decov.to(device)
  251. pooled = pooled.to(device)
  252. loss_ce = func.cross_entropy(output, data.y)
  253. loss = alpha * loss_ce + beta *loss_decov
  254. loss.backward()
  255. loss_all += data.num_graphs * loss.item()
  256. optimizer.step()
  257. pred.append(func.softmax(output, dim=1).max(dim=1)[1])
  258. label.append(data.y)
  259. y_pred = torch.cat(pred, dim=0).cpu().detach().numpy()
  260. y_true = torch.cat(label, dim=0).cpu().detach().numpy()
  261. tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
  262. epoch_sen = tp / (tp + fn)
  263. epoch_spe = tn / (tn + fp)
  264. epoch_acc = (tn + tp) / (tn + tp + fn + fp)
  265. f1 = f1_score(y_true, y_pred)
  266. return epoch_sen, epoch_spe, epoch_acc, f1, loss_all/len(loader)
  267. def GCN_test(loader):
  268. model.eval()
  269. pred = []
  270. scores = []
  271. label = []
  272. loss_all = 0
  273. for data in loader:
  274. data = data.to(device)
  275. output , pooled= model(data)
  276. loss_ce = func.cross_entropy(output, data.y)
  277. loss = loss_ce
  278. loss_all += data.num_graphs * loss.item()
  279. softmax_output = func.softmax(output, dim=1)
  280. scores.append(softmax_output[:, 1])
  281. pred.append(softmax_output.max(dim=1)[1])
  282. label.append(data.y)
  283. y_pred = torch.cat(pred, dim=0).cpu().detach().numpy()
  284. y_scores = torch.cat(scores, dim=0).cpu().detach().numpy()
  285. y_true = torch.cat(label, dim=0).cpu().detach().numpy()
  286. tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
  287. epoch_sen = tp / (tp + fn)
  288. epoch_spe = tn / (tn + fp)
  289. epoch_acc = (tn + tp) / (tn + tp + fn + fp)
  290. epoch_f1 = f1_score(y_true, y_pred)
  291. epoch_auc = roc_auc_score(y_true, y_scores)
  292. return epoch_sen, epoch_spe, epoch_acc, epoch_f1, epoch_auc,loss_all / len(loader)
  293. # %%
  294. X_new = np.load(f'./{dataset_name}/{atlas_name}/X.npz')
  295. X_loaded = [X_new[key] for key in X_new.files]
  296. X_loaded = [normalize(matrix) for matrix in X_loaded]
  297. print(X_loaded[0].shape)
  298. Y_loaded = np.load(f'./{dataset_name}/{atlas_name}/Y.npy')
  299. print(Y_loaded)
  300. demographic_data = pd.read_csv(f'./{dataset_name}/{atlas_name}/demographics_data.csv')
  301. demographics = demographic_data[['Age', 'Edu', 'Sex']].values
  302. # %%
  303. skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
  304. device = torch.device('cpu')
  305. eval_metrics2 = np.zeros((skf.n_splits, 5))
  306. eval_metrics3 = np.zeros((skf.n_splits, 5))
  307. dataset = X_loaded
  308. labels = Y_loaded
  309. # %%
  310. for n_fold, (train_val, test) in enumerate(skf.split(dataset, labels)):
  311. model = SkipConnModel((end - start + 3), 2,3).to(device)
  312. optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=5e-4)
  313. train_val_dataset = [dataset[i] for i in train_val]
  314. test_dataset = [dataset[i] for i in test]
  315. train_val_labels = labels[train_val]
  316. test_labels = labels[test]
  317. train_val_demographics = demographics[train_val]
  318. test_demographics = demographics[test]
  319. train_val_index = np.arange(len(train_val_dataset))
  320. train_idx, val_idx, _, _ = train_test_split(
  321. train_val_index,
  322. train_val_labels,
  323. test_size=0.1,
  324. shuffle=True,
  325. stratify=train_val_labels,
  326. random_state=seed
  327. )
  328. train_dataset = [train_val_dataset[i] for i in train_idx]
  329. val_dataset = [train_val_dataset[i] for i in val_idx]
  330. train_labels = [train_val_labels[i] for i in train_idx]
  331. val_labels = [train_val_labels[i] for i in val_idx]
  332. train_demographics = [train_val_demographics[i] for i in train_idx]
  333. val_demographics = [train_val_demographics[i] for i in val_idx]
  334. X_train_featgraph, X_train_adjgraph, Y_train, _ = create_graph_sliding_window_demographics(train_dataset, train_demographics, train_labels, start, end, region=True)
  335. X_val_featgraph, X_val_adjgraph, Y_val = create_graph_demographics(val_dataset, val_demographics, val_labels, start, end, region=True)
  336. X_test_featgraph, X_test_adjgraph, Y_test = create_graph_demographics(test_dataset, test_demographics, test_labels, start, end, region=True)
  337. X_train_datalist = to_tensor(X_train_featgraph, X_train_adjgraph, Y_train)
  338. X_val_datalist = to_tensor(X_val_featgraph, X_val_adjgraph, Y_val)
  339. X_test_datalist = to_tensor(X_test_featgraph, X_test_adjgraph, Y_test)
  340. train_loader = DataLoader(X_train_datalist, batch_size=32, shuffle=True, num_workers=0, worker_init_fn=seed_worker, generator=g)
  341. val_loader = DataLoader(X_val_datalist, batch_size=32, shuffle=True, num_workers=0, worker_init_fn=seed_worker, generator=g)
  342. test_loader = DataLoader(X_test_datalist, batch_size=32, shuffle=True, num_workers=0, worker_init_fn=seed_worker, generator=g)
  343. best_test_acc2 = 0
  344. best_test_f12 = 0
  345. best_test_sen2 = 0
  346. best_test_spe2 = 0
  347. best_test_auc2 = 0
  348. best_val_acc3 = 0
  349. best_test_acc3 = 0
  350. best_test_f13 = 0
  351. best_test_sen3 = 0
  352. best_test_spe3 = 0
  353. best_test_auc3 = 0
  354. for epoch in range(50):
  355. _, _, _, _, t_loss = GCN_train(train_loader)
  356. val_sen, val_spe, val_acc,val_f1, val_auc, v_loss = GCN_test(val_loader)
  357. test_sen, test_spe, test_acc,test_f1, test_auc, _ = GCN_test(test_loader)
  358. if test_acc > best_test_acc2:
  359. best_test_acc2 = test_acc
  360. best_test_f12 = test_f1
  361. best_test_sen2, best_test_spe2,best_test_auc2 = test_sen, test_spe, test_auc
  362. if val_acc > best_val_acc3:
  363. best_val_acc3 = val_acc
  364. best_test_f13 = test_f1
  365. best_test_sen3, best_test_spe3, best_test_acc3, best_test_auc3 = test_sen, test_spe, test_acc, test_auc
  366. print('CV: {:03d}, Epoch: {:03d}, Val Loss: {:.5f}, Val ACC: {:.5f},Val AUC: {:.5f}, Test ACC: {:.5f}, Test F1: {:.5f}, TEST SPE: {:.5f}, '
  367. 'TEST SEN: {:.5f}, TEST AUC: {:.5f}'.format(n_fold +1, epoch + 1, v_loss, val_acc, val_auc, test_acc,test_f1,
  368. test_spe,test_sen, test_auc))
  369. eval_metrics2[n_fold, 0] = best_test_sen2
  370. eval_metrics2[n_fold, 1] = best_test_spe2
  371. eval_metrics2[n_fold, 2] = best_test_acc2
  372. eval_metrics2[n_fold, 3] = best_test_f12
  373. eval_metrics2[n_fold, 4] = best_test_auc2
  374. eval_metrics3[n_fold, 0] = best_test_sen3
  375. eval_metrics3[n_fold, 1] = best_test_spe3
  376. eval_metrics3[n_fold, 2] = best_test_acc3
  377. eval_metrics3[n_fold, 3] = best_test_f13
  378. eval_metrics3[n_fold, 4] = best_test_auc3
  379. # %%
  380. print("\nResults Corresponding to Maximum val_acc")
  381. eval_df3 = pd.DataFrame(eval_metrics3)
  382. eval_df3.columns = ['SEN', 'SPE', 'ACC','F1', 'AUC-ROC']
  383. eval_df3.index = ['Fold_%02i' % (i + 1) for i in range(skf.n_splits)]
  384. print(eval_df3)
  385. print('Average Sensitivity: %.4f±%.4f' % (eval_metrics3[:, 0].mean(), eval_metrics3[:, 0].std()))
  386. print('Average Specificity: %.4f±%.4f' % (eval_metrics3[:, 1].mean(), eval_metrics3[:, 1].std()))
  387. print('Average Accuracy: %.4f±%.4f' % (eval_metrics3[:, 2].mean(), eval_metrics3[:, 2].std()))
  388. print('Average F1: %.4f±%.4f' % (eval_metrics3[:, 3].mean(), eval_metrics3[:, 3].std()))
  389. print('Average AUC-ROC: %.4f±%.4f' % (eval_metrics3[:, 4].mean(), eval_metrics3[:, 4].std()))

BrainADNet.ipynb at commit 3d99691, no license · at the source

Overview

Authors: Jyotismita Barman1, Mohammad Yusuf1, Sandeep Kumar1,2,3, Tapan Kumar Gandhi1,2,3,4
  1. Department of Electrical Engineering, Indian Institute of Technology,Delhi, New Delhi India
  2. Yardi School of Artificial Intelligence, Indian Institute of Technology,Delhi, New Delhi, India India
  3. Bharti School of Telecommunication Technology and Management, Indian Institute of Technology,Delhi, New Delhi, India India
  4. Educational Technology Services Centre, Indian Institute of Technology,Delhi, New Delhi, India India
Journal: Communications medicine, volume 6, issue 1, article 211
Dates: received 10 January 2025; accepted 14 January 2026; published online 2 March 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1038/s43856-026-01395-y · PMID 41772142 · PMCID PMC13069039 · OpenAlex W7133220368
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), depression (population), clinical / translational (subfield)
Methods: Spectral & time-frequency, fMRI & imaging
Keywords: Brain imaging, Magnetic resonance imaging
Topic: Functional Brain Connectivity Studies (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: 1. CRG Government of India (RP04820G); 1. Tata Consultancy Services Research Scholar Program (TCS-RSP)
Citations: not cited yet (Europe PMC); 85 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 4 matches between paragraphs and lines of code.

yusufm423/decorr-gnn-mdd

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 3d9969171ee8e9268dd266f53b216dd3eb8bf530, 18 November 2025
Languages: Jupyter (1)
Size: 4 files, 1 script
Software Heritage: not archived
Found in: “Code availability”
Holds: README, CITATION.cff, environment (requirements.txt), 1 notebook
Not found: license file, tests, continuous integration, documentation
Tools: NumPy (1 file), pandas (1 file), PyTorch Geometric (1 file), PyTorch (1 file), scikit-learn (1 file), SciPy (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
2 files

Code availability statement

The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1038/s43856-026-01395-y.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 1 script, each with its path and the digest of its content;
  • 4 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data availability statement

The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

  • it says that the data are available on request

Read it in the paper: doi.org/10.1038/s43856-026-01395-y.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 2 keywords, 2 funders, 62 references.

Cite

This paper

Barman, J., Yusuf, M., Kumar, S., & Gandhi, T. K. (2026). Enhancing depression diagnosis with augmented brain signal driven decorrelated graph neural networks. Communications medicine, 6(1), 211. https://doi.org/10.1038/s43856-026-01395-y

BibTeX

@article{barman2026enhancing,
author = {Barman, Jyotismita and Yusuf, Mohammad and Kumar, Sandeep and Gandhi, Tapan Kumar},
title = {{Enhancing depression diagnosis with augmented brain signal driven decorrelated graph neural networks}},
journal = {Communications medicine},
year = {2026},
month = mar,
volume = {6},
number = {1},
pages = {211},
publisher = {Nature Publishing Group},
issn = {2730-664X},
doi = {10.1038/s43856-026-01395-y},
url = {https://doi.org/10.1038/s43856-026-01395-y},
pmid = {41772142},
pmcid = {PMC13069039}
}

RIS

TY - JOUR
AU - Barman, Jyotismita
AU - Yusuf, Mohammad
AU - Kumar, Sandeep
AU - Gandhi, Tapan Kumar
TI - Enhancing depression diagnosis with augmented brain signal driven decorrelated graph neural networks
T2 - Communications medicine
J2 - Commun Med (Lond)
PY - 2026
DA - 2026/03/02
VL - 6
IS - 1
SP - 211
SN - 2730-664X
PB - Nature Publishing Group
DO - 10.1038/s43856-026-01395-y
UR - https://doi.org/10.1038/s43856-026-01395-y
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s43856-026-01395-y",
"type": "article-journal",
"title": "Enhancing depression diagnosis with augmented brain signal driven decorrelated graph neural networks",
"container-title": "Communications medicine",
"author": [
{
"family": "Barman",
"given": "Jyotismita"
},
{
"family": "Yusuf",
"given": "Mohammad"
},
{
"family": "Kumar",
"given": "Sandeep"
},
{
"family": "Gandhi",
"given": "Tapan Kumar"
}
],
"container-title-short": "Commun Med (Lond)",
"volume": "6",
"issue": "1",
"page": "211",
"DOI": "10.1038/s43856-026-01395-y",
"PMID": "41772142",
"PMCID": "PMC13069039",
"ISSN": "2730-664X",
"publisher": "Nature Publishing Group",
"URL": "https://doi.org/10.1038/s43856-026-01395-y",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
2
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41398-026-03965-z [code]
Disentangling individual heterogeneity reveals robust network and molecular signatures of major depressive disorder with suicidal ideation.
Journal: Translational psychiatry
In common: PyTorch Geometric, PyTorch, scikit-learn, 3 other tools, depression, 3 references
[2] doi:10.1002/hbm.70469 [code]
VarCoNet: A Variability-Aware Self-Supervised Framework for Functional Connectome Extraction From Resting-State fMRI.
Journal: Human brain mapping
In common: PyTorch Geometric, PyTorch, scikit-learn, 3 other tools, 2 references
[3] doi:10.3390/brainsci16080872
HDGNN-Mamba2: Mamba-Based Spatiotemporal Heterogeneous Dynamic Graph Neural Network for Major Depressive Disorder Classification.
Journal: Brain sciences
In common: depression, 6 references
[4] doi:10.1038/s41398-026-04101-7 [code]
Using deep learning to identify brain networks mediating cognitive and motor impairments in alcohol use disorder.
Journal: Translational psychiatry
In common: PyTorch Geometric, PyTorch, scikit-learn, 3 other tools, 2 references
[5] doi:10.1016/j.isci.2026.116173 [code]
Hierarchical sparse spatiotemporal graph neural network for brain graph classification.
Journal: iScience
In common: PyTorch, scikit-learn, pandas, 2 other tools, 3 references
[6] doi:10.21203/rs.3.rs-9326213/v1 [code]
Multi-task fMRI outperforms resting-state fMRI for revealing task-invariant organization of the human brain
Journal: Research Square (preprint)
In common: PyTorch, scikit-learn, pandas, 2 other tools, 3 references
[7] doi:10.64898/2026.03.09.710558 [code]
Multi-task fMRI outperforms resting-state fMRI for revealing task-invariant organization of the human brain
Journal: bioRxiv (preprint)
In common: PyTorch, scikit-learn, pandas, 2 other tools, 3 references
[8] doi:10.1038/s41398-026-04079-2 [code]
Neural Responses to Affective Sentences Reveal Signatures of Depression.
Journal: Translational psychiatry
In common: PyTorch, scikit-learn, pandas, 2 other tools, depression, 2 references
[9] doi:10.1038/s42003-026-10108-z [code]
Time-resolved EEG decoding reveals altered neural dynamics of affective semantic evaluation in depression and suicidality.
Journal: Communications biology
In common: scikit-learn, pandas, SciPy, 1 other tool, depression, 2 references
[10] doi:10.1073/pnas.2519586123 [code]
Personalized functional topography-based multisite brain age prediction modeling reveals divergent neurodevelopment in major depression.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: scikit-learn, pandas, SciPy, 1 other tool, depression, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.