OSCR

Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER.

Code ↔ Paper

25 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 25 matches
  1. [1] § 3. Materials and Methods › 3.2. Feature Extraction ↔ experiments/gen_latex_tables.py, lines 286–309 · score 0.99 · Lempel Ziv complexity, Higuchi fractal dimension, median threshold binarization, Hilbert phase, Hann window, Hjorth parameters
  2. [2] § 3. Materials and Methods › 3.2. Feature Extraction ↔ experiments/featurelib.py, lines 1–25 · score 0.98 · Lempel Ziv complexity, Higuchi fractal dimension, median threshold binarization, Hann window, log asymmetries, permutation entropy
  3. [3] § 3. Materials and Methods › 3.3. Label Binarization and Evaluation Protocols ↔ experiments/run_riemann.py, lines 1–34 · score 0.93 · Riemannian tangent space, trial band limited, domain adaptation, Euclidean Alignment, GroupKFold, covariance
  4. [4] § 4. Results › 4.2. Participant-Independent Performance ↔ experiments/gen_latex_tables.py, lines 463–492 · score 0.88 · soft voting ensembles, Riemannian tangent space, Euclidean Alignment, feature selection, ceiling, nested
  5. [5] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/gen_latex_tables.py, lines 85–105 · score 0.84 · class recall, validation split, Decision thresholds, PR AUC, confidence intervals, ROC AUC
  6. [6] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/gen_latex_tables.py, lines 223–239 · score 0.79 · pairwise Jaccard overlap, Feature selection stability, independent folds, XGBoost, Kuncheva
  7. [7] § 4. Results › 4.5. Personalized Models and Multimodal Fusion ↔ experiments/gen_latex_tables.py, lines 494–520 · score 0.79 · peripheral autonomic, interpretable peripheral, EEG yields, fused, weak, modality
  8. [8] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/run_stability_importance.py, lines 1–32 · score 0.78 · pairwise Jaccard, Feature selection stability, permutation importance, XGBoost, Kuncheva, held
  9. [9] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/run_final_opt.py, lines 1–33 · score 0.76 · soft voting ensemble, mutual information, feature selection, inner, bootstrapping, AUC
  10. [10] § 4. Results › 4.6. Effect Sizes, Ablations, and Feature Importance ↔ experiments/gen_latex_tables.py, lines 245–259 · score 0.75 · unreliable indicator, predictor relevance, permutation importance, XGBoost, Spearman, correlation
  11. [11] § 4. Results › 4.3. A Participant-Specific Signature in the Feature Space ↔ experiments/gen_latex_tables.py, lines 311–356 · score 0.75 · emotion decoding, variance decomposition, emotional state, random forest, qEEG, ratio
  12. [12] § 4. Results › 4.6. Effect Sizes, Ablations, and Feature Importance ↔ experiments/gen_latex_tables.py, lines 286–309 · score 0.74 · Lempel Ziv complexity, Frontal alpha asymmetry, permutation entropy, gamma, beta, theta
  13. [13] § 4. Results › 4.6. Effect Sizes, Ablations, and Feature Importance ↔ experiments/run_stability_importance.py, lines 93–140 · score 0.69 · permutation importance, model agnostic, XGBoost, tree, Spearman, held
  14. [14] § 4. Results › 4.6. Effect Sizes, Ablations, and Feature Importance ↔ experiments/featurelib.py, lines 1–25 · score 0.67 · Lempel Ziv complexity, permutation entropy, gamma, beta, theta, asymmetry
  15. [15] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/run_stats.py, lines 1–30 · score 0.67 · Benjamini Hochberg, Kruskal Wallis, Bonferroni, Wilcoxon, bootstrap, Model
  16. [16] § 4. Results › 4.5. Personalized Models and Multimodal Fusion ↔ experiments/run_multimodal.py, lines 1–22 · score 0.66 · peripheral autonomic, Adding interpretable peripheral, fused, cortical, EMG, respiration
  17. [17] § 4. Results › 4.2. Participant-Independent Performance ↔ experiments/run_riemann.py, lines 1–34 · score 0.64 · Riemannian tangent space, Euclidean Alignment, compact, vector, channel, protocol
  18. [18] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/run_stats.py, lines 1–30 · score 0.64 · Wilcoxon signed rank, Kruskal Wallis, ANOVA, bootstrap, class, DEAP
  19. [19] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/gen_latex_tables.py, lines 178–215 · score 0.63 · Wilcoxon signed rank, Kruskal Wallis, inflation, bootstrap
  20. [20] § 3. Materials and Methods › 3.3. Label Binarization and Evaluation Protocols ↔ experiments/gen_latex_tables.py, lines 463–492 · score 0.63 · Riemannian tangent space, Euclidean Alignment, classifier, model
  21. [21] § 4. Results › 4.1. Effect of the Evaluation Protocol ↔ experiments/run_revision_stats.py, lines 1–35 · score 0.63 · near duplicate, participant overlap, training fold, leakage, split, channels
  22. [22] § 4. Results › 4.6. Effect Sizes, Ablations, and Feature Importance ↔ experiments/gen_latex_tables.py, lines 124–140 · score 0.61 · feature family dominates, Functional connectivity, measurable, Ablations, channel, valence
  23. [23] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/gen_latex_tables.py, lines 85–105 · score 0.56 · bootstrap confidence interval, threshold tuning, ROC AUC, Classifiers, modeling
  24. [24] § 4. Results › 4.1. Effect of the Evaluation Protocol ↔ experiments/gen_latex_tables.py, lines 42–70 · score 0.55 · class imbalance, GroupKFold, XGBoost, binarization, median, AUCs
  25. [25] § 3. Materials and Methods › 3.4. Classifiers and Statistical Analysis ↔ experiments/run_personalization.py, lines 131–166 · score 0.51 · logistic regression, class weights, ROC AUC, Wilcoxon, Classifiers

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 · 520 lines · 23 KB · no license · 13 matches

  1. """Emit English LaTeX result tables (booktabs) from computed JSONs/CSVs into
  2. overelaf-paper/revised/tables.tex. Every number is pulled from results/ so the
  3. manuscript cannot drift from the experiments."""
  4. from __future__ import annotations
  5. import json
  6. from pathlib import Path
  7. import numpy as np
  8. import pandas as pd
  9. HERE = Path(__file__).resolve().parent
  10. R = HERE / "results"
  11. OUT = HERE.parent / "overelaf-paper/revised"
  12. OUT.mkdir(parents=True, exist_ok=True)
  13. def load(n): return json.load(open(R / n))
  14. def ci(d): return f"{d['value']:.3f} [{d['ci'][0]:.3f}, {d['ci'][1]:.3f}]"
  15. blocks = []
  16. # ---- Table: protocol / leakage ----
  17. ce = load("core_eval.json")["leakage_demo"]
  18. t = r"""\begin{table}[H]
  19. \caption{Effect of the evaluation protocol on apparent performance. The same
  20. XGBoost model and 6-channel feature set are evaluated three ways; only the data
  21. partition changes. Window-level pooling allows overlapping windows from the same
  22. subject into both train and test, inflating AUC by roughly 0.20.\label{tab:protocol}}
  23. \centering
  24. \begin{tabular}{lcc}
  25. \toprule
  26. \textbf{Evaluation protocol} & \textbf{Valence AUC} & \textbf{Arousal AUC} \\
  27. \midrule
  28. Window-level, pooled (random $k$-fold) & %.3f & %.3f \\
  29. Window-level, subject-grouped & %.3f & %.3f \\
  30. Trial-level, subject-grouped + subject-norm & %.3f & %.3f \\
  31. \bottomrule
  32. \end{tabular}
  33. \end{table}""" % (
  34. ce["valence"]["window_pooled_leaky_auc"][0], ce["arousal"]["window_pooled_leaky_auc"][0],
  35. ce["valence"]["window_grouped_auc"][0], ce["arousal"]["window_grouped_auc"][0],
  36. ce["valence"]["trial_grouped_subjnorm_auc"], ce["arousal"]["trial_grouped_subjnorm_auc"])
  37. blocks.append(t)
  38. # ---- Table: labeling sweep ----
  39. sw = load("core_eval.json")["labeling_sweep"]
  40. names = {"fixed5": "Fixed threshold ($>5$)", "global_median": "Global median",
  41. "subject_median": "Per-subject median", "margin": "Margin ($|r-5|\\ge 2$)"}
  42. rows = []
  43. for s in ["fixed5", "global_median", "subject_median", "margin"]:
  44. v = sw["valence"][s]; a = sw["arousal"][s]
  45. rows.append(f"{names[s]} & {v['class_balance']:.2f} & {v['n_trials']} & "
  46. f"{v['models']['xgb']['auc']['value']:.3f} & "
  47. f"{a['class_balance']:.2f} & {a['n_trials']} & "
  48. f"{a['models']['xgb']['auc']['value']:.3f} \\\\")
  49. t = r"""\begin{table}[H]
  50. \caption{Sensitivity to the binarization scheme (XGBoost, subject-independent
  51. GroupKFold, subject-normalized). The fixed threshold of 5 produces severe class
  52. imbalance and near-chance AUC; per-subject median balances the classes and gives
  53. the best stable valence performance. Margin labels reduce $N$ and inflate
  54. variance.\label{tab:labeling}}
  55. \centering
  56. \begin{tabular}{lcccccc}
  57. \toprule
  58. & \multicolumn{3}{c}{\textbf{Valence}} & \multicolumn{3}{c}{\textbf{Arousal}} \\
  59. \cmidrule(lr){2-4}\cmidrule(lr){5-7}
  60. \textbf{Labeling scheme} & Balance & $N$ & AUC & Balance & $N$ & AUC \\
  61. \midrule
  62. """ + "\n".join(rows) + r"""
  63. \bottomrule
  64. \end{tabular}
  65. \end{table}"""
  66. blocks.append(t)
  67. # ---- Table: subject-independent classification (headline) ----
  68. hl = load("headline.json")
  69. mlabel = {"logreg": "Logistic Regression", "linsvm": "Linear SVM", "rbfsvm": "RBF SVM",
  70. "rf": "Random Forest", "xgb": "XGBoost", "majority": "Majority baseline"}
  71. def hl_rows(key):
  72. d = hl[key]["models"]; out = []
  73. for m in ["majority", "logreg", "linsvm", "rbfsvm", "rf", "xgb"]:
  74. prot = "loso" if m != "majority" else None
  75. mk = f"{m}_loso" if prot else "majority"
  76. v = d[mk]
  77. out.append(f"{mlabel[m]} & {ci(v['auc'])} & {v['pr_auc']['value']:.3f} & "
  78. f"{v['bacc']['value']:.3f} & {v['recall_pos']['value']:.2f} & {v['recall_neg']['value']:.2f} \\\\")
  79. return "\n".join(out)
  80. t = r"""\begin{table}[H]
  81. \caption{Subject-independent classification (leave-one-subject-out, per-subject
  82. median labels, per-subject normalization, decision threshold tuned by Youden's
  83. $J$ on an inner validation split). Brackets give 95\% bootstrap confidence
  84. intervals obtained by resampling subjects. Recall$_+$/Recall$_-$ are per-class
  85. recall.\label{tab:classification}}
  86. \centering
  87. \footnotesize
  88. \begin{tabular}{lccccc}
  89. \toprule
  90. \textbf{Model} & \textbf{ROC-AUC [95\% CI]} & \textbf{PR-AUC} & \textbf{Bal.\ Acc.} & \textbf{Recall$_+$} & \textbf{Recall$_-$} \\
  91. \midrule
  92. \multicolumn{6}{c}{\textit{Valence}} \\
  93. """ + hl_rows("valence_subject_median") + r"""
  94. \midrule
  95. \multicolumn{6}{c}{\textit{Arousal}} \\
  96. """ + hl_rows("arousal_subject_median") + r"""
  97. \bottomrule
  98. \end{tabular}
  99. \end{table}"""
  100. blocks.append(t)
  101. # ---- Table: ablations ----
  102. ab = load("ablations.json")
  103. def fam_rows(tgt):
  104. out = []
  105. fam6 = ab["family_6ch"][tgt]; fam32 = ab["family_32ch"][tgt]
  106. famnames = {"spectral": "Spectral only", "nonlinear": "Nonlinear only",
  107. "connectivity": "Connectivity only", "no_connectivity": "All $-$ connectivity",
  108. "all": "All features"}
  109. for f in ["spectral", "nonlinear", "all"]:
  110. d6 = fam6[f]
  111. out.append(f"{famnames[f]} & {d6['n_features']} & {d6['results']['xgb']['auc']['value']:.3f} & "
  112. + (f"{fam32[f]['n_features']} & {fam32[f]['results']['xgb']['auc']['value']:.3f}" if f in fam32 else "-- & --") + r" \\")
  113. for f in ["connectivity", "no_connectivity"]:
  114. if f in fam32:
  115. d = fam32[f]
  116. out.append(f"{famnames[f]} & -- & -- & {d['n_features']} & {d['results']['xgb']['auc']['value']:.3f} \\\\")
  117. return "\n".join(out)
  118. t = r"""\begin{table}[H]
  119. \caption{Feature-family ablation (XGBoost, subject-independent GroupKFold,
  120. per-subject median labels). No family dominates; functional connectivity (PLV and
  121. coherence) adds no measurable value over local features, and connectivity-only is
  122. at chance.\label{tab:ablation_family}}
  123. \centering
  124. \begin{tabular}{lcccc}
  125. \toprule
  126. & \multicolumn{2}{c}{\textbf{6-channel set}} & \multicolumn{2}{c}{\textbf{32-channel set}} \\
  127. \cmidrule(lr){2-3}\cmidrule(lr){4-5}
  128. \textbf{Feature family} & $d$ & Valence AUC & $d$ & Valence AUC \\
  129. \midrule
  130. """ + fam_rows("valence") + r"""
  131. \bottomrule
  132. \end{tabular}
  133. \end{table}"""
  134. blocks.append(t)
  135. def chan_rows(tgt):
  136. cn = {"frontal": "Frontal (F3,F4,AF3,AF4)", "parietal": "Parietal (P3,P4)",
  137. "all6": "All 6 channels", "all32": "All 32 channels"}
  138. ch = ab["channel"][tgt]
  139. return "\n".join(f"{cn[c]} & {ch[c]['n_features']} & {ch[c]['results']['xgb']['auc']['value']:.3f} \\\\"
  140. for c in ["frontal", "parietal", "all6", "all32"])
  141. t = r"""\begin{table}[H]
  142. \caption{Channel ablation (XGBoost, subject-independent GroupKFold, per-subject
  143. median labels). For valence the parietal pair alone matches the full montage and
  144. exceeds the frontal channels; the full 32-channel set offers little
  145. gain.\label{tab:ablation_channel}}
  146. \centering
  147. \begin{tabular}{lcc|cc}
  148. \toprule
  149. & \multicolumn{2}{c}{\textbf{Valence}} & \multicolumn{2}{c}{\textbf{Arousal}} \\
  150. \textbf{Channel subset} & $d$ & AUC & $d$ & AUC \\
  151. \midrule
  152. """ + "\n".join(
  153. f"{ {'frontal':'Frontal (F3,F4,AF3,AF4)','parietal':'Parietal (P3,P4)','all6':'All 6 channels','all32':'All 32 channels'}[c] } & "
  154. f"{ab['channel']['valence'][c]['n_features']} & {ab['channel']['valence'][c]['results']['xgb']['auc']['value']:.3f} & "
  155. f"{ab['channel']['arousal'][c]['n_features']} & {ab['channel']['arousal'][c]['results']['xgb']['auc']['value']:.3f} \\\\"
  156. for c in ["frontal", "parietal", "all6", "all32"]) + r"""
  157. \bottomrule
  158. \end{tabular}
  159. \end{table}"""
  160. blocks.append(t)
  161. # ---- Table: effect sizes / within-subject (replaces old Tables 3 & 4) ----
  162. def eff_rows(tgt):
  163. df = pd.read_csv(R / f"stats_{tgt}_subject_median.csv").sort_values("p_subj_wilcoxon").head(10)
  164. out = []
  165. for _, r0 in df.iterrows():
  166. feat = r0["feature"].replace("_", r"\_")
  167. out.append(f"{feat} & {r0['eps2']:.4f} [{r0['eps2_lo']:.4f}, {r0['eps2_hi']:.4f}] & "
  168. f"{r0['cohens_dz_subj']:+.2f} & {r0['p_subj_wilcoxon']:.1e} & {r0['subj_fdr']:.3f} & {r0['p_kw_window']:.1e} \\\\")
  169. return "\n".join(out)
  170. t = r"""\begin{table}[H]
  171. \caption{Top qEEG features for \textbf{valence} ranked by the within-subject paired
  172. test (per-subject median split, $n=32$ subjects). $\epsilon^2$ is the trial-level
  173. Kruskal--Wallis effect size with 95\% bootstrap CI (resampling subjects); $d_z$ is
  174. the within-subject paired effect size; $p_{\text{subj}}$ is the Wilcoxon
  175. signed-rank $p$-value across subjects (FDR-corrected). The last column shows the
  176. window-level Kruskal--Wallis $p$, illustrating the inflation from pseudo-replication
  177. (small $\epsilon^2$ yet $p<10^{-18}$).\label{tab:effect_valence}}
  178. \centering
  179. \footnotesize
  180. \begin{tabular}{lccccc}
  181. \toprule
  182. \textbf{Feature} & $\epsilon^2$ [95\% CI] & $d_z$ & $p_{\text{subj}}$ & FDR & $p_{\text{KW,window}}$ \\
  183. \midrule
  184. """ + eff_rows("valence") + r"""
  185. \bottomrule
  186. \end{tabular}
  187. \end{table}"""
  188. blocks.append(t)
  189. t = t.replace("valence", "arousal").replace("\\textbf{arousal}", "\\textbf{arousal}").replace("tab:effect_arousal", "tab:effect_arousal")
  190. # rebuild arousal table cleanly
  191. t = r"""\begin{table}[H]
  192. \caption{Top qEEG features for \textbf{arousal} ranked by the within-subject paired
  193. test (per-subject median split, $n=32$). Columns as in
  194. Table~\ref{tab:effect_valence}. After FDR correction no arousal feature reaches
  195. significance, although several (theta/alpha ratio, permutation entropy, Hjorth)
  196. show the expected direction.\label{tab:effect_arousal}}
  197. \centering
  198. \footnotesize
  199. \begin{tabular}{lccccc}
  200. \toprule
  201. \textbf{Feature} & $\epsilon^2$ [95\% CI] & $d_z$ & $p_{\text{subj}}$ & FDR & $p_{\text{KW,window}}$ \\
  202. \midrule
  203. """ + eff_rows("arousal") + r"""
  204. \bottomrule
  205. \end{tabular}
  206. \end{table}"""
  207. blocks.append(t)
  208. # ---- Table: stability + importance ----
  209. si = load("stability_importance.json")
  210. def stab_block(tgt):
  211. s10 = si[tgt]["stability"]["K10"]; s20 = si[tgt]["stability"]["K20"]
  212. return (f"{tgt.capitalize()} & {s10['kuncheva']:.3f} [{s10['kuncheva_ci'][0]:.2f}, {s10['kuncheva_ci'][1]:.2f}] & "
  213. f"{s10['mean_jaccard']:.3f} & {s20['kuncheva']:.3f} & {s20['mean_jaccard']:.3f} \\\\")
  214. t = r"""\begin{table}[H]
  215. \caption{Feature-selection stability across the 10 subject-independent folds,
  216. measured by the Kuncheva consistency index (chance-corrected) and mean pairwise
  217. Jaccard overlap of the top-$K$ XGBoost-gain features. $K$ was fixed a priori.
  218. Stability is modest, and lower for arousal.\label{tab:stability}}
  219. \centering
  220. \begin{tabular}{lcccc}
  221. \toprule
  222. & \multicolumn{2}{c}{\textbf{Top-10}} & \multicolumn{2}{c}{\textbf{Top-20}} \\
  223. \cmidrule(lr){2-3}\cmidrule(lr){4-5}
  224. \textbf{Target} & Kuncheva [95\% CI] & Jaccard & Kuncheva & Jaccard \\
  225. \midrule
  226. """ + stab_block("valence") + "\n" + stab_block("arousal") + r"""
  227. \bottomrule
  228. \end{tabular}
  229. \end{table}"""
  230. blocks.append(t)
  231. def imp_block(tgt):
  232. a = si[tgt]["importance"]["agreement"]
  233. return (f"{tgt.capitalize()} & {a['spearman_gain_shap']:.2f} & {a['spearman_gain_perm']:.2f} & "
  234. f"{a['spearman_shap_perm']:.2f} & {a['jaccard_top10_gain_shap']:.2f} & {a['jaccard_top10_gain_perm']:.2f} \\\\")
  235. t = r"""\begin{table}[H]
  236. \caption{Agreement between feature-importance methods (Spearman rank correlation
  237. and top-10 Jaccard overlap). XGBoost gain correlates only moderately with SHAP and
  238. weakly with permutation importance, confirming that gain alone is an unreliable
  239. indicator of predictor relevance.\label{tab:importance}}
  240. \centering
  241. \begin{tabular}{lccccc}
  242. \toprule
  243. \textbf{Target} & $\rho_{\text{gain,SHAP}}$ & $\rho_{\text{gain,perm}}$ & $\rho_{\text{SHAP,perm}}$ & $J_{10}^{\text{gain,SHAP}}$ & $J_{10}^{\text{gain,perm}}$ \\
  244. \midrule
  245. """ + imp_block("valence") + "\n" + imp_block("arousal") + r"""
  246. \bottomrule
  247. \end{tabular}
  248. \end{table}"""
  249. blocks.append(t)
  250. # ---- Table: cross-dataset ----
  251. cd = load("crossdataset.json")
  252. def cdrow(tgt, model):
  253. r = cd[tgt]["subject_median"]
  254. return (f"{tgt.capitalize()} ({model}) & {r['within_deap_'+model]['auc']['value']:.3f} & "
  255. f"{r['within_dreamer_'+model]['auc']['value']:.3f} & "
  256. f"{r['deap2dreamer_'+model]['auc']['value']:.3f} & {r['dreamer2deap_'+model]['auc']['value']:.3f} \\\\")
  257. t = r"""\begin{table}[H]
  258. \caption{Cross-dataset robustness on the four EEG channels common to DEAP and
  259. DREAMER (AF3, AF4, F3, F4) with an identical feature definition and per-subject
  260. median labels. Within-dataset values are subject-independent (GroupKFold for DEAP,
  261. LOSO for DREAMER); transfer columns train on one dataset and test on the other.
  262. Cross-dataset transfer is close to chance.\label{tab:crossdataset}}
  263. \centering
  264. \begin{tabular}{lcccc}
  265. \toprule
  266. \textbf{Target (model)} & Within DEAP & Within DREAMER & DEAP$\to$DREAMER & DREAMER$\to$DEAP \\
  267. \midrule
  268. """ + cdrow("valence", "logreg") + "\n" + cdrow("valence", "xgb") + "\n" + \
  269. cdrow("arousal", "logreg") + "\n" + cdrow("arousal", "xgb") + r"""
  270. \bottomrule
  271. \end{tabular}
  272. \end{table}"""
  273. blocks.append(t)
  274. # ---- Table: feature-extraction hyperparameters ----
  275. t = r"""\begin{table}[H]
  276. \caption{Feature-extraction hyperparameters (identical for DEAP and DREAMER).\label{tab:hyperparams}}
  277. \centering
  278. \begin{tabular}{ll}
  279. \toprule
  280. \textbf{Parameter} & \textbf{Value} \\
  281. \midrule
  282. Bandpass filter & 0.5--40 Hz, 4th-order Butterworth (zero-phase) \\
  283. Epoch length / overlap & 4 s / 2 s (50\%) \\
  284. Welch PSD & Hann window, nperseg $=$ epoch, 50\% segment overlap \\
  285. Frequency bands & $\delta$ 1--4, $\theta$ 4--8, $\alpha$ 8--13, $\beta$ 13--30, $\gamma$ 30--45 Hz \\
  286. Relative power denominator & total power 1--45 Hz \\
  287. Permutation entropy & orders $m\in\{3,5,7\}$, delay $\tau=1$, normalized \\
  288. Sample entropy & $m=2$, tolerance $r=0.2\cdot\mathrm{SD}$ \\
  289. Lempel--Ziv complexity & median-threshold binarization, normalized \\
  290. Higuchi fractal dimension & $k_{\max}=10$ \\
  291. Hjorth parameters & activity, mobility, complexity \\
  292. Frontal alpha asymmetry & $\ln P_\alpha^{\text{right}}-\ln P_\alpha^{\text{left}}$, pairs (F4,F3), (AF4,AF3) \\
  293. PLV / coherence (32-ch only) & per band, Hilbert phase, selected pairs \\
  294. \bottomrule
  295. \end{tabular}
  296. \end{table}"""
  297. blocks.append(t)
  298. # ---- Table: subject fingerprinting + variance decomposition ----
  299. try:
  300. P = load("personalization.json")
  301. def fv_row(d):
  302. f = P[d]["valence"]["fingerprint"]; v = P[d]["valence"]["variance"]
  303. return (f"{d} & {f['subject_id_acc']:.3f} & {f['subject_id_chance']:.3f} & "
  304. f"{f['emotion_loso_auc']:.3f} & {v['eta2_subject_median']:.3f} & "
  305. f"{v['eta2_emotion_median']:.4f} & {v['ratio_subject_over_emotion']:.0f}$\\times$ \\\\")
  306. t = r"""\begin{table}[H]
  307. \caption{The qEEG features encode subject identity far more than emotional state.
  308. Subject-identity decoding (random forest, 5-fold) versus cross-subject emotion
  309. decoding (LOSO), and the median per-feature variance explained by subject vs.\ by
  310. emotion class.\label{tab:fingerprint}}
  311. \centering
  312. \begin{tabular}{lcccccc}
  313. \toprule
  314. \textbf{Dataset} & \makecell{Subject-ID\\acc.} & \makecell{ID\\chance} & \makecell{Emotion\\AUC (LOSO)} & $\eta^2_{\text{subj}}$ & $\eta^2_{\text{emo}}$ & ratio \\
  315. \midrule
  316. """ + fv_row("DEAP") + "\n" + fv_row("DREAMER") + r"""
  317. \bottomrule
  318. \end{tabular}
  319. \end{table}"""
  320. blocks.append(t)
  321. # reliability vs idiosyncrasy
  322. def rel_row(d, t_):
  323. r = P[d][t_]["reliability"]
  324. return (f"{d} / {t_} & {r['within_subject_reliability']:.3f} & "
  325. f"{r['between_subject_similarity']:.3f} & {r['mean_signflip_rate']:.2f} \\\\")
  326. t = r"""\begin{table}[H]
  327. \caption{Emotion effects are more consistent within a person than across people.
  328. Within-subject split-half reliability and between-subject similarity of the
  329. per-subject emotion-effect vector (cosine), and the mean per-feature sign-flip rate
  330. across subjects (0 = all agree, 0.5 = random).\label{tab:reliability}}
  331. \centering
  332. \begin{tabular}{lccc}
  333. \toprule
  334. \textbf{Dataset / target} & Within-subj.\ reliability & Between-subj.\ similarity & Sign-flip rate \\
  335. \midrule
  336. """ + "\n".join(rel_row(d, t_) for d in ["DEAP", "DREAMER"] for t_ in ["valence", "arousal"]) + r"""
  337. \bottomrule
  338. \end{tabular}
  339. \end{table}"""
  340. blocks.append(t)
  341. except Exception as e:
  342. print("personalization tables skipped:", e)
  343. # ---- Table: cross-dataset biomarker replication ----
  344. try:
  345. br = load("biomarker_replication.json")
  346. def br_row(t_):
  347. x = br["targets"][t_]
  348. return (f"{t_.capitalize()} & {x['deap_sig_count']}/{br['n_common_features']} & "
  349. f"{x['dreamer_sig_count']}/{br['n_common_features']} & {x['n_replicated']} & "
  350. f"{x['overall_sign_agreement']:.2f} \\\\")
  351. t = r"""\begin{table}[H]
  352. \caption{Cross-dataset within-subject biomarker replication on the channels common
  353. to DEAP and DREAMER (AF3, AF4, F3, F4). Features FDR-significant within-subject in
  354. each dataset, the number replicating in both with matching sign, and the overall
  355. effect-direction agreement between datasets (0.5 = chance).\label{tab:replication}}
  356. \centering
  357. \begin{tabular}{lcccc}
  358. \toprule
  359. \textbf{Target} & DEAP FDR-sig & DREAMER FDR-sig & Replicated (both) & Sign agreement \\
  360. \midrule
  361. """ + br_row("valence") + "\n" + br_row("arousal") + r"""
  362. \bottomrule
  363. \end{tabular}
  364. \end{table}"""
  365. blocks.append(t)
  366. except Exception as e:
  367. print("replication table skipped:", e)
  368. # ---- Table: personalized vs universal vs subject-dependent ----
  369. try:
  370. hl = load("headline.json"); sd = load("subject_dependent.json")
  371. def pu_row(t_):
  372. uni = max(hl[f"{t_}_subject_median"]["models"][f"{m}_loso"]["auc"]["value"]
  373. for m in ["rf", "rbfsvm", "xgb", "logreg"])
  374. sdv = max(sd[t_]["subject_median"][m]["auc"] for m in ["logreg", "rf", "xgb"])
  375. return f"{t_.capitalize()} & {uni:.3f} & {sdv:.3f} & {sdv-uni:+.3f} \\\\"
  376. t = r"""\begin{table}[H]
  377. \caption{Personalized vs.\ universal modelling (per-subject median labels, best model
  378. per cell). The universal model is trained on all other subjects (LOSO); the
  379. personalized model is trained on the subject's own data (leak-free within-subject
  380. CV). A model built from a subject's own data exceeds one built from 31 other
  381. subjects.\label{tab:personalized}}
  382. \centering
  383. \begin{tabular}{lccc}
  384. \toprule
  385. \textbf{Target} & Universal (LOSO) AUC & Personalized (within-subj.) AUC & $\Delta$ \\
  386. \midrule
  387. """ + pu_row("valence") + "\n" + pu_row("arousal") + r"""
  388. \bottomrule
  389. \end{tabular}
  390. \end{table}"""
  391. blocks.append(t)
  392. except Exception as e:
  393. print("personalized table skipped:", e)
  394. # ---- Table: calibration learning curve (optional) ----
  395. try:
  396. cal = load("calibration.json")
  397. ks = sorted(int(k) for k in cal["valence"]["rf"])
  398. head = " & ".join(f"$k$={k}" for k in ks)
  399. def cal_row(t_, m):
  400. return f"{t_.capitalize()} ({m}) & " + " & ".join(f"{cal[t_][m][str(k)]['auc']:.3f}" for k in ks) + r" \\"
  401. t = r"""\begin{table}[H]
  402. \caption{Subject-adaptive calibration: LOSO ROC-AUC as $k$ labelled trials from the
  403. target subject are added to the training set. A few target-subject trials yield only
  404. marginal gains, indicating that meaningful personalization requires substantial
  405. per-subject data rather than light calibration.\label{tab:calibration}}
  406. \centering
  407. \begin{tabular}{l""" + "c" * len(ks) + r"""}
  408. \toprule
  409. \textbf{Target (model)} & """ + head + r""" \\
  410. \midrule
  411. """ + "\n".join(cal_row(t_, m) for t_ in ["valence", "arousal"] for m in ["logreg", "rf"]) + r"""
  412. \bottomrule
  413. \end{tabular}
  414. \end{table}"""
  415. blocks.append(t)
  416. except Exception as e:
  417. print("calibration table skipped (job may still be running):", e)
  418. # ---- Table: identity-confound (centerpiece) ----
  419. try:
  420. cf = load("confound_full.json")
  421. def cf_row(ds, t_):
  422. c = cf[ds]["fixed"][t_]
  423. return (f"{ds} & {t_.capitalize()} & {c['A_pooled_eeg']:.3f} & {c['B_identity_only']:.3f} & "
  424. f"{c['B_recovers_pct']:.0f}\\% & {c['D_subject_independent']:.3f} \\\\")
  425. t = r"""\begin{table}[H]
  426. \caption{The reported performance is largely subject identity, not emotion (fixed
  427. threshold, window-pooled, XGBoost). \textbf{Pooled EEG} is the commonly used leaky
  428. protocol; \textbf{Identity-only} uses no EEG at all---it predicts each test window
  429. with its subject's training-set positive rate; \textbf{Subject-independent} respects
  430. subject boundaries. An identity-only predictor recovers most of the pooled AUC,
  431. which collapses to chance once subjects are separated.\label{tab:confound}}
  432. \centering
  433. \begin{tabular}{llcccc}
  434. \toprule
  435. \textbf{Dataset} & \textbf{Target} & Pooled EEG & Identity-only (no EEG) & \% recovered & Subject-indep.\ \\
  436. \midrule
  437. """ + "\n".join(cf_row(ds, t_) for ds in ["DEAP", "DREAMER"] for t_ in ["valence", "arousal"]) + r"""
  438. \bottomrule
  439. \end{tabular}
  440. \end{table}"""
  441. blocks.insert(2, t) # place right after protocol + labeling tables
  442. except Exception as e:
  443. print("confound table skipped:", e)
  444. # ---- Table: best valid universal model (final optimization) ----
  445. try:
  446. fo = load("final_opt.json")
  447. def best_uni(t_):
  448. best = ("", -1)
  449. for ch in fo:
  450. for meth, r in fo[ch][t_].items():
  451. if r["auc_subjmean"] > best[1]:
  452. best = (f"{ch}/{meth}", r["auc_subjmean"])
  453. return best
  454. bv, bvv = best_uni("valence"); ba, bav = best_uni("arousal")
  455. t = r"""\begin{table}[H]
  456. \caption{Best subject-independent (universal) performance after exhaustive
  457. optimization---nested-tuned XGBoost/RF, top-$k$ feature selection, soft-voting
  458. ensembles, and Riemannian tangent-space classification with Euclidean alignment.
  459. No configuration exceeds a modest ceiling, indicating the limit is the
  460. subject-specificity of the signal rather than the model.\label{tab:bestuniversal}}
  461. \centering
  462. \begin{tabular}{lcc}
  463. \toprule
  464. \textbf{Target} & Best configuration & Best universal AUC \\
  465. \midrule
  466. Valence & """ + bv.replace("_", r"\_") + f" & {bvv:.3f}" + r""" \\
  467. Arousal & """ + ba.replace("_", r"\_") + f" & {bav:.3f}" + r""" \\
  468. \bottomrule
  469. \end{tabular}
  470. \end{table}"""
  471. blocks.append(t)
  472. except Exception as e:
  473. print("best-universal table skipped:", e)
  474. # ---- Table: multimodal fusion ----
  475. try:
  476. mm = load("multimodal.json")
  477. def mm_row(t_):
  478. e = mm[t_]["eeg"]["rf_loso"]["auc"]; p = mm[t_]["peripheral"]["rf_loso"]["auc"]; f = mm[t_]["fused"]["rf_loso"]["auc"]
  479. return f"{t_.capitalize()} & {e['value']:.3f} & {p['value']:.3f} & {f['value']:.3f} \\\\"
  480. t = r"""\begin{table}[H]
  481. \caption{Multimodal fusion does not rescue subject-independent performance (LOSO,
  482. random forest, per-subject median labels). Interpretable peripheral autonomic
  483. features (HRV, EDA/GSR, respiration, EMG, temperature) are themselves weak and
  484. subject-specific; fusing them with EEG yields no reliable gain, extending the
  485. ``personalized, not universal'' conclusion across modalities.\label{tab:multimodal}}
  486. \centering
  487. \begin{tabular}{lccc}
  488. \toprule
  489. \textbf{Target} & EEG only & Peripheral only & Fused \\
  490. \midrule
  491. """ + mm_row("valence") + "\n" + mm_row("arousal") + r"""
  492. \bottomrule
  493. \end{tabular}
  494. \end{table}"""
  495. blocks.append(t)
  496. except Exception as e:
  497. print("multimodal table skipped:", e)
  498. (OUT / "tables.tex").write_text("\n\n".join(blocks) + "\n")
  499. print(f"Wrote {len(blocks)} tables -> {OUT/'tables.tex'}")

gen_latex_tables.py at commit e603254, no license · at the source

Overview

  1. Faculty of Computer Science & Engineering, Ss. Cyril and Methodius University, 1000 Skopje, North Macedonia; (I.C.); (M.P.); (I.K.); (D.T.)
Institutions: Ss. Cyril and Methodius University in Skopje (North Macedonia)
Journal: Sensors (Basel, Switzerland), volume 26, issue 17, article 5327
Dates: received 15 July 2026; accepted 20 August 2026; published online 22 August 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3390/s26175327 · PMID 42739948 · PMCID PMC13567904 · OpenAlex W7204103188
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: EEG (modality), human (organism), cognitive (subfield)
Methods: Spectral & time-frequency, Connectivity, Statistics, Machine learning, Complexity, Preprocessing, Physiology & signal measures, Smoothing, state filtering, decompositions
Keywords: qEEG, emotion recognition, valence, arousal, participant-independent evaluation, individual differences, personalized affective computing, DEAP, DREAMER
MeSH: Dreams*, Electroencephalography*, Emotions*, Adult, Arousal, Female, Humans, Male (* major topic)
Topic: Emotion and Mood Recognition (Experimental and Cognitive Psychology, Psychology), according to OpenAlex
Funding: Ministry of Education and Science of the Republic of North Macedonia; EC/EuroHPC JU (101263128); Ministry of Digital Transformation of the Republic of North Macedonia (101263128); Faculty of Computer Science and Engineering, Ss. Cyril and Methodius University in Skopje (101263128)
Citations: not cited yet (Europe PMC); 49 references in the paper

Abstract

Quantitative EEG features such as frontal alpha asymmetry, spectral ratios and signal-complexity measures are often presented as interpretable biomarkers of emotion. Such claims require the markers to generalize across individuals, yet common evaluation protocols allow overlapping epochs and recordings from the same participants to appear in both training and test sets. We re-evaluated qEEG-based valence and arousal recognition on DEAP and DREAMER under trial-grouped, participant-independent, within-participant and cross-dataset protocols. Epoch-pooled evaluation on DEAP gave ROC-AUC values of 0.689 for valence and 0.711 for arousal, whereas participant-independent evaluation of the same features and model returned 0.493 and 0.447. Grouping epochs by trial accounted for about 0.06 of that difference and separating participants for a further 0.13 to 0.17. The same features identified participants with accuracy of 0.998 on DEAP and 0.891 on DREAMER, and a predictor that used no EEG, assigning each trial its participant’s training-set positive rate, accounted for 42 to 84 percent of the above-chance discrimination of the epoch-pooled model. Emotion-related effects were reproducible within participants on DEAP but close to zero on DREAMER, and their direction reversed for about 40 percent of features across participants. In a matched participant-level comparison using a single fixed estimator in both arms, training on a participant’s own data improved DEAP valence by 0.092 AUC (95% CI 0.029 to 0.157, Holm-adjusted p=0.042) and gave no reliable benefit for DEAP arousal or for either DREAMER target. Across the channels shared by the two datasets, per-feature arousal effect sizes correlated moderately, although no individual feature reached false-discovery-rate significance in both datasets. Pooled qEEG emotion-recognition scores can therefore reflect participant-specific recording structure rather than transferable affective information. Population-level claims require participant-independent evaluation, while personalization should be considered only where stable within-person effects are demonstrated.

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 25 matches between paragraphs and lines of code.

ema-pandilova/qeeg-emotion-pipeline

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: e60325483181fce04ada3aa5ace4fdc27ce99267, 14 July 2026
Languages: Python (78), Shell (2)
Size: 112 files, 80 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README, environment (requirements.txt)
Not found: license file, CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (61 files), pandas (54 files), scikit-learn (35 files), XGBoost (18 files), SciPy (15 files), Matplotlib (13 files), TensorFlow (4 files), seaborn (3 files), Keras (2 files), statsmodels (2 files), imbalanced-learn (1 file), MNE-Python (1 file), pyRiemann (1 file), SHAP (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
81 files

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 80 scripts, each with its path and the digest of its content;
  • 25 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

Data Availability Statement

DEAP is available from https://www.eecs.qmul.ac.uk/mmv/datasets/deap/ (doi:10.1109/T-AFFC.2011.15, accessed on 18 August 2026), and DREAMER from https://zenodo.org/records/546113 (accessed on 18 August 2026); both are third-party datasets obtained under their custodians’ own terms and are not redistributed here. All preprocessing, feature-extraction, evaluation, statistics and figure-generation code, and the exact hyperparameters reported here, and the computed results in machine-readable form are openly available at https://github.com/ema-pandilova/qeeg-emotion-pipeline (accessed on 18 August 2026), so that every number in this paper can be recomputed. The 32-channel feature table used for the montage and feature-family ablations is regenerated by the enhanced-pipeline configuration in that repository rather than by the compact-montage extraction scripts.

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, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 9 keywords, 8 MeSH terms, 4 funders, 42 references.

Cite

This paper

Pandilova, E., Stojmenski, A., Chorbev, I., Petrov, M., Kitanovski, I., & Trajanov, D. (2026). Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER. Sensors (Basel, Switzerland), 26(17), 5327. https://doi.org/10.3390/s26175327

BibTeX

@article{pandilova2026subject,
author = {Pandilova, Ema and Stojmenski, Aleksandar and Chorbev, Ivan and Petrov, Marko and Kitanovski, Ivan and Trajanov, Dimitar},
title = {{Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER}},
journal = {Sensors (Basel, Switzerland)},
year = {2026},
month = aug,
volume = {26},
number = {17},
pages = {5327},
publisher = {Multidisciplinary Digital Publishing Institute (MDPI)},
issn = {1424-8220},
doi = {10.3390/s26175327},
url = {https://doi.org/10.3390/s26175327},
pmid = {42739948},
pmcid = {PMC13567904}
}

RIS

TY - JOUR
AU - Pandilova, Ema
AU - Stojmenski, Aleksandar
AU - Chorbev, Ivan
AU - Petrov, Marko
AU - Kitanovski, Ivan
AU - Trajanov, Dimitar
TI - Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER
T2 - Sensors (Basel, Switzerland)
J2 - Sensors (Basel)
PY - 2026
DA - 2026/08/22
VL - 26
IS - 17
SP - 5327
SN - 1424-8220
PB - Multidisciplinary Digital Publishing Institute (MDPI)
DO - 10.3390/s26175327
UR - https://doi.org/10.3390/s26175327
LA - en
ER -

CSL-JSON

{
"id": "10.3390/s26175327",
"type": "article-journal",
"title": "Subject Identity Confounds qEEG Emotion Recognition on DEAP and DREAMER",
"container-title": "Sensors (Basel, Switzerland)",
"author": [
{
"family": "Pandilova",
"given": "Ema"
},
{
"family": "Stojmenski",
"given": "Aleksandar"
},
{
"family": "Chorbev",
"given": "Ivan"
},
{
"family": "Petrov",
"given": "Marko"
},
{
"family": "Kitanovski",
"given": "Ivan"
},
{
"family": "Trajanov",
"given": "Dimitar"
}
],
"container-title-short": "Sensors (Basel)",
"volume": "26",
"issue": "17",
"page": "5327",
"DOI": "10.3390/s26175327",
"PMID": "42739948",
"PMCID": "PMC13567904",
"ISSN": "1424-8220",
"publisher": "Multidisciplinary Digital Publishing Institute (MDPI)",
"URL": "https://doi.org/10.3390/s26175327",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
22
]
]
}
}

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/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: imbalanced-learn, SHAP, XGBoost, 9 other tools
[2] doi:10.3389/fpsyg.2026.1774068 [code]
Analysis of cognitive mechanisms in phoneme perception and pronunciation errors among Korean language learners.
Journal: Frontiers in psychology
In common: pyRiemann, XGBoost, Keras, 8 other tools, EEG, cognitive
[3] doi:10.3390/brainsci16070716
RGB-Style Input Representations for EEG: Evaluating Spatial Concatenation Versus Band-Wise Stacking in Deep Emotion Recognition.
Journal: Brain sciences
In common: Zenodo 546113, EEG, cognitive, 6 references
[4] doi:10.1371/journal.pone.0347671 [code]
RMETNet: A cross-subject motor imagery EEG signal classification model based on TSLANet and riemannian geometry features.
Journal: PloS one
In common: pyRiemann, imbalanced-learn, MNE-Python, 7 other tools, EEG
[5] doi:10.1038/s41598-026-52330-z [code]
SHAP analysis of an improved EEG-based mental workload classification framework: utilizing data augmentation and explainable AI.
Journal: Scientific reports
In common: imbalanced-learn, SHAP, Keras, 7 other tools, EEG
[6] doi:10.1371/journal.pcbi.1014615 [code]
Toward reliable machine learning models for neural circuit inference: A diagnostic study of CNNs on spike trains.
Journal: PLoS computational biology
In common: SHAP, XGBoost, Keras, 8 other tools
[7] doi:10.3389/fnins.2026.1810609
A dual-branch network with brain region-constrained attention for EEG emotion recognition.
Journal: Frontiers in neuroscience
In common: Zenodo 546113, EEG, cognitive, 5 references
[8] doi:10.1038/s41598-026-55163-y [code]
Autism spectrum disorder identification using machine learning models on MRI data.
Journal: Scientific reports
In common: imbalanced-learn, XGBoost, Keras, 7 other tools
[9] doi:10.1186/s13059-026-04125-8 [code]
MLMarker: a machine learning framework for tissue inference and biomarker discovery.
Journal: Genome biology
In common: imbalanced-learn, SHAP, XGBoost, 7 other tools
[10] doi:10.1038/s41598-026-56688-y [code]
On the value of radiomics in addition to clinical measures in emotional conflict fMRI for predicting sertraline response in major depressive disorder.
Journal: Scientific reports
In common: imbalanced-learn, SHAP, XGBoost, 7 other tools

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.