Speech clocks decode dementia phenotypes, social exposome, and biological aging.
The 10 matches
- [1] § MATERIALS AND METHODS › Diagnostic criteria and clinical/cognitive assessments ↔ Code/linear_regressions.ipynb, lines 1445 to 1464 · score 0.66 · episodic memory, visual memory, global cognition, executive, AD, diagnostic · Report a mismatch
- [2] § MATERIALS AND METHODS › Statistical analysis and predictor-based age estimation ↔ Code/regression_main.ipynb, lines 294 to 355 · score 0.64 · gradient boosting regressor, outer, nested, inner, R2, fold · Report a mismatch
- [3] § RESULTS › SAGs and clinical/cognitive domains ↔ Code/linear_regressions.ipynb, lines 1445 to 1464 · score 0.61 · episodic memory, visual memory, global cognition, executive, AD, diagnostic · Report a mismatch
- [4] § MATERIALS AND METHODS › Statistical analysis and predictor-based age estimation ↔ Code/loco_main.ipynb, lines 355 to 416 · score 0.57 · gradient boosting regressor, inner, R2, fold, predict, Model · Report a mismatch
- [5] § MATERIALS AND METHODS › Brain clocks › Structural clock (MRI-T1) ↔ Code/regression_main.ipynb, lines 294 to 355 · score 0.56 · gradient boosting, outer, nested, inner, pipeline, fold · Report a mismatch
- [6] § RESULTS › SAG building using speech composite features ↔ Code/loco_main.ipynb, lines 36 to 157 · score 0.56 · absolute error, squared error, MAE, MDE, predict · Report a mismatch
- [7] § RESULTS › SAG building using speech composite features ↔ Code/regression_main.ipynb, lines 36 to 157 · score 0.56 · absolute error, squared error, MAE, MDE, predict · Report a mismatch
- [8] § MATERIALS AND METHODS › Feature extraction (age predictors) ↔ Code/R2R/R2R-Fig3-prediction-power.ipynb, lines 199 to 263 · score 0.54 · processing speed, semantic memory, metric, predictive, age · Report a mismatch
- [9] § RESULTS › Sensitivity models confirm diagnostic differences in SAGs ↔ Code/R2R/R2R-Fig-3-analysis.ipynb, lines 656 to 786 · score 0.54 · composite comorbidity, linguistic predictors, covariates, pitch, languages, education · Report a mismatch
- [10] § RESULTS › SAGs outperform individual speech-feature domains in diagnostic discrimination ↔ Code/R2R/R2R-Fig3-prediction-power.ipynb, lines 199 to 263 · score 0.51 · processing speed, semantic memory, bootstrap, education, linguistic, sex · Report a mismatch
Paper
Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Jupyter notebook · 476 lines · 14 KB · no license · 3 matches
- # %%
- import pandas as pd
- import numpy as np
- import os
- import pandas as pd
- import numpy as np
- from collections import Counter
- import statsmodels.api as sm
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import r2_score
- from sklearn.model_selection import KFold
- from sklearn.metrics import mean_squared_error, r2_score
- import math
- from sklearn.preprocessing import MinMaxScaler
- import scipy
- from sklearn import metrics
- import numpy as np
- from sklearn.metrics import mean_absolute_error
- from scipy.stats import pearsonr
- import seaborn as sns
- import matplotlib.pyplot as plt
- from tqdm.notebook import tqdm
- from sklearn.linear_model import LinearRegression, Ridge
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import mean_squared_error, r2_score
- from scipy.stats import linregress
- from scipy import stats
- from sklearn.utils import resample
- # %%
- import pandas as pd
- import seaborn as sns
- import matplotlib.pyplot as plt
- from scipy.stats import permutation_test
- def perm_test(group1, group2, n_permutations=10000):
- observed_diff = np.mean(group1) - np.mean(group2)
- def statistic(x, y):
- return np.mean(x) - np.mean(y)
- result = permutation_test(
- data=(group1, group2),
- statistic=statistic,
- permutation_type='independent',
- vectorized=False, # importante: no usar vectorized
- n_resamples=n_permutations,
- alternative='two-sided',
- random_state=42
- )
- return observed_diff, result.pvalue
- def cliffs_delta(x, y):
- n_x = len(x)
- n_y = len(y)
- all_pairs = [(xi, yi) for xi in x for yi in y]
- n_greater = sum(1 for xi, yi in all_pairs if xi > yi)
- n_less = sum(1 for xi, yi in all_pairs if xi < yi)
- delta = (n_greater - n_less) / (n_x * n_y)
- return delta
- # Función para quitar outliers con IQR
- def remove_outliers_iqr(df, col, thres=1.5):
- Q1 = df[col].quantile(0.25)
- Q3 = df[col].quantile(0.75)
- IQR = Q3 - Q1
- lower = Q1 - thres * IQR
- upper = Q3 + thres * IQR
- return df[(df[col] >= lower) & (df[col] <= upper)]
- def mean_directional_accuracy(y_true, y_pred):
- differences = np.array(y_pred) - np.array(y_true)
- signs = np.sign(differences)
- mde = np.mean(signs)
- return mde
- def mean_absolute_error(y_true, y_pred):
- y_true = np.array(y_true)
- y_pred = np.array(y_pred)
- absolute_errors = np.abs(y_pred - y_true)
- mae = np.mean(absolute_errors)
- return mae
- def coef_pval(coef_array_mean_, X_, y_, y_p):
- n = X_.shape[0]
- t = coef_tval(coef_array_mean_, X_, y_, y_p)
- p = 2 * (1 - scipy.stats.t.cdf(abs(t), n - 1))
- return p
- def coef_tval(coef_array_mean_, X_, y_, y_p):
- '''
- coef_tval for OLS of statsmodels
- '''
- a = np.array(coef_array_mean_[0][0]/ coef_se(X_, y_, y_p)[0])
- b = np.array(coef_array_mean_[1::].flatten() / coef_se(X_, y_, y_p)[1:])
- return np.append(a, b)
- def coef_se(X_, y_, y_p):
- '''
- coef_se for OLS of statsmodels
- '''
- n = X_.shape[0]
- X1 = np.hstack((np.ones((n, 1)), np.matrix(X_)))
- se_matrix = scipy.linalg.sqrtm(
- metrics.mean_squared_error(y_, y_p) *
- np.linalg.inv(X1.T * X1)
- )
- return np.diagonal(se_matrix)
- def directional_accuracy(predicted_values, true_values):
- predicted_values = np.array(predicted_values)
- true_values = np.array(true_values)
- difference_direction = np.sign(predicted_values - true_values)
- correct_direction_count = np.sum(difference_direction == 1) + np.sum(difference_direction == -1)
- directional_accuracy_score = correct_direction_count / len(predicted_values)
- return directional_accuracy_score
- from sklearn.ensemble import GradientBoostingRegressor
- from statsmodels.api import GLM
- from statsmodels.api import families
- from sklearn.model_selection import GridSearchCV, KFold
- from sklearn.ensemble import GradientBoostingRegressor
- from sklearn.preprocessing import MinMaxScaler
- from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
- from scipy.stats import linregress
- import numpy as np
- import pandas as pd
- import math
- import warnings
- from skopt import BayesSearchCV
- from skopt.space import Real, Integer
- # %%
- import pandas as pd
- import numpy as np
- import seaborn as sns
- import matplotlib.pyplot as plt
- def remove_outliers_iqr(df, col, iqr_k=1.5):
- s = pd.to_numeric(df[col], errors="coerce")
- q1 = s.quantile(0.25)
- q3 = s.quantile(0.75)
- iqr = q3 - q1
- low = q1 - iqr_k * iqr
- high = q3 + iqr_k * iqr
- return df.loc[(s >= low) & (s <= high)].copy()
- def cliffs_delta(x, y):
- x = pd.to_numeric(pd.Series(x).dropna(), errors="coerce").dropna().values
- y = pd.to_numeric(pd.Series(y).dropna(), errors="coerce").dropna().values
- nx, ny = len(x), len(y)
- if nx == 0 or ny == 0:
- return np.nan
- diffs = x[:, None] - y[None, :]
- n_greater = np.sum(diffs > 0)
- n_less = np.sum(diffs < 0)
- return float((n_greater - n_less) / (nx * ny))
- def permutation_pvalue(x, y, n_perm=10000, seed=42):
- """Two-sided permutation test for mean difference"""
- rng = np.random.default_rng(seed)
- x = np.array(x.dropna())
- y = np.array(y.dropna())
- if len(x) == 0 or len(y) == 0:
- return np.nan
- obs_diff = np.abs(np.mean(x) - np.mean(y))
- combined = np.concatenate([x, y])
- nx = len(x)
- count = 0
- for _ in range(n_perm):
- rng.shuffle(combined)
- x_perm, y_perm = combined[:nx], combined[nx:]
- diff = np.abs(np.mean(x_perm) - np.mean(y_perm))
- if diff >= obs_diff:
- count += 1
- return count / n_perm
- def chunk_list(lst, n):
- """Split list into chunks of size n."""
- for i in range(0, len(lst), n):
- yield lst[i:i + n]
- def plot_gap_by_diagnosis_clean_wrap(
- df,
- gap_col,
- diagnosis_list,
- thresholds=(0.1, 0.5, 1.0, 1.5),
- per_line=3,
- title_fontsize=8,
- n_perm=10000
- ):
- # Build original data by group
- group_data_orig = {}
- for diag in diagnosis_list:
- sub = df[df["clinical_diagnosis"] == diag][[gap_col]].copy()
- sub["Origen"] = diag
- group_data_orig[diag] = sub
- # Unique pairs without repetition
- all_pairs = [(diagnosis_list[i], diagnosis_list[j])
- for i in range(len(diagnosis_list))
- for j in range(i+1, len(diagnosis_list))]
- cn_pairs = [(a, b) for (a, b) in all_pairs if a == "CN"]
- other_pairs = [p for p in all_pairs if p not in cn_pairs]
- results_table = []
- fig, axes = plt.subplots(2, 2, figsize=(7.0, 8.0), sharey=True)
- axes = axes.flatten()
- for ax, iqr_k in zip(axes, thresholds):
- group_data_clean = {
- diag: remove_outliers_iqr(group_data_orig[diag], gap_col, iqr_k)
- for diag in diagnosis_list
- }
- cn_lines = []
- for a, b in cn_pairs:
- x = group_data_clean[a][gap_col]
- y = group_data_clean[b][gap_col]
- dval = cliffs_delta(x, y)
- pval = permutation_pvalue(x, y, n_perm=n_perm)
- cn_lines.append(f"{a}-{b}: {dval:.3f}")
- results_table.append([iqr_k, a, b, dval, pval])
- other_lines = []
- for a, b in other_pairs:
- x = group_data_clean[a][gap_col]
- y = group_data_clean[b][gap_col]
- dval = cliffs_delta(x, y)
- pval = permutation_pvalue(x, y, n_perm=n_perm)
- other_lines.append(f"{a}-{b}: {dval:.3f}")
- results_table.append([iqr_k, a, b, dval, pval])
- cn_wrapped = [" | ".join(chunk) for chunk in chunk_list(cn_lines, per_line)]
- other_wrapped = [" | ".join(chunk) for chunk in chunk_list(other_lines, per_line)]
- title_parts = [f"IQR={iqr_k}"] + cn_wrapped + other_wrapped
- ax.set_title("\n".join(title_parts), fontsize=title_fontsize)
- combined = pd.concat([group_data_clean[d] for d in diagnosis_list], ignore_index=True)
- sns.boxplot(data=combined, x="Origen", y=gap_col, order=diagnosis_list, ax=ax)
- ax.axhline(0, color='gray', linestyle='--', linewidth=1)
- ax.set_xlabel("")
- ax.set_ylabel(gap_col)
- plt.tight_layout()
- results_df = pd.DataFrame(results_table, columns=["IQR_k", "Group1", "Group2", "CliffsDelta", "p_value"])
- return fig, axes, results_df
- # %%
- import numpy as np
- import pandas as pd
- from sklearn.model_selection import KFold, GridSearchCV
- from sklearn.pipeline import Pipeline
- from sklearn.preprocessing import MinMaxScaler
- from sklearn.ensemble import HistGradientBoostingRegressor
- from sklearn.metrics import r2_score
- from sklearn.inspection import permutation_importance
- from scipy.stats import linregress
- import shap
- def run_nested_hgb(
- df_data,
- selected_hgb,
- n_splits_outer = 10,
- n_splits_inner = 5,
- random_state = 42,
- scaler_range=(0.05, 0.95),
- param_grid=None,
- n_perm_repeats: int = 30,
- shap_check_additivity: bool = False,
- verbose: int = 2
- ):
- if param_grid is None:
- param_grid = {
- "model__max_iter": [300, 400, 500, 600],
- "model__max_depth": [3, 5, 7],
- "model__learning_rate": [0.01, 0.05, 0.1],
- }
- if isinstance(selected_hgb, str):
- selected_hgb = [selected_hgb]
- selected_hgb = list(selected_hgb)
- y = df_data["demo_age"]
- X_selected = df_data[selected_hgb]
- kf_outer = KFold(n_splits=n_splits_outer, shuffle=True, random_state=random_state)
- r2_scores = []
- y_true_all, y_pred_all = [], []
- results_labels_df = pd.DataFrame(columns=[
- 'y_labels', 'y_pred', 'y_pred_M1', 'y_pred_M2', 'y_pred_M3',
- 'GAP', 'GAP_corrected_M1', 'GAP_corrected_M2', 'GAP_corrected_M3', 'ID'
- ])
- shap_values_sum = pd.Series(0.0, index=X_selected.columns)
- perm_values_sum = pd.Series(0.0, index=X_selected.columns)
- best_params_by_fold = []
- for fold, (train_idx, test_idx) in enumerate(kf_outer.split(X_selected), start=1):
- print(f" Fold {fold} (Nested CV)")
- X_train, X_test = X_selected.iloc[train_idx], X_selected.iloc[test_idx]
- y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
- pipeline = Pipeline([
- ("scaler", MinMaxScaler(feature_range=scaler_range)),
- ("model", HistGradientBoostingRegressor(random_state=random_state))
- ])
- grid_search = GridSearchCV(
- estimator=pipeline,
- param_grid=param_grid,
- scoring="r2",
- cv=n_splits_inner,
- n_jobs=-1,
- verbose=verbose
- )
- grid_search.fit(X_train, y_train)
- best_model = grid_search.best_estimator_
- best_params_by_fold.append(grid_search.best_params_)
- y_pred = best_model.predict(X_test)
- r2 = r2_score(y_test, y_pred)
- r2_scores.append(r2)
- print(f" R² fold {fold}: {r2:.4f} (best params: {grid_search.best_params_})")
- y_true_all.extend(y_test.tolist())
- y_pred_all.extend(y_pred.tolist())
- gap_test = y_pred - y_test
- gap_train_all = best_model.predict(X_train) - y_train
- train_ids = X_train.index
- diag_train = df_data.loc[train_ids, 'clinical_diagnosis']
- cn_mask = (diag_train == 'CN').values
- if cn_mask.sum() >= 2:
- slope, intercept, _, _, _ = linregress(y_train.values[cn_mask], gap_train_all.values[cn_mask])
- else:
- slope, intercept = 0.0, 0.0
- corrected_gap_M1 = gap_test - (slope * y_test + intercept)
- y_pred_M1 = y_test + corrected_gap_M1
- y_train_pred = best_model.predict(X_train)
- if cn_mask.sum() >= 2:
- slope_pred, intercept_pred, _, _, _ = linregress(y_train.values[cn_mask], y_train_pred[cn_mask])
- if slope_pred == 0:
- slope_pred = 1.0
- else:
- slope_pred, intercept_pred = 1.0, 0.0
- y_pred_M2 = (y_pred - intercept_pred) / slope_pred
- corrected_gap_M2 = y_pred_M2 - y_test
- y_pred_M3 = (y_pred - intercept_pred) / slope_pred
- corrected_gap_M3 = y_pred_M3 - y_test
- explainer = shap.Explainer(best_model.named_steps['model'], X_train)
- shap_values = explainer(X_test, check_additivity=shap_check_additivity)
- shap_values_mean = np.abs(shap_values.values).mean(axis=0)
- shap_values_sum += pd.Series(shap_values_mean, index=X_selected.columns)
- perm_importance = permutation_importance(
- best_model, X_test, y_test,
- n_repeats=n_perm_repeats,
- random_state=random_state,
- n_jobs=-1
- )
- perm_values_sum += pd.Series(perm_importance.importances_mean, index=X_selected.columns)
- result = np.column_stack((
- y_test, y_pred, y_pred_M1, y_pred_M2, y_pred_M3,
- gap_test, corrected_gap_M1, corrected_gap_M2, corrected_gap_M3
- ))
- temp_df = pd.DataFrame(result, columns=[
- 'y_labels', 'y_pred', 'y_pred_M1', 'y_pred_M2', 'y_pred_M3',
- 'GAP', 'GAP_corrected_M1', 'GAP_corrected_M2', 'GAP_corrected_M3'
- ])
- temp_df['ID'] = X_test.index
- results_labels_df = pd.concat([results_labels_df, temp_df], ignore_index=True)
- r2_mean = float(np.mean(r2_scores))
- r2_std = float(np.std(r2_scores))
- r2_global = float(r2_score(y_true_all, y_pred_all))
- print("\n R² promedio:", r2_mean, r2_std)
- print(" R² global:", r2_global)
- shap_importance_avg = (shap_values_sum / kf_outer.get_n_splits()).sort_values(ascending=False)
- perm_importance_avg = (perm_values_sum / kf_outer.get_n_splits()).sort_values(ascending=False)
- results_labels_df = results_labels_df.set_index('ID').sort_index()
- df_final = pd.concat(
- [df_data[['demo_age', 'clinical_diagnosis'] + selected_hgb], results_labels_df],
- axis=1
- )
- out = {
- "selected_hgb": selected_hgb,
- "df_final": df_final,
- "results_labels_df": results_labels_df,
- "r2_scores": r2_scores,
- "r2_mean": r2_mean,
- "r2_std": r2_std,
- "r2_global": r2_global,
- "y_true_all": y_true_all,
- "y_pred_all": y_pred_all,
- "best_params_by_fold": best_params_by_fold,
- "shap_importance_avg": shap_importance_avg,
- "perm_importance_avg": perm_importance_avg,
- }
- return out
- # %% [markdown]
- # ## Load Data
- # %%
- df_data = pd.read_excel('../Data/augmented_data.xlsx')
- # %%
- selected_hgb = ['concreteness',
- 'granularity_extraction', 'psycholinguistic_objective',
- 'pitch_analysis', 'sentiment_analysis', 'talking_intervals',
- 'verbosity']
- # %% [markdown]
- # ## Regression
- # %%
- results = run_nested_hgb(df_data, selected_hgb, n_splits_outer = 10, n_splits_inner = 5)
- # %%
regression_main.ipynb at commit d75d5c3, no license · at the source
Overview
and 32 other authors
Marcelo Adrián Maito1,8, Guido Rocatti8, Maria Eugenia Godoy1,8,18, Joaquin Migeot1,18, Paulina Orellana1, Ariel Caviedes1, Martin Bruno26,28, Leonel Takada29, Andrea Slachevsky30,31,32,33, Maria I Behrens33,34,35,36, Bárbara Bruna34, David Aguillon37, Lina Zapata10,38,39, Jose Alberto Avila-Funes40, Nilton Custodio41, Bruce Miller10,42, Maria Luisa Gorno-Tempini10,43, Stefanie Pina Escudero10,44, Pablo Reyes45,46, Kun Hu47,48, Maira Okada de Oliveira10,49, Carlos Coronel-Oliveros1,43,50, Josephine Cruzat1, Juan Felipe Cardona51, Michael Corley52,53, Irene B Meier54, Vaibhav A Narayan54,55, Enzo Tagliazucchi1,56, Sandra Baez18,57, Claudia Duran-Aniotz1, Adolfo M García8,10,58, Agustin Ibanez1,8,43,59,6060 affiliations
- Latin American Brain Health Institute (BrainLat), Universidad Adolfo Ibañez, Santiago de Chile, Chile
- Laboratorio de Bases Biológicas del Comportamiento, Facultad de Ciencias del Comportamiento, Universidad de La Sabana, Chía, Colombia
- Pontificia Universidad Javeriana (PhD Program in Neuroscience), Bogotá, San Ignacio, Colombia
- Center of Memory and Cognition Intellectus, Hospital Universitario San Ignacio Bogotá, San Ignacio, Colombia
- Universidad Nacional de Colombia, Bogotá, Colombia
- Fundación Santa Fe de Bogotá, Departamento de Salud Mental, Bogotá, Colombia
- Universidad de los Andes, Bogotá, Colombia
- Cognitive Neuroscience Center, Departamento de Ciencias de la Vida y del Comportamiento, Universidad de San Andrés, Buenos Aires, Argentina
- Harvard Medical School, Boston, MA, USA
- Global Brain Health Institute (GBHI), University of California, San Francisco, CA, USA
- Escuela de Fonoaudiología, Facultad de Ciencias de la Rehabilitación y Calidad de Vida, Universidad San Sebastián, Santiago, Chile
- Grupo de Bioingeniería, Decanato de Investigación, Universidad Nacional Experimental del Táchira, San Cristóbal 5001, Venezuela
- Advanced Center for Electrical and Electronic Engineering, Universidad Técnica Federico Santa María, Valparaíso 2390123, Chile
- Basque Center on Cognition, Brain and Language (BCBL), San Sebastian, Spain
- Ikerbasque, Basque Foundation for Science, Bilbao, Spain
- Facultad de Ingeniería, Universidad de Concepción, Concepción, Chile
- Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET), Centro Atómico Bariloche, San Carlos de Bariloche, Río Negro, Argentina
- Global Brain Health Institute (GBHI), Trinity College Dublin (TCD), Dublin, Ireland
- Center for Social and Cognitive Neuroscience (CSCN), School of Psychology, Universidad Adolfo Ibáñez, Santiago, Chile
- IRyS Group, Physical Education School, Pontificia Universidad Católica de Valparaíso, Valparaíso, Chile
- Centro Interdisciplinario de Neurociencia de Valparaíso, Valparaíso, Chile
- Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET), Buenos Aires, Argentina
- Universidad Nacional de Quilmes, Buenos Aires, Argentina
- Aarhus Universitetshospital, Aarhus, Denmark
- Universitat Pompeu Fabra, Barcelona, Spain
- Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET), Godoy Cruz, Buenos Aires, Argentina
- Facultad de Ingeniería, Universidad de Buenos Aires, Colón, Argentina
- Instituto de Ciencias Biomédicas (ICBM), Universidad Católica de Cuyo, San Juan, Argentina
- Hospital das Clinicas, University of Sao Paulo Medical School, Sao Paulo, Brazil
- Centro Gerociencias, Salud Mental y Metabolismo (GERO), Santiago, Chile
- Laboratorio de Neuropsicología y Neurociencias Clínicas (LANNEC), Núcleo Interdisciplinario de Fisiología, Biofísica y Fisiopatología-ICBM, Departamento de Ciencias Neurológicas Oriente y Neurociencias, Facultad de Medicina, Universidad de Chile, Avenida Salvador 486, Providencia, Santiago, Chile
- Centro de Memoria y Neuropsiquiatría (CMYN), Servicio de Neurología, Hospital del Salvador y Facultad de Medicina, Universidad de Chile, Santiago, Chile
- Departamento de Neurología y Psiquiatría, Clínica Alemana-Universidad del Desarrollo, Santiago, Chile
- Centro de Investigación Clínica Avanzada (CICA), Hospital Clínico Universidad de Chile, Santiago, Chile
- Departamento de Neurología y Neurocirugía, Hospital Clínico Universidad de Chile, Santiago, Chile
- Departamento de Neurociencia, Facultad de Medicina, Universidad de Chile, Santiago, Chile
- Grupo de Neurociencias de Antioquia, Facultad de Medicina, Universidad de Antioquia, Medellín, Colombia
- Fundacion Valle del Lili, Cali, Colombia
- Universidad Icesi, Cali, Colombia
- Dirección de Ensenanza, Instituto Nacional de Ciencias Medicas y Nutricion, Salvador Zubirán, DF, Mexico
- Unidad de Investigación de Deterioro Cognitivo y Prevención de Demencia, Instituto Peruano de Neurociencias, Lince, Peru
- Edward and Pearl Fein Memory and Aging Center, University of California, San Francisco (UCSF), San Francisco, USA
- Trinity College Dublin, The University of Dublin, Dublin, Ireland
- Edward and Pearl Fein Memory and Aging Center, Department of Neurology, Weill Institute for Neurosciences, University of California, San Francisco, CA, USA
- Departamento de Psiquiatría y Salud Mental, Facultad de Medicina, Pontificia Universidad Javeriana, Bogotá, Colombia
- Oficina de Investigaciones, Hospital Universitario San Ignacio, Bogotá, Colombia
- Department of Anesthesia, Critical Care and Pain Medicine, Massachusetts General Hospital, Harvard Medical School, Massachusetts, USA
- Division of Sleep Medicine, Harvard Medical School, Massachusetts, USA
- Department of Neurology, Hospital das Clinicas, University of Sao Paulo School of Medicine, Sao Paulo, Brazil
- Departamento de Biología, Facultad de Ciencias, Universidad de Chile, Santiago, Chile
- Department of Developmental Sciences, Cognition and Neuroscience, Faculty of Psychology, Universidad del Valle, Cali, Colombia
- Rose Stein Institute for Research on Aging and Center for Healthy Aging, UCSD, La Jolla (San Diego), USA
- University of California San Diego Department of Medicine, Division of Geriatrics, Gerontology, and Palliative Care, UCSD, La Jolla (San Diego), USA
- Davos Alzheimer’s Collaborative, Wayne PA, USA
- Mental Health Goals Program, Office of Life Sciences UK Visiting Professor, Kings College, London, UK
- University of Buenos Aires, Buenos Aires, Argentina
- Departamento de Psicología, Universidad de los Andes, Bogotá, Colombia
- Departamento de Lingüística y Literatura, Facultad de Humanidades, Universidad de Santiago de Chile, Santiago, Chile
- Department of Biophysics, School of Medicine, Istanbul Medipol University, 34815 Istanbul, Türkiye
- Barcelonaβeta Brain Research Center (BBRC), Pasqual Maragall Foundation, 08005 Barcelona, Spain
Abstract
Biological aging clocks offer estimations of aging and dementia, yet scalability is limited. We introduce a large-scale, cross-national speech clock derived from 2928 individuals across five Latin American countries, spanning healthy controls (HCs), mild cognitive impairment (MCI), Alzheimer’s disease (AD), and non-language/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 10 matches between paragraphs and lines of code.
Zenodo 20186949
Availability: 1 check, the latest on 3 October 2026: the link answers (HTTP 200)
- 3 October 2026: the link answers (HTTP 200)
13 files
- R2R-Fig-3-analysis-check
point.ipynb , Jupyter, 1,089 lines - R2R-Fig-3-analysis.ipynb
, Jupyter, 1,089 lines - R2R-Fig3-prediction-powe
r-checkpoint.ipynb , Jupyter, 271 lines - R2R-Fig3-prediction-powe
r.ipynb , Jupyter, 271 lines - R2R-Reviewer-1-powerOfLi
nguisticFeat-checkpoint. , Jupyter, 1,581 linesipynb - Stats-checkpoint.ipynb, Jupyter, 75 lines
- Stats.ipynb, Jupyter, 75 lines
- linear_regressions-check
point.ipynb , Jupyter, 1,569 lines - linear_regressions.ipynb
, Jupyter, 1,569 lines - loco_main-checkpoint.ipy
nb , Jupyter, 493 lines - loco_main.ipynb, Jupyter, 493 lines
- regression_main-checkpoi
nt.ipynb , Jupyter, 476 lines - regression_main.ipynb, Jupyter, 476 lines
euroladbrainlat/Speech-age-gap
d75d5c3f1a713c9c5a501e900be7af33fb38b0bf, 18 May 2026Availability: 1 check, the latest on 3 October 2026: the link answers
- 3 October 2026: the link answers
7 files
- Code/
R2R/ , Jupyter, 1,089 lines, 1 matchR2R-Fig-3-analysis.ipynb - Code/
R2R/ , Jupyter, 271 lines, 2 matchesR2R-Fig3-prediction-powe r.ipynb - Code/
Stats.ipynb , Jupyter, 75 lines - Code/
linear_regressions.ipynb , Jupyter, 1,569 lines, 2 matches - Code/
loco_main.ipynb , Jupyter, 493 lines, 2 matches - Code/
regression_main.ipynb , Jupyter, 476 lines, 3 matches - README.md, Text, 1 line
The paper's code and data availability statement is in the Data section.
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:
- 2 repositories 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;
- 10 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, code, and materials availability
All data and code needed to evaluate and reproduce the results in the paper are present in the paper and/
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, 3 October 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 52 authors, 11 MeSH terms, 13 funders, 65 references.
Cite
This paper
Hernandez, H., Pedraza, L. K., Santamaria-Garcia, H., Moguilner, S., Legaz, A., Prado, P., Cuadros, J., Amoruso, L., Gonzalez, L., Dellavale, D., Espinoza–Puelles, J. P., Espinosa, J. P., Jarne, C., Mattiussi, F., Caccia, M., Welford, A. S., Pelella, N., Inchauspe, J., Ferrante, F. J., . . . Ibanez, A. (2026). Speech clocks decode dementia phenotypes, social exposome, and biological aging. Science advances, 12(40), eaef9864. https://
BibTeX
@article{hernandez2026sp
author = {Hernandez, Hernan and Pedraza, Lizeth Katherine and Santamaria-Garcia, Hernando and Moguilner, Sebastian and Legaz, Agustina and Prado, Pavel and Cuadros, Jhosmary and Amoruso, Lucía and Gonzalez, Liset and Dellavale, Damián and Espinoza–Puelles, Juan Pablo and Espinosa, Javier Palma and Jarne, Cecilia and Mattiussi, Fabio and Caccia, Matías and Welford, Alejandro Sosa and Pelella, Nicolás and Inchauspe, Jeremías and Ferrante, Franco J and Pérez, Gonzalo and Maito, Marcelo Adrián and Rocatti, Guido and Godoy, Maria Eugenia and Migeot, Joaquin and Orellana, Paulina and Caviedes, Ariel and Bruno, Martin and Takada, Leonel and Slachevsky, Andrea and Behrens, Maria I and Bruna, Bárbara and Aguillon, David and Zapata, Lina and Avila-Funes, Jose Alberto and Custodio, Nilton and Miller, Bruce and Gorno-Tempini, Maria Luisa and Escudero, Stefanie Pina and Reyes, Pablo and Hu, Kun and de Oliveira, Maira Okada and Coronel-Oliveros, Carlos and Cruzat, Josephine and Cardona, Juan Felipe and Corley, Michael and Meier, Irene B and Narayan, Vaibhav A and Tagliazucchi, Enzo and Baez, Sandra and Duran-Aniotz, Claudia and García, Adolfo M and Ibanez, Agustin},
title = {{Speech clocks decode dementia phenotypes, social exposome, and biological aging}},
journal = {Science advances},
year = {2026},
month = sep,
volume = {12},
number = {40},
pages = {eaef9864},
publisher = {American Association for the Advancement of Science},
issn = {2375-2548},
doi = {10.1126/
url = {https://
pmid = {42814823},
pmcid = {PMC13626050}
}
RIS
TY - JOUR
AU - Hernandez, Hernan
AU - Pedraza, Lizeth Katherine
AU - Santamaria-Garcia, Hernando
AU - Moguilner, Sebastian
AU - Legaz, Agustina
AU - Prado, Pavel
AU - Cuadros, Jhosmary
AU - Amoruso, Lucía
AU - Gonzalez, Liset
AU - Dellavale, Damián
AU - Espinoza–Puelles, Juan Pablo
AU - Espinosa, Javier Palma
AU - Jarne, Cecilia
AU - Mattiussi, Fabio
AU - Caccia, Matías
AU - Welford, Alejandro Sosa
AU - Pelella, Nicolás
AU - Inchauspe, Jeremías
AU - Ferrante, Franco J
AU - Pérez, Gonzalo
AU - Maito, Marcelo Adrián
AU - Rocatti, Guido
AU - Godoy, Maria Eugenia
AU - Migeot, Joaquin
AU - Orellana, Paulina
AU - Caviedes, Ariel
AU - Bruno, Martin
AU - Takada, Leonel
AU - Slachevsky, Andrea
AU - Behrens, Maria I
AU - Bruna, Bárbara
AU - Aguillon, David
AU - Zapata, Lina
AU - Avila-Funes, Jose Alberto
AU - Custodio, Nilton
AU - Miller, Bruce
AU - Gorno-Tempini, Maria Luisa
AU - Escudero, Stefanie Pina
AU - Reyes, Pablo
AU - Hu, Kun
AU - de Oliveira, Maira Okada
AU - Coronel-Oliveros, Carlos
AU - Cruzat, Josephine
AU - Cardona, Juan Felipe
AU - Corley, Michael
AU - Meier, Irene B
AU - Narayan, Vaibhav A
AU - Tagliazucchi, Enzo
AU - Baez, Sandra
AU - Duran-Aniotz, Claudia
AU - García, Adolfo M
AU - Ibanez, Agustin
TI - Speech clocks decode dementia phenotypes, social exposome, and biological aging
T2 - Science advances
J2 - Sci Adv
PY - 2026
DA - 2026/
VL - 12
IS - 40
SP - eaef9864
SN - 2375-2548
PB - American Association for the Advancement of Science
DO - 10.1126/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1126/
"type": "article-journal",
"title": "Speech clocks decode dementia phenotypes, social exposome, and biological aging",
"container-title": "Science advances",
"author": [
{
"family": "Hernandez",
"given": "Hernan"
},
{
"family": "Pedraza",
"given": "Lizeth Katherine"
},
{
"family": "Santamaria-Garcia",
"given": "Hernando"
},
{
"family": "Moguilner",
"given": "Sebastian"
},
{
"family": "Legaz",
"given": "Agustina"
},
{
"family": "Prado",
"given": "Pavel"
},
{
"family": "Cuadros",
"given": "Jhosmary"
},
{
"family": "Amoruso",
"given": "Lucía"
},
{
"family": "Gonzalez",
"given": "Liset"
},
{
"family": "Dellavale",
"given": "Damián"
},
{
"family": "Espinoza–Puelles",
"given": "Juan Pablo"
},
{
"family": "Espinosa",
"given": "Javier Palma"
},
{
"family": "Jarne",
"given": "Cecilia"
},
{
"family": "Mattiussi",
"given": "Fabio"
},
{
"family": "Caccia",
"given": "Matías"
},
{
"family": "Welford",
"given": "Alejandro Sosa"
},
{
"family": "Pelella",
"given": "Nicolás"
},
{
"family": "Inchauspe",
"given": "Jeremías"
},
{
"family": "Ferrante",
"given": "Franco J"
},
{
"family": "Pérez",
"given": "Gonzalo"
},
{
"family": "Maito",
"given": "Marcelo Adrián"
},
{
"family": "Rocatti",
"given": "Guido"
},
{
"family": "Godoy",
"given": "Maria Eugenia"
},
{
"family": "Migeot",
"given": "Joaquin"
},
{
"family": "Orellana",
"given": "Paulina"
},
{
"family": "Caviedes",
"given": "Ariel"
},
{
"family": "Bruno",
"given": "Martin"
},
{
"family": "Takada",
"given": "Leonel"
},
{
"family": "Slachevsky",
"given": "Andrea"
},
{
"family": "Behrens",
"given": "Maria I"
},
{
"family": "Bruna",
"given": "Bárbara"
},
{
"family": "Aguillon",
"given": "David"
},
{
"family": "Zapata",
"given": "Lina"
},
{
"family": "Avila-Funes",
"given": "Jose Alberto"
},
{
"family": "Custodio",
"given": "Nilton"
},
{
"family": "Miller",
"given": "Bruce"
},
{
"family": "Gorno-Tempini",
"given": "Maria Luisa"
},
{
"family": "Escudero",
"given": "Stefanie Pina"
},
{
"family": "Reyes",
"given": "Pablo"
},
{
"family": "Hu",
"given": "Kun"
},
{
"family": "de Oliveira",
"given": "Maira Okada"
},
{
"family": "Coronel-Oliveros",
"given": "Carlos"
},
{
"family": "Cruzat",
"given": "Josephine"
},
{
"family": "Cardona",
"given": "Juan Felipe"
},
{
"family": "Corley",
"given": "Michael"
},
{
"family": "Meier",
"given": "Irene B"
},
{
"family": "Narayan",
"given": "Vaibhav A"
},
{
"family": "Tagliazucchi",
"given": "Enzo"
},
{
"family": "Baez",
"given": "Sandra"
},
{
"family": "Duran-Aniotz",
"given": "Claudia"
},
{
"family": "García",
"given": "Adolfo M"
},
{
"family": "Ibanez",
"given": "Agustin"
}
],
"container-title-short":
"volume": "12",
"issue": "40",
"page": "eaef9864",
"DOI": "10.1126/
"PMID": "42814823",
"PMCID": "PMC13626050",
"ISSN": "2375-2548",
"publisher": "American Association for the Advancement of Science",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
30
]
]
}
}
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-024-03209-x [code]
- Brain clocks capture diversity and disparities in aging and dementia across geographically diverse populations.Journal: Nature medicineIn common: Alzheimer's / dementia, 10 references, 14 authors
- [2] doi:10.1038/s41467-025-63277-6 [code]
- Social exposome and brain health outcomes of dementia across Latin America.Journal: Nature communicationsIn common: Alzheimer's / dementia, 13 references, 9 authors
- [3] doi:10.1002/alz.14085 [code]
- Educational disparities in brain health and dementia across Latin America and the United States.Journal: Alzheimer's & dementia : the journal of the Alzheimer's AssociationIn common: Alzheimer's / dementia, 10 references, 9 authors
- [4] doi:10.1016/j.lana.2022.100387
- Classification of Alzheimer's disease and frontotemporal dementia using routine clinical and cognitive measures across multicentric underrepresented samples: A cross sectional observational study.Journal: Lancet regional health. AmericasIn common: Alzheimer's / dementia, 3 references, 10 authors
- [5] doi:10.1093/cvr/cvaf185
- Cardiovascular risk factors and the allostatic interoceptive network in dementia.Journal: Cardiovascular researchIn common: Alzheimer's / dementia, 7 references, 8 authors
- [6] doi:10.1038/s41597-023-02806-8 [code]
- The BrainLat project, a multimodal neuroimaging dataset of neurodegeneration from underrepresented backgrounds.Journal: Scientific dataIn common: SciPy, NumPy, Alzheimer's / dementia, 7 references, 7 authors
- [7] doi:10.1016/j.eclinm.2025.103187
- Qualitative and quantitative educational disparities and brain signatures in healthy aging and dementia across global settings.Journal: EClinicalMedicineIn common: Alzheimer's / dementia, 4 references, 7 authors
- [8] doi:10.1038/s41467-025-64173-9 [code]
- Creative experiences and brain clocks.Journal: Nature communicationsIn common: statsmodels, seaborn, scikit-learn, 4 other tools, cognitive, 7 references, 4 authors
- [9] doi:10.1186/s13195-025-01832-5
- White matter hyperintensities and their impact in brain structure and function in alzheimer's disease and behavioral variant frontotemporal dementia across Latin America and the United States: a cross-sectional study.Journal: Alzheimer's research & therapyIn common: Alzheimer's / dementia, 7 references, 5 authors
- [10] doi:10.1002/alz.71232
- Neural embedding of frailty in cognitively unimpaired aging and dementia across Latin America.Journal: Alzheimer's & dementia : the journal of the Alzheimer's AssociationIn common: Alzheimer's / dementia, 11 references, 4 authors
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: 2 repositories of the authors' code, each at its verified commit and with its license, 19 scripts, and 10 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:fd27d43deaee19e1…
Add the badge to the code's README
If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.
Markdown
<!-- oscr-badge:start -->
[](https://openscicode.org/badge/doi/10.1126/sciadv.aef9864)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1126/sciadv.aef9864.svg
:target: https://openscicode.org/badge/doi/10.1126/sciadv.aef9864
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1126/sciadv.aef9864"><img src="https://openscicode.org/badge/doi/10.1126/sciadv.aef9864.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".
If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge 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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.
Report a mismatch between the code and the paper · Report a code error (signed in)
Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.
Report a reproduction failure (signed in)
Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
