Encoding of speech modes and loudness in ventral precentral gyrus.
The 13 matches
- [1] § Results › Loudness representation in neural ensemble activity ↔ plotting_scripts/dpca.py, lines 240–288 · score 0.73 · pairwise cosine, dPCs, upper triangle, orthogonality, dPCA, word
- [2] § Results › Loudness encoding in ventral precentral gyrus ↔ analyses_scripts/ch_encoding_word.py, lines 150–174 · score 0.72 · post hoc, way ANOVA, word tuning, word pairs, Firing rate, Tukey
- [3] § Methods › Data recording and processing › Breath analysis ↔ analyses_scripts/ol_classification.py, lines 140–206 · score 0.69 · trained logistic regression, cross validation, neural features, shuffled, fold, classifiers
- [4] § Methods › Data recording and processing › Offline loudness decoder training and analyses ↔ analyses_scripts/ol_striding_classification.py, lines 234–304 · score 0.68 · cross validation, logistic regression, decoding accuracy, stride, permutation, trained
- [5] § Methods › Data recording and processing › Firing rate analyses ↔ analyses_scripts/ch_encoding_word.py, lines 150–174 · score 0.66 · post hoc, way ANOVA, firing rate, Tukey, encodes, electrode
- [6] § Methods › Data recording and processing › Firing rate analyses ↔ analyses_scripts/ch_encoding_loudness.py, lines 150–175 · score 0.65 · post hoc, way ANOVA, firing rate, Tukey, encodes, electrode
- [7] § Results › Loudness representation in neural ensemble activity ↔ plotting_scripts/dpca.py, lines 240–288 · score 0.63 · dot product, Explained variance, orthogonal, triangle, PCs, axis
- [8] § Methods › Data recording and processing › Breath analysis ↔ analyses_scripts/ol_striding_classification.py, lines 549–626 · score 0.62 · trained logistic regression, cross validation, neural features, fold, classifiers, accuracy
- [9] § Methods › Data recording and processing › Breath analysis ↔ plotting_scripts/speech_breath_analyses.py, lines 120–228 · score 0.60 · minimum breath belt, breath cycle
- [10] § Methods › Data recording and processing › Spike sorting and single-unit analyses ↔ analyses_scripts/ch_encoding_loudness.py, lines 150–175 · score 0.59 · post hoc, way ANOVA, firing rate, Tukey, tuned, loudness
- [11] § Results › Offline decoding of loudness ↔ plotting_scripts/ol_striding_classification.py, lines 42–159 · score 0.58 · cluster permutation, cue onset, Loudness decoders, vertical, stride, window
- [12] § Methods › Behavioral tasks › Instructed breathing task ↔ plotting_scripts/speech_breath_analyses.py, lines 120–228 · score 0.57 · instructed breathing, breath belt, attempted loudness
- [13] § Methods › Data recording and processing › Behavioral data ↔ analyses_scripts/psth.py, lines 136–198 · score 0.54 · Gaussian smoothing, go period, binned
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
Python · 288 lines · 13 KB · CC-BY-NC-SA-4.0 · 2 matches
- # This script plots dPCA results: projections, explained variance, correlation matrix.
- import argparse
- import numpy as np
- import scipy
- import math
- import os
- from datetime import datetime
- import matplotlib.pyplot as plt
- from matplotlib.colors import LinearSegmentedColormap
- '''
- Example cmd (when run from this directory; provide python script path appropriately if run from different directory):
- For t15,
- python dpca.py --participant t15 --session word-loudness --nbins_before_onset 75 --nbins_after_onset 75 --savepath_data ../plotting_data/t15/word-loudness/dPCA/ --savepath_fig ../plotting_figures/t15/word-loudness/dPCA/
- For t16,
- python dpca.py --participant t16 --session word-loudness --nbins_before_onset 75 --nbins_after_onset 75 --savepath_data ../plotting_data/t16/word-loudness/dPCA/ --savepath_fig ../plotting_figures/t16/word-loudness/dPCA/
- Data will be loaded from the specified savepath_data directory.
- Figures will be saved in the specified savepath_fig directory.
- '''
- #-----------------------
- # global variables
- #-----------------------
- amplitudes = ['MIME', 'WHISPER', 'NORMAL', 'LOUD']
- words = ['be', 'my', 'know', 'do', 'have', 'going']
- marg_names = ['Word', 'Loudness', 'Condition\nindependent', 'Interaction']
- num_pcs_plot = 3
- # plotting
- marg_plotting_order = ['Condition\nindependent', 'Word', 'Loudness', 'Interaction']
- marg_plotting_order_ind = [2, 0, 1, 3]
- target_color = [ # word colors
- (0.9254902, 0.12156863, 0.14117647),
- (0.98431373, 0.72941176, 0.07058824),
- (0.384, 0.682, 0.2),
- (0.43137255, 0.79607843, 0.85490196),
- [0.45568627, 0.31764706, 0.63529412],
- (0.84705882, 0.2627451, 0.59215686)
- ]
- hue = [0.25, 0.5, 0.75, 1]
- linewidth = [0.5, 1, 1.5, 2]
- scatter_size = 30
- fontsize = 15
- my_explode = [0.1] * len(marg_names)
- my_color = [ # ordered similar to marg names
- (150/255, 54/255, 34/255), # word, red
- (34/255, 54/255, 150/255), # loudness, blue
- (128/255, 128/255, 128/255), # condition independent, gray
- (150/255, 34/255, 150/255), # interaction, purple
- ]
- #-----------------------
- # functions
- #-----------------------
- def plot_projections(projections, which_marg, explained_var):
- fig, ax = plt.subplots(len(marg_names), num_pcs_plot, figsize = (12,6))
- for marg in range(len(marg_names)):
- marg_ind_to_plot = marg_plotting_order_ind[marg]
- components = [i for i, val in enumerate(which_marg.squeeze()) if val == marg_ind_to_plot]
- comp_min = 1000; comp_max = -1
- for comp in range(min(num_pcs_plot, len(components))):
- for d1 in range(len(words)):
- for d2 in range(len(amplitudes)):
- # Plot the data
- ax[marg, comp].plot(
- time[args.participant],
- np.squeeze(projections[components[comp], d1, d2, :]),
- linestyle = '-',
- color=target_color[d1],
- alpha = hue[d2],
- linewidth = linewidth[d2],
- label=f"{amplitudes[d2]} {words[d1]}"
- )
- comp_min = min(comp_min, np.min(np.squeeze(projections[components[comp], d1, d2, :])))
- comp_max = max(comp_max, np.max(np.squeeze(projections[components[comp], d1, d2, :])))
- ax[marg, comp].set_ylim([math.floor(comp_min), math.ceil(comp_max)])
- ax[marg, comp].scatter(0, math.floor(comp_min) + (math.ceil(comp_max) * 2/20), color='black', s=scatter_size) # speech onset marker
- ax[marg, comp].text((args.nbins_after_onset/100)- 0.05, math.ceil(comp_max), f"{explained_var[marg_ind_to_plot,components[comp]]:.1f}%", fontsize = fontsize, ha = 'center') # explained variance % at top right
- ax[marg, comp].text(-((args.nbins_before_onset/100) - 0.1), math.floor(comp_min) + 0.07 * (math.ceil(comp_max) - math.floor(comp_min)), f"{components[comp] + 1}", fontsize = fontsize, ha = 'center')
- ax[marg, comp].scatter(-((args.nbins_before_onset/100) - 0.1), math.floor(comp_min) + 0.16 * (math.ceil(comp_max) - math.floor(comp_min)), s = 400, color = 'black', facecolor = 'none')
- if comp != 0:
- for pos in ['right', 'top', 'bottom']:
- ax[marg, comp].spines[pos].set_visible(False)
- ax[marg, comp].set_xticks([])
- ax[marg, comp].set_yticks([])
- if comp == 0:
- for pos in ['right', 'top', 'bottom',]:
- ax[marg, comp].spines[pos].set_visible(False)
- ax[marg, comp].set_yticks([math.floor(comp_min), 0, math.ceil(comp_max)],
- [math.floor(comp_min), 0, math.ceil(comp_max)], fontsize = fontsize)
- ax[marg, comp].set_xticks([])
- ax[marg, comp].set_ylabel(marg_names[marg_ind_to_plot], fontsize = fontsize)
- if marg == 3 and comp == 2:
- ax[marg, comp].hlines(-math.ceil(comp_max), xmin = args.nbins_after_onset/100 - 0.5, xmax = args.nbins_after_onset/100, linewidth = 3, color = 'black')
- ax[marg, comp].text(args.nbins_after_onset/100 - 0.25, -1.5, '500 ms', color = 'black', ha = 'center', fontsize = fontsize)
- if marg == 3 and comp == 0:
- ax[marg, comp].text(0, -1.5, 'Speech onset', color = 'black', ha = 'center', fontsize = fontsize)
- if marg == 0 and comp == 0:
- ax[marg, comp].text((args.nbins_after_onset/100) - 0.05, math.ceil(comp_max) + 3, 'Explained variance', color = 'black', ha = 'center', fontsize = fontsize)
- fig.tight_layout()
- plt.subplots_adjust(wspace=0.05)
- # plt.show()
- # save figure
- plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_projections_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
- return
- def plot_explained_variance(explained_var):
- fontsize = 13
- fig = plt.figure(figsize=(5,5))
- plt.subplot(2,1,1)
- # pie chart
- expl_var_comp = np.sum(explained_var, axis = -1)
- marg_names_with_percent = []
- for i in range(len(marg_names)):
- marg_names_with_percent.append(f'{marg_names[i]}\n({(expl_var_comp[i]/sum(expl_var_comp))*100:.1f}%)')
- plt.pie(expl_var_comp, labels = marg_names_with_percent, #autopct='%1.1f%%',
- colors = my_color, explode = my_explode, startangle = 140, shadow = False, textprops={'fontsize': fontsize}, labeldistance=1.3)
- # stacked bar plot
- plt.subplot(2, 1, 2)
- num_comps_to_plot = 15
- bottom = np.zeros(num_comps_to_plot) # Initialize bottom for stacking
- for i in range(len(marg_names)):
- plt.bar(np.arange(num_comps_to_plot), explained_var[i, :num_comps_to_plot], label=marg_names[i], color=my_color[i], bottom=bottom)
- bottom += explained_var[i, :num_comps_to_plot]
- for pos in ['right', 'top']:
- plt.gca().spines[pos].set_visible(False)
- plt.ylim([0, math.ceil(bottom[0])])
- plt.yticks(np.arange(0, math.ceil(bottom[0]), 10), np.arange(0, math.ceil(bottom[0]), 10), fontsize = fontsize)
- plt.xticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
- plt.xlabel('dPCA component', fontsize = fontsize)
- plt.ylabel('Variance (%)', fontsize = fontsize)
- fig.tight_layout()
- # plt.show()
- # save figure
- plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_variance_plot_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
- return
- def plot_correlation(corr_matrix, sig_ind):
- fontsize = 19
- fig = plt.figure(figsize = (5,5))
- num_comps_to_plot = 15
- custom_cmap = LinearSegmentedColormap.from_list("dark_bwr", ["#002147", "white", "#800000"]) # Dark navy blue → White → Maroon
- img = plt.imshow(corr_matrix[:num_comps_to_plot, :num_comps_to_plot], cmap = custom_cmap, vmin = -1, vmax = 1)
- ind_to_plot = []
- for k in range(len(sig_ind[0])):
- if sig_ind[0][k] < num_comps_to_plot and sig_ind[1][k] < num_comps_to_plot:
- ind_to_plot.append(k)
- plt.scatter(sig_ind[1][ind_to_plot], sig_ind[0][ind_to_plot], color='k', marker='*')
- plt.xticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
- plt.yticks([0, 4, 9, 14], [1, 5, 10, 15], fontsize = fontsize)
- plt.xlabel('dPCA component', fontsize = fontsize)
- plt.ylabel('dPCA component', fontsize = fontsize)
- cbar = fig.colorbar(img, fraction=0.046, pad=0.04)
- cbar.outline.set_visible(False)
- cbar.ax.tick_params(labelsize=fontsize)
- cbar.set_ticks([-1, 0, 1])
- cbar.ax.set_title('Similarity', fontsize=fontsize)
- for pos in ['right', 'top', 'left', 'bottom']:
- plt.gca().spines[pos].set_visible(False)
- fig.tight_layout()
- # plt.show()
- # save figure
- plt.savefig(f'{args.savepath_fig}{args.participant}_dpca_correlation_matrix_{formatted_datetime}_{args.nbins_before_onset}_{args.nbins_after_onset}.png', format='png')
- return
- if __name__ == "__main__":
- current_datetime = datetime.now()
- formatted_datetime = current_datetime.strftime("%Y%m%d_%H%M%S")
- parser = argparse.ArgumentParser()
- parser.add_argument('--participant', type=str, default=None, help='participant id')
- parser.add_argument('--session', type=str, default=None, help = 'session id')
- parser.add_argument('--nbins_before_onset', type=int, default = None, help = 'number of bins before speech onset')
- parser.add_argument('--nbins_after_onset', type=int, default = None, help = 'number of bins after speech onset')
- parser.add_argument('--savepath_data', type=str, default='../figures_data/', help = 'path to save processed data from this script')
- parser.add_argument('--savepath_fig', type=str, default='../figures/', help = 'path to save figures from this script')
- args = parser.parse_args()
- if not os.path.exists(args.savepath_fig):
- os.makedirs(args.savepath_fig, exist_ok=True)
- if args.participant in 't15':
- n_channels = 256
- elif args.participant == 't16':
- n_channels = 128
- time = {
- 't15': np.arange(-args.nbins_before_onset/100, args.nbins_after_onset/100, 0.01),
- 't16': np.arange(-args.nbins_before_onset/100, args.nbins_after_onset/100, 0.01),
- }
- print('Running plot_dPCA_results.py')
- print(args)
- # # load projections
- print('Loading projections, which marginals, explained variance...')
- projections = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_avg_firingrates_projections.mat')
- projections = projections['ProjectionAverage']
- # load which margins the projections belong to
- which_marg = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_which_marg.mat')
- which_marg = which_marg['whichMarg'] - 1 # subtract 1 as matlab indices are 1-indexed
- # # load explained variance by components
- explained_var = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_explained_var.mat')
- explained_var = explained_var['margVar']
- # # plot projections
- print('Plotting projections...')
- plot_projections(projections, which_marg, explained_var)
- # # plot explained variance piechart and bar plot
- print('Plotting explained variance...')
- plot_explained_variance(explained_var)
- # load correlation, decoder dot product, kendall p-value
- print('Loading correlation, decoder dot product, kendall p-value matrices...')
- correlation = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_correlations.mat')
- correlation = correlation['a']
- decoder_dot_product = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_decoder_matrix_dot_product.mat')
- decoder_dot_product = decoder_dot_product['b']
- pval = scipy.io.loadmat(f'{args.savepath_data}{args.participant}_{args.nbins_before_onset}_{args.nbins_after_onset}_kendall_pvalue.mat')
- pval = pval['psp']
- map_matrix = np.tril(correlation, -1) + np.triu(decoder_dot_product) #lower triangle is correlation, upper triangle is decoder dot product
- # components with significant difference in dot product
- indices = np.where((abs(np.triu(decoder_dot_product, 1)) > 3.3 / np.sqrt(n_channels)) & (pval < 0.001))
- # plot correlation matrix
- print('Plotting correlation matrix...')
- plot_correlation(map_matrix, indices)
- # check how many pairs of of components in the dot product belong to word-loudness and how many are significantly orthogonal
- which_marg_word = np.where(which_marg.squeeze() == marg_names.index('Word'))[0]
- which_marg_loudness = np.where(which_marg.squeeze() == marg_names.index('Loudness'))[0]
- print('Word component indices:', which_marg_word)
- print('Loudness component indices:', which_marg_loudness)
- n_word_loudness_axis_pairs = len(which_marg_word) * len(which_marg_loudness)
- print(f'Number of word-loudness axis pairs: {n_word_loudness_axis_pairs}')
- # pairwise cosine similarity between top-X loudness dPCs and word dPCS
- n_top_dpcs = 5
- abs_dpc_cosine_sim = []
- for i in range(n_top_dpcs):
- word_dpc_ind = which_marg_word[i]
- loud_dpc_ind = which_marg_loudness[i]
- abs_dpc_cosine_sim.append(abs(decoder_dot_product[word_dpc_ind, loud_dpc_ind]))
- print(f'Mean cosine similarity top {n_top_dpcs}:', np.mean(abs_dpc_cosine_sim))
- print(f'Std dev cosine similarity top {n_top_dpcs}:', np.std(abs_dpc_cosine_sim))
- print('DONE!')
dpca.py at commit 4f73ec4, under CC-BY-NC-SA-4.0 · at the source
Overview
- Department of Neurological Surgery, University of California Davis, Davis, CA USA
- Biomedical Engineering Graduate Group, University of California Davis, Davis, CA USA
- Computer Science Graduate Group, University of California Davis, Davis, CA USA
- Wallace H. Coulter Department of Biomedical Engineering, Emory University and Georgia Institute of Technology, Atlanta, GA USA
- Center for Neurotechnology and Neurorecovery, Department of Neurology, Massachusetts General Hospital, Harvard Medical School, Boston, MA USA
- Veterans Affairs Rehabilitation Research & Development Center for Neurorestoration and Neurotechnology, Providence VA Medical Center, Providence, RI USA
- Robert J. & Nancy D. Carney Institute for Brain Science and School of Engineering, Brown University, Providence, RI USA
- Department of Neurosurgery, Emory University, Atlanta, GA USA
- Department of Cell Biology, Emory University, Atlanta, GA USA
Abstract
The ability to vary the mode and loudness of speech is an important part of the expressive range of human vocal communication. However, the encoding of these behaviors in the ventral precentral gyrus (vPCG) has not been studied at the resolution of neuronal firing rates. We investigated this in two participants who had intracortical microelectrode arrays implanted in their vPCG as part of a speech neuroprosthesis clinical trial. Neuronal firing rates modulated strongly in vPCG as a function of attempted mimed, whispered, normal or loud speech. At the neural ensemble level, mode/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 13 matches between paragraphs and lines of code.
Neuroprosthetics-Lab/srinivasan-speech-modes
4f73ec463ffe5a52366aab3257729976a8594fa3, 3 April 2026Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
21 files
- analyses_scripts/
ch_dropping.py , Python, 313 lines - analyses_scripts/
ch_encoding_loudness.py , Python, 319 lines, 2 matches - analyses_scripts/
ch_encoding_word.py , Python, 316 lines, 2 matches - analyses_scripts/
functions.py , Python, 354 lines - analyses_scripts/
ol_classification.py , Python, 431 lines, 1 match - analyses_scripts/
ol_striding_classificati , Python, 626 lines, 2 matcheson.py - analyses_scripts/
pca.py , Python, 250 lines - analyses_scripts/
psth.py , Python, 583 lines, 1 match - analyses_scripts/
speech_duration.py , Python, 274 lines - plotting_scripts/
ch_dropping.py , Python, 88 lines - plotting_scripts/
ch_encoding.py , Python, 185 lines - plotting_scripts/
dpca.py , Python, 288 lines, 2 matches - plotting_scripts/
ol_classification.py , Python, 175 lines - plotting_scripts/
ol_striding_classificati , Python, 351 lines, 1 matchon.py - plotting_scripts/
pca.py , Python, 124 lines - plotting_scripts/
psth.py , Python, 384 lines - plotting_scripts/
single_unit_psth_tuning. , Python, 327 linespy - plotting_scripts/
speech_breath_analyses.p , Python, 451 lines, 2 matchesy - plotting_scripts/
speech_duration.py , Python, 231 lines - License.md, License, 14 lines
- README.md, Text, 43 lines
Code availability
Code to implement the analyses described in this study is publicly available on GitHub (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
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;
- 19 scripts, each with its path and the digest of its content;
- 13 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
Datasets cited
- doi:10.5061/
dryad.2547d7x5w , at Dryad; found in “Data availability”
Data availability
De-identified neural data reported in this study are publicly available on Dryad (10.5061/
Reproduced under the paper's license (CC BY), from the paper cited above.
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, 29 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 13 authors, 4 keywords, 11 MeSH terms, 1 funder, 39 references.
Cite
This paper
Srinivasan, A., Wairagkar, M., Iacobacci, C., Hou, X., Card, N. S., Jacques, B. G., Pritchard, A. L., Bechefsky, P. H., Hochberg, L. R., AuYong, N., Pandarinath, C., Brandman, D. M., & Stavisky, S. D. (2026). Encoding of speech modes and loudness in ventral precentral gyrus. Nature communications, 17(1), 5301. https://
BibTeX
@article{srinivasan2026e
author = {Srinivasan, Aparna and Wairagkar, Maitreyee and Iacobacci, Carrina and Hou, Xianda and Card, Nicholas S and Jacques, Brandon G and Pritchard, Anna L and Bechefsky, Payton H and Hochberg, Leigh R and AuYong, Nicholas and Pandarinath, Chethan and Brandman, David M and Stavisky, Sergey D},
title = {{Encoding of speech modes and loudness in ventral precentral gyrus}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {5301},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/
url = {https://
pmid = {41986329},
pmcid = {PMC13270037}
}
RIS
TY - JOUR
AU - Srinivasan, Aparna
AU - Wairagkar, Maitreyee
AU - Iacobacci, Carrina
AU - Hou, Xianda
AU - Card, Nicholas S
AU - Jacques, Brandon G
AU - Pritchard, Anna L
AU - Bechefsky, Payton H
AU - Hochberg, Leigh R
AU - AuYong, Nicholas
AU - Pandarinath, Chethan
AU - Brandman, David M
AU - Stavisky, Sergey D
TI - Encoding of speech modes and loudness in ventral precentral gyrus
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/
VL - 17
IS - 1
SP - 5301
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Encoding of speech modes and loudness in ventral precentral gyrus",
"container-title": "Nature communications",
"author": [
{
"family": "Srinivasan",
"given": "Aparna"
},
{
"family": "Wairagkar",
"given": "Maitreyee"
},
{
"family": "Iacobacci",
"given": "Carrina"
},
{
"family": "Hou",
"given": "Xianda"
},
{
"family": "Card",
"given": "Nicholas S"
},
{
"family": "Jacques",
"given": "Brandon G"
},
{
"family": "Pritchard",
"given": "Anna L"
},
{
"family": "Bechefsky",
"given": "Payton H"
},
{
"family": "Hochberg",
"given": "Leigh R"
},
{
"family": "AuYong",
"given": "Nicholas"
},
{
"family": "Pandarinath",
"given": "Chethan"
},
{
"family": "Brandman",
"given": "David M"
},
{
"family": "Stavisky",
"given": "Sergey D"
}
],
"container-title-short":
"volume": "17",
"issue": "1",
"page": "5301",
"DOI": "10.1038/
"PMID": "41986329",
"PMCID": "PMC13270037",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
15
]
]
}
}
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/s41591-026-04414-6 [code]
- Long-term independent use of an intracortical brain-computer interface for speech and cursor control.Journal: Nature medicineIn common: pandas, SciPy, Matplotlib, 1 other tool, cognitive, 8 references, 6 authors
- [2] doi:10.1038/s41586-026-10653-x [code]
- A mosaic of whole-body representations on the human precentral gyrus.Journal: NatureIn common: scikit-learn, SciPy, Matplotlib, 1 other tool, 5 references, 7 authors
- [3] doi:10.1038/s41467-026-75455-1 [code]
- Shared latent representations of speech production for cross-patient speech decoding.Journal: Nature communicationsIn common: seaborn, scikit-learn, pandas, 3 other tools, cognitive, 7 references
- [4] doi:10.1007/s12021-026-09807-z [code]
- Optimal Size of Electrocorticography Grids for Classification of Hand Movements.Journal: NeuroinformaticsIn common: seaborn, scikit-learn, pandas, 3 other tools, 5 references
- [5] doi:10.1073/pnas.2536563123 [code]
- Temporally structured motor and auditory representations in covert syllable production.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: MNE-Python, scikit-learn, pandas, 3 other tools, cognitive, 4 references
- [6] doi:10.1038/s41586-026-10691-5 [code]
- Mapping the neuronal building blocks of human language with language models.Journal: NatureIn common: scikit-learn, pandas, SciPy, 2 other tools, cognitive, 5 references
- [7] doi:10.7554/elife.109400 [code]
- High-fidelity neural speech reconstruction through an efficient acoustic-linguistic dual-pathway framework.Journal: eLifeIn common: SciPy, Matplotlib, NumPy, cognitive, 5 references
- [8] doi:10.1038/s41467-026-75745-8 [code]
- A language network in the individualized functional connectomes of 1199 human brains doing arbitrary tasks.Journal: Nature communicationsIn common: seaborn, scikit-learn, pandas, 3 other tools, cognitive, 3 references
- [9] doi:10.1186/s12911-026-03552-8
- Artificial intelligence for brain-to-speech decoding in paralysis: a systematic review.Journal: BMC medical informatics and decision makingIn common: cognitive, 5 references
- [10] doi:10.1038/s41467-026-75240-0 [code]
- Dynamic acoustic-to-categorical representations of phonemes and prosody along ventral and dorsal speech streams.Journal: Nature communicationsIn common: MNE-Python, seaborn, scikit-learn, 4 other tools, cognitive, 1 reference
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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 19 scripts, and 13 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:89c47098c5722921…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
