OSCR

Dual mechanism of anti-seizure medications in controlling seizure activity.

Code ↔ Paper

The paper beside its authors' code: matches between them have not been computed for this paper yet.

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 · 805 lines · 27 KB · no license

  1. # Auxiliary code for __
  2. # This code generats results figures for the study mentioned above and some
  3. # supplementary material
  4. # This code has been developed on Python 3.12.5 with Spyder 6
  5. # The code has been designed to be abel to run by sections on Spyder, other
  6. # interpreters may not identify the same section berakpoints.
  7. # Further details on readme document
  8. #%% Initialize workspace
  9. # Import required libraries
  10. import os
  11. import numpy as np
  12. import pandas as pd
  13. import matplotlib.pyplot as plt
  14. import seaborn as sns
  15. from scipy import stats
  16. import statsmodels.formula.api as smf
  17. # Figure generation workspace
  18. # Uncomment the following 6 lines to obtain better quality figure generation
  19. import matplotlib.font_manager as ft
  20. import matplotlib
  21. matplotlib.use('cairo')
  22. plt.rc('font', family='arial')
  23. plt. rcParams.update({'font.size':9})
  24. font = ft.FontProperties(family = 'arial')
  25. # Define the Origin path for all data
  26. path_Org = os.getcwd()
  27. # Clustering data importins
  28. sz_Clust = pd.read_csv(path_Org + '/data/rednmf_l10.csv')
  29. Stt_Freq_asm = pd.read_csv(path_Org + '/data/rednmf_l10_szFrq.csv')
  30. # Figure saving flag: True = Save figures
  31. save_fig = True
  32. # Figure saving output folders
  33. path_save_fig = path_Org + '/ASM_Result_figs/'
  34. # Number of decimas on statistical analysis show
  35. Stt_Dgt = 4
  36. # SVG/PDF figure folders
  37. if not os.path.exists(path_save_fig + '/PDF'):
  38. os.makedirs(path_save_fig + '/PDF')
  39. #%% Results: Seizure dutation and Frecuancy with ASM levels
  40. # Duration for all seizures available on the dataset
  41. rsp = "Duration_10"
  42. # Figure Aperance variables
  43. Y_Lim1 = [0,3]
  44. Y_Lim2 = [0,3]
  45. Y_Label= "Duration (log10)"
  46. X_Lim_asm = [-10,1]
  47. X_Lim_tod = [0,24]
  48. palt = "mako"
  49. Hue_Patt = ["Normo","Under"]
  50. Axs_Patt = ["Under","Normo"]
  51. Cater = "ASM_stt"
  52. # MELM formula for duation against ASM levels and TofD
  53. # sTOD+cTOD -> Incorporation ciradian rythm (24h) as a circular variable
  54. # sTOD_h+cTOD_h -> Incorporation ultradian 12h rythm as a circular variable
  55. prd = "ASM_lvl + sTOD+cTOD + sTOD_h+cTOD_h"
  56. # Clear dataset from non-relevant data
  57. rm_dx = np.logical_or(np.isnan(sz_Clust[rsp]),np.isinf(sz_Clust[rsp]))
  58. stData = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  59. # Fit the mixed effect model with patietn identifier group-level effect
  60. mdl_Chr_Ams = smf.mixedlm(rsp + " ~ " + prd , stData, groups=stData.patient_id).fit()
  61. mdl_Chr_Ams.summary()
  62. # Relevent effect sizes and p-values for figure generation
  63. rnd_eff = mdl_Chr_Ams.random_effects
  64. int_eff = mdl_Chr_Ams.params.Intercept
  65. asm_eff = mdl_Chr_Ams.params.ASM_lvl
  66. asm_pvl = mdl_Chr_Ams.pvalues.ASM_lvl
  67. plt.figure(figsize=[15,5])
  68. # Plot raw data for 3 individuals: ASM level vs Seizure duration --------------
  69. # Patient Ids to show
  70. id_rep = [78,46,48]
  71. # Color code
  72. id_col = [[59/255, 117/255, 175/255],
  73. [235/255,125/255, 48/255],
  74. [80/255, 156/255, 61/255]]
  75. # Plot data poitns and Fixed effect individually
  76. for i in range(0,len(id_rep)):
  77. plt.subplot(1,3,2)
  78. # Identify subject data
  79. idx = np.where(sz_Clust.patient_id == id_rep[i])[0]
  80. # Data poitns scatterplot
  81. sns.scatterplot(x=sz_Clust.ASM_lvl[idx], y=sz_Clust[rsp][idx],
  82. label="id" + str(id_rep[i]), color = id_col[i])
  83. # Generate regresion with MELM data
  84. grp_eff = rnd_eff.get(id_rep[i]).Group # Group effect
  85. X = np.linspace(min(sz_Clust.ASM_lvl[idx]),# ASM level range
  86. max(sz_Clust.ASM_lvl[idx]))
  87. Y = X * asm_eff + grp_eff + int_eff # Regresion
  88. sns.lineplot(x=X, y=Y, color = id_col[i]) # Line with matching color code
  89. # Mark the ASM levels correponding to NOrmal-dose in grey
  90. plt.fill_between(range(X_Lim_asm[0],X_Lim_asm[1]+1), Y_Lim1[0], Y_Lim1[1],
  91. np.array(range(X_Lim_asm[0],X_Lim_asm[1]+1))>=-1,
  92. alpha=0.1, color='k')
  93. plt.subplot(1,3,1)
  94. plt.xlim(X_Lim_asm)
  95. plt.ylim(Y_Lim1)
  96. plt.legend()
  97. plt.ylabel(Y_Label)
  98. plt.xlabel("normalized ASM plasma concentration")
  99. plt.title("Three Example Patients")
  100. # Plot all individuals: ASM level vs Seizure duration with MELM ---------------
  101. plt.subplot(1,3,3)
  102. # Remove the group effect to all subjects
  103. FL = np.repeat(np.nan, stData.shape[0])
  104. for i in rnd_eff.keys():
  105. dt_dx = stData.patient_id == i
  106. if any(dt_dx):
  107. FL[dt_dx] = stData[rsp][dt_dx] - rnd_eff.get(i).Group
  108. stData[rsp] = FL
  109. # Plot the datapoints color codding the ASM_level [Normal-dose | Under-dose]
  110. sns.scatterplot(data = stData, x="ASM_lvl", y=rsp,
  111. hue = Cater, palette = palt, hue_order = Hue_Patt)
  112. # Generate regresion for all datapoints
  113. X = np.linspace(X_Lim_asm[0], X_Lim_asm[1])
  114. Y = int_eff
  115. Y += X * asm_eff * (asm_pvl < 0.05)
  116. sns.lineplot(x=X, y=Y, color = "red", label = "ASM lvl. - Fixed eff.")
  117. # Mark the normal-dose period
  118. plt.fill_between(range(X_Lim_asm[0],X_Lim_asm[1]+1), Y_Lim2[0], Y_Lim2[1],
  119. np.array(range(X_Lim_asm[0],X_Lim_asm[1]+1))>=-1,
  120. alpha=0.1, color='k')
  121. plt.xlim(X_Lim_asm)
  122. plt.ylim(Y_Lim2)
  123. plt.ylabel(Y_Label)
  124. plt.xlabel("normalized ASM plasma concentration")
  125. # Include sample size and ASM level fixed effect statistics
  126. plt.title("All Seizures (" +
  127. str(stData.shape[0])+ " Szs. | "+
  128. str(len(np.unique(stData.patient_id)))+ " Pts.)" +
  129. "\n MELM - ASM lvl. eff=" + str(round(asm_eff,Stt_Dgt)) +
  130. ", p=" + str(round(asm_pvl,Stt_Dgt)))
  131. # Plot seizure frecuancy changes between ASM level ranges on all subjects
  132. axs = plt.subplot(1,3,1)
  133. col_thr = 0
  134. for i in range(0,Stt_Freq_asm.shape[0]):
  135. # Colorcode the data based on difference in seizure frecuancy
  136. if np.diff(Stt_Freq_asm.values[i])>col_thr: # Increase -> in blue
  137. COL = 'blue'
  138. STL = ':'
  139. MRK = 'o'
  140. ALP = 1
  141. elif np.diff(Stt_Freq_asm.values[i])<-col_thr: # Decrease -> in red
  142. COL = 'red'
  143. STL = '-.'
  144. MRK = '^'
  145. ALP = 1
  146. else: # No Change -> in black
  147. COL = 'black'
  148. STL = '--'
  149. MRK = 'X'
  150. ALP = 1
  151. # Plot a line per subject
  152. # Square root of data for better visualization with Y^2 axis
  153. sns.lineplot(y=np.sqrt(Stt_Freq_asm.values[i][::-1]),x=["Under","Normo"],
  154. color=COL, alpha = ALP, legend = False, linestyle = STL,
  155. marker = MRK)
  156. xl = np.array([-0.5,0,0.5,1,1.5])
  157. yl = [0,7.5]
  158. # Indicate the Normal-dose data with grey background
  159. plt.fill_between(xl, yl[0], yl[1], xl>=0.5, alpha=0.1, color='k')
  160. plt.xlim([xl[0],xl[-1]])
  161. # Square Axis
  162. y_tick = np.linspace(yl[0],round(yl[1]),round(yl[1])+1)
  163. plt.yticks(y_tick, np.square(y_tick).astype(str))
  164. plt.ylabel("sz/day")
  165. plt.ylim(yl)
  166. # Statistical comparaison Comparaison
  167. Freq_SignRank = stats.wilcoxon(Stt_Freq_asm.Under,Stt_Freq_asm.Normo, method = 'asymptotic',
  168. alternative = 'greater')
  169. R_stat = Freq_SignRank.zstatistic/np.sqrt(Stt_Freq_asm.shape[0])
  170. # Include sample size and statistics
  171. plt.title("Sz. Frequency[" + str(Stt_Freq_asm.shape[0]) +
  172. "] \nSinged-Rank R=" + str(round(R_stat,Stt_Dgt)) +
  173. ", p="+ str(round(Freq_SignRank.pvalue,Stt_Dgt)))
  174. if save_fig:
  175. plt.savefig(path_save_fig + "/RLT_fDS_Durt_Freq.svg", format='svg',
  176. dpi=3000, bbox_inches='tight')
  177. plt.savefig(path_save_fig + "/PDF/RLT_fDS_Durt_Freq.pdf", format='pdf',
  178. dpi=3000, bbox_inches='tight')
  179. #%% Results: Seizure dutation, Seizure Staes and ASM levels
  180. # Full log10 duration for seizures within the Seizure Sates analysis
  181. rsp = "DSS_Full"
  182. # Figure Aperance variables
  183. Y_Lim1 = [0,3]
  184. Y_Lim2 = [0,3]
  185. Y_Label= "Duration (log10)"
  186. X_Lim_asm = [-10,1]
  187. X_Lim_tod = [0,24]
  188. palt = "mako"
  189. Hue_Patt = ["CMN_Normo","CMN_Under","UND_Under"]
  190. Axs_Patt = ["UND_Under","CMN_Under","CMN_Normo"]
  191. Cater = "Sz_Class"
  192. # MELM for for duation against ASM levels and TofD
  193. prd = "ASM_lvl + sTOD+cTOD + sTOD_h+cTOD_h"
  194. # Clear dataset from non-relevant data
  195. rm_dx = np.logical_or(np.isnan(sz_Clust[rsp]),np.isinf(sz_Clust[rsp]))
  196. stData = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  197. # Fit the mixed effect model with patietn identifier group-level effect
  198. mdl_Chr_SSS = smf.mixedlm(rsp + " ~ " + prd , stData, groups=stData.patient_id).fit()
  199. mdl_Chr_SSS.summary()
  200. # Relevent effect sizes and p-values for figure generation
  201. rnd_eff = mdl_Chr_SSS.random_effects
  202. int_eff = mdl_Chr_SSS.params.Intercept
  203. asm_eff = mdl_Chr_SSS.params.ASM_lvl
  204. asm_pvl = mdl_Chr_SSS.pvalues.ASM_lvl
  205. # Remove the group effect
  206. FL = np.repeat(np.nan, stData.shape[0])
  207. for i in rnd_eff.keys():
  208. dt_dx = stData.patient_id == i
  209. if any(dt_dx):
  210. FL[dt_dx] = stData[rsp][dt_dx] - rnd_eff.get(i).Group
  211. Data = stData.copy()
  212. stData[rsp] = FL
  213. plt.figure(figsize=[10,5])
  214. # Plot all individuals: ASM level vs Seizure duration with MELM ---------------
  215. plt.subplot (1,2,1)
  216. # Plot the datapoints color codding seizure tyeps and ASM state they appear in
  217. sns.scatterplot(data = stData, x="ASM_lvl", y=rsp,
  218. hue = Cater, palette = palt, hue_order = Hue_Patt)
  219. # Generate regresion for all datapoints
  220. X = np.linspace(X_Lim_asm[0], X_Lim_asm[1])
  221. Y = int_eff
  222. Y += X * asm_eff * (asm_pvl < 0.05)
  223. sns.lineplot(x=X, y=Y, color = "red", label = "ASM lvl. - Fixed eff.")
  224. # Mark the normal-dose period
  225. plt.fill_between(range(X_Lim_asm[0],X_Lim_asm[1]+1), Y_Lim2[0], Y_Lim2[1],
  226. np.array(range(X_Lim_asm[0],X_Lim_asm[1]+1))>=-1,
  227. alpha=0.1, color='k')
  228. plt.xlim(X_Lim_asm)
  229. plt.ylim(Y_Lim2)
  230. plt.ylabel(Y_Label)
  231. plt.xlabel("normalized ASM plasma concentration")
  232. # Include sample size and ASM level fixed effect statistics
  233. plt.title("All Seizures (" +
  234. str(stData.shape[0])+ " Szs. | "+
  235. str(len(np.unique(stData.patient_id)))+ " Pts.)" +
  236. "\n MELM - ASM lvl. eff=" + str(round(asm_eff,Stt_Dgt)) +
  237. ", p=" + str(round(asm_pvl,Stt_Dgt)))
  238. # Boxplot of seizure duration in patients with UND seizures -------------------
  239. plt.subplot (1,2,2)
  240. # Isolate individuals with any UND seizure
  241. rm_dx = np.zeros(stData.shape[0])
  242. for i in np.unique(stData.patient_id):
  243. idx = stData.patient_id == i
  244. sz_st = stData.SzSt[idx]
  245. if not any(sz_st == "UND"):
  246. rm_dx[idx] += 1
  247. data = stData.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  248. # Alternative study: MELM to study Types and
  249. data_2 = Data.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  250. data_2.Sz_Class[data_2.Sz_Class == "UND_Under"] = "0_UND_Under"
  251. data_2.Sz_Class[data_2.Sz_Class == "CMN_Under"] = "1_CMN_Under"
  252. data_2.Sz_Class[data_2.Sz_Class == "CMN_Normo"] = "2_CMN_Normo"
  253. mdl_Durt_TypAsm = smf.mixedlm(rsp + " ~ Sz_Class", data_2, groups=data_2.patient_id).fit()
  254. # Boxplot of distribution and data poitns segregatin by seizure type and ASM perion
  255. # Same color code and in previous plot
  256. sns.boxplot(data = data, x=Cater, y=rsp, order = Axs_Patt,
  257. hue = Cater, palette = palt, hue_order = Hue_Patt,
  258. fill=False, flierprops={"marker": ""})
  259. sns.stripplot(data = data, x=Cater, y=rsp, order = Axs_Patt,
  260. hue = Cater, palette = palt, hue_order = Hue_Patt,
  261. alpha = 0.7,jitter = 0.3)
  262. xl = np.linspace(-0.5,2.5,7)
  263. plt.fill_between(xl, Y_Lim2[0], Y_Lim2[1], xl>=1.5, alpha=0.1, color='k')
  264. plt.xlim([xl[0],xl[-1]])
  265. plt.ylim(Y_Lim2)
  266. plt.ylabel("Duration(log10)")
  267. plt.xlabel("")
  268. plt.xticks([])
  269. plt.title("Seizure Duration")
  270. # Compare the difference between CMN and UND seizure duration
  271. SSS_RankSum_UN = stats.ranksums (data[rsp][data.Sz_Class == "UND_Under"],
  272. data[rsp][data.Sz_Class == "CMN_Under"])
  273. N_UN = len(data[rsp][data.Sz_Class == "UND_Under"]) + len(data[rsp][data.Sz_Class == "CMN_Under"])
  274. R_stat_UN = SSS_RankSum_UN.statistic/np.sqrt(N_UN)
  275. # Compare the difference between CMN and UND seizure duration
  276. SSS_RankSum_CM = stats.ranksums (data[rsp][data.Sz_Class == "UND_Under"],
  277. data[rsp][data.Sz_Class == "CMN_Normo"])
  278. N_CM = len(data[rsp][data.Sz_Class == "UND_Under"]) + len(data[rsp][data.Sz_Class == "CMN_Normo"])
  279. R_stat_CM = SSS_RankSum_CM.statistic/np.sqrt(N_CM)
  280. # Statistics of sieuzre type comparaison
  281. plt.xlabel("UND vs CMN_Under - Rank Sum R=" + str(round(R_stat_UN,Stt_Dgt)) + ", p="+ str(round(SSS_RankSum_UN.pvalue,Stt_Dgt)) + '\n' +
  282. "UND vs CMN_Normo - Rank Sum R=" + str(round(R_stat_CM,Stt_Dgt)) + ", p="+ str(round(SSS_RankSum_CM.pvalue,Stt_Dgt)))
  283. # Include sample size
  284. plt.title("Individuals with UND seizures (" +
  285. str(data.shape[0])+ " Szs. | "+
  286. str(len(np.unique(data.patient_id)))+ " Pts.)")
  287. if save_fig:
  288. plt.savefig(path_save_fig + "/RLT_ssDS_Durt_SzSt.svg", format='svg',
  289. dpi=3000, bbox_inches='tight')
  290. plt.savefig(path_save_fig + "/PDF/RLT_ssDS_Durt_SzSt.pdf", format='pdf',
  291. dpi=3000, bbox_inches='tight')
  292. #%% Results: Seizures without Under-Dose Specific States
  293. # Full duration of patietns within Seizure States analysis
  294. rsp = "DSS_Full"
  295. Y_Lim1 = [0,3]
  296. Y_Lim2 = [0,3]
  297. Y_Label= "Duration (log10)"
  298. X_Lim_asm = [-10,1]
  299. X_Lim_tod = [0,24]
  300. palt = "mako"
  301. Hue_Patt = ["CMN_Normo","CMN_Under"]
  302. Axs_Patt = ["CMN_Under","CMN_Normo"]
  303. Cater = "Sz_Class"
  304. # MELM for for duation against ASM levels and TofD
  305. prd = "ASM_lvl + sTOD+cTOD + sTOD_h+cTOD_h"
  306. # Remove all UND sieuzres
  307. rm_dx = sz_Clust.SzSt == "UND"
  308. # Clear dataset from non-relevant data
  309. rm_dx_2 = np.logical_or(np.isnan(sz_Clust[rsp]),np.isinf(sz_Clust[rsp]))
  310. rm_dx = np.logical_or(rm_dx,rm_dx_2)
  311. stData = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  312. # Fit the mixed effect model with patietn identifier group-level effect
  313. mdl_Chr_CMN = smf.mixedlm(rsp + " ~ " + prd , stData, groups=stData.patient_id).fit()
  314. mdl_Chr_CMN.summary()
  315. # Relevent effect sizes and p-values for figure generation
  316. rnd_eff = mdl_Chr_CMN.random_effects
  317. int_eff = mdl_Chr_CMN.params.Intercept
  318. asm_eff = mdl_Chr_CMN.params.ASM_lvl
  319. asm_pvl = mdl_Chr_CMN.pvalues.ASM_lvl
  320. # Remove the group effect
  321. FL = np.repeat(np.nan, stData.shape[0])
  322. for i in rnd_eff.keys():
  323. dt_dx = stData.patient_id == i
  324. if any(dt_dx):
  325. FL[dt_dx] = stData[rsp][dt_dx] - rnd_eff.get(i).Group
  326. stData[rsp] = FL
  327. plt.figure(figsize=[10,5])
  328. # Plot CMN seizure duration vs ASM levels with MELM fixed effect --------------
  329. plt.subplot(1,2,1)
  330. # All data poitns collor codign the ASM period
  331. sns.scatterplot(data = stData, x="ASM_lvl", y=rsp,
  332. hue = Cater, palette = palt, hue_order = Hue_Patt)
  333. # Regresion form MELM
  334. X = np.linspace(X_Lim_asm[0], X_Lim_asm[1])
  335. Y = int_eff
  336. Y += X * asm_eff * (asm_pvl < 0.05)
  337. sns.lineplot(x=X, y=Y, color = "red", label = "ASM lvl. - Fixed eff.")
  338. # MArk the Mornal dose period
  339. plt.fill_between(range(X_Lim_asm[0],X_Lim_asm[1]+1), Y_Lim2[0], Y_Lim2[1],
  340. np.array(range(X_Lim_asm[0],X_Lim_asm[1]+1))>=-1,
  341. alpha=0.1, color='k')
  342. plt.xlim(X_Lim_asm)
  343. plt.ylim(Y_Lim2)
  344. plt.ylabel(Y_Label)
  345. plt.xlabel("normalized ASM plasma concentration")
  346. # OInclude sample size and MELM ASM level fixed-effect
  347. plt.title("CMN Seizures (" +
  348. str(stData.shape[0])+ " Szs. | "+
  349. str(len(np.unique(stData.patient_id)))+ " Pts.)" +
  350. "\n MELM - ASM lvl. eff=" + str(round(asm_eff,Stt_Dgt)) +
  351. ", p=" + str(round(asm_pvl,Stt_Dgt)))
  352. # Boxplot of the difference between CMN seizures during Normal and Under dose -
  353. plt.subplot(1,2,2)
  354. # Boxplot of distribution and data poitns segregatin by seizure type and ASM perion
  355. # Same color code and in previous plot
  356. sns.stripplot(data = stData, x=Cater, y=rsp, order = Axs_Patt,
  357. hue = Cater, palette = palt, hue_order = Hue_Patt,
  358. alpha = 0.7, jitter = 0.3)
  359. sns.boxplot(data = stData, x=Cater, y=rsp, order = Axs_Patt,
  360. hue = Cater, palette = palt, hue_order = Hue_Patt,
  361. fill=False, flierprops={"marker": ""})
  362. xl = np.array([-0.5,0,0.5,1,1.5])
  363. # Mark dats corresponding to Normal-dose ASM period
  364. plt.fill_between(xl, Y_Lim2[0], Y_Lim2[1], xl>=0.5, alpha=0.1, color='k')
  365. plt.xlim([xl[0],xl[-1]])
  366. plt.xlabel("")
  367. plt.xticks([])
  368. plt.ylim(Y_Lim2)
  369. plt.ylabel(Y_Label)
  370. # Statistical analysis of Normal-dose vs Under-dose CMN seizure duration
  371. CMN_RankSum = stats.ranksums (stData[rsp][stData.ASM_stt == "Under"],
  372. stData[rsp][stData.ASM_stt == "Normo"])
  373. N = len(stData[rsp][stData.ASM_stt == "Under"]) + len(stData[rsp][stData.ASM_stt == "Normo"])
  374. R_stat = CMN_RankSum.statistic/np.sqrt(N)
  375. # Include statistical results
  376. plt.xlabel("Under vs Normal - Rank Sum R=" + str(round(R_stat,Stt_Dgt)) +
  377. ", p="+ str(round(CMN_RankSum.pvalue,Stt_Dgt)))
  378. # Include sample size
  379. plt.title("CMN Seizures (" +
  380. str(stData.shape[0])+ " Szs. | "+
  381. str(len(np.unique(stData.patient_id)))+ " Pts.)")
  382. if save_fig:
  383. plt.savefig(path_save_fig + "/RLT_cmDS_Durt.svg", format='svg',
  384. dpi=3000, bbox_inches='tight')
  385. plt.savefig(path_save_fig + "/PDF/RLT_cmDS_Durt.pdf", format='pdf',
  386. dpi=3000, bbox_inches='tight')
  387. #%% Supplementary: Under-Dose States Characterization
  388. plt.figure(figsize=[10,5])
  389. # Identify UND seizures
  390. idx = sz_Clust.SzSt == "UND"
  391. # Part 1: Sequence and relative duration of Under-dose Staes ------------------
  392. plt.subplot(1,2,1)
  393. ax = plt.gca()
  394. ax.grid(axis='x',color='k', linestyle=':', linewidth=0.5)
  395. xl = np.array([-20,0,20])
  396. yl = [-0.5,2.5]
  397. # Obtian distribution of Underdose/Common Sates on seizures
  398. # 0.8 corresponds to non present state (n.p.)
  399. pop_hist_seq = pd.DataFrame({"Seq": ["n.p.", "1st", "2nd"],
  400. "Under-dose Stt.": [-sum(sz_Clust.SqSS_Uniq[idx] == 0.8),
  401. -sum(sz_Clust.SqSS_Uniq[idx] == 1),
  402. -sum(sz_Clust.SqSS_Uniq[idx] == 2)],
  403. "Common Stt.": [sum(sz_Clust.SqSS_Comn[idx] == 0.8),
  404. sum(sz_Clust.SqSS_Comn[idx] == 1),
  405. sum(sz_Clust.SqSS_Comn[idx] == 2)]})
  406. # Barplots for Sequence distribution on each ASM periods
  407. sns.barplot(x='Under-dose Stt.', y='Seq', data=pop_hist_seq, order=["2nd", "1st", "n.p."],
  408. orient='h', color="#EB6F3E", lw=0)#, label = 'Under-dose Stt.')
  409. sns.barplot(x='Common Stt.', y='Seq', data=pop_hist_seq, order=["2nd", "1st", "n.p."],
  410. orient='h', color="#531E77", lw=0)#, label = 'Common Stt.')
  411. #plt.legend()
  412. plt.ylabel("sequence(index)")
  413. plt.xlabel("counts(szs.)")
  414. # Mark the Normal-dose related data
  415. plt.fill_between(xl, yl[0], yl[1], xl>=0, alpha=0.1, color='k')
  416. plt.xlim([xl[0],xl[-1]])
  417. plt.ylim([yl[-1],yl[0]])
  418. x_ticks = np.linspace(xl[0], xl[-1],int((xl[-1]-xl[0])/5+1))
  419. plt.xticks(x_ticks,np.abs(x_ticks.astype(int)).astype(str))
  420. plt.title("Seizure States First Appearance")
  421. # Part 2: Relative duration of Under-dose Staes -------------------------------
  422. plt.subplot(1,2,2)
  423. # Obtain the relative duration of Under-dose states
  424. Data = 10**sz_Clust.DSS_Uniq / 10**sz_Clust.DSS_Full * 100
  425. # Boxplot of distribution and data p[oints]
  426. sns.boxplot(y=Data[idx],color = "#EB6F3E",fill=False, flierprops={"marker": ""})
  427. sns.stripplot(y=Data[idx],alpha = 0.7,jitter = 0.3,color = "#EB6F3E", edgecolor='k')
  428. plt.ylim([0,100])
  429. plt.ylabel("Duration (%)")
  430. # Median of the proporstion
  431. plt.xlabel("median proportion = " +str(round(Data[idx].median(),3))+ "%")
  432. plt.title("Tapered-emergent states relative duration" )
  433. if save_fig:
  434. plt.savefig(path_save_fig + "/SUP_UND_Seq_DurCont.svg", format='svg',
  435. dpi=3000, bbox_inches='tight')
  436. plt.savefig(path_save_fig + "/PDF/SUP_UND_Seq_DurCont.pdf", format='pdf',
  437. dpi=3000, bbox_inches='tight')
  438. #%% Supplementary: Common States Characterization
  439. plt.figure(figsize=[12,5])
  440. # Part 1: Number of states within of Common States ----------------------------
  441. plt.subplot(1,2,1)
  442. ax = plt.gca()
  443. ax.grid(axis='x',color='k', linestyle=':', linewidth=0.5)
  444. # Identify CMN seizures with relevant data
  445. rm_dx = sz_Clust.SzSt == "UND"
  446. rm_dx_2 = np.logical_or(np.isnan(sz_Clust.DSS_Full),np.isinf(sz_Clust.DSS_Full))
  447. rm_dx = np.logical_or(rm_dx,rm_dx_2)
  448. Data = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop = True)
  449. # Obatin the distribution of the number of states of each seizure
  450. nss = np.unique(Data.NSS_Comn)[::-1]
  451. n_nss = np.zeros(nss.shape)
  452. u_nss = np.zeros(nss.shape)
  453. for i in range(0,len(nss)):
  454. n_nss[int(i)] = sum(Data.NSS_Comn[Data.ASM_stt == "Normo"] == nss[i])
  455. u_nss[int(i)] = sum(Data.NSS_Comn[Data.ASM_stt == "Under"] == nss[i])
  456. pop_hist_nss = pd.DataFrame({"N. of States": nss,
  457. "Under-dose N. Stt.":-u_nss,
  458. "Normal-dose N. Stt.":n_nss})
  459. # Barplots for Number of States distribution on each ASM periods
  460. sns.barplot(x='Under-dose N. Stt.', y='N. of States', data=pop_hist_nss,
  461. orient='h', color="#1B86AA", lw=0)#, label = 'Under-dose N. Stt.')
  462. sns.barplot(x='Normal-dose N. Stt.', y='N. of States', data=pop_hist_nss,
  463. orient='h', color="#483B73", lw=0)#, label = 'Normal-dose N. Stt.')
  464. plt.ylabel("N. of States")
  465. plt.xlabel("counts(szs.)")
  466. xl = np.array([-45,0,45])
  467. yl = [-0.5,len(nss)-0.5]
  468. plt.fill_between(xl, yl[0], yl[1], xl>=0, alpha=0.1, color='k')
  469. plt.xlim([xl[0],xl[-1]])
  470. plt.ylim([yl[0],yl[-1]])
  471. x_ticks = np.linspace(-40, 40,9)
  472. plt.xticks(x_ticks,np.abs(x_ticks.astype(int)).astype(str))
  473. plt.title("N. of States in seizures(" +
  474. str(Data.shape[0])+ " Szs. | "+
  475. str(len(np.unique(Data.patient_id)))+ " Pts.)")
  476. # Part 2: Contribution to length of states composing Common States ------------
  477. plt.subplot(1,2,2)
  478. # Identifu the contibution of each state to full duration
  479. Full_Seg_L_CrCf = []
  480. Full_Seg_L_CrpV = []
  481. I = np.unique(Data.patient_id)
  482. for Show_id in I:
  483. # Isolate patient data
  484. idx = np.where(Data.patient_id == Show_id)[0]
  485. SSS = [np.array(Data.sss_dx[i].split()).astype(int) for i in idx]
  486. # All states
  487. st_dx = np.unique(np.hstack(SSS))
  488. # Full duration of each seizure
  489. f_Lgt = np.array([len(s) for s in SSS])
  490. # Repository for Speramn Correlation
  491. cr_cf = np.zeros(len(st_dx)) #coefficient
  492. cr_pv = np.zeros(len(st_dx)) #pvalues
  493. cnt = 0
  494. for dx in st_dx:
  495. # Duration of the state on eahc seizure
  496. p_Lgt = np.array([sum(s==dx) for s in SSS])
  497. # Relationship between Full and Patial diration
  498. spearman = stats.spearmanr(f_Lgt,p_Lgt)
  499. cr_cf[cnt] = spearman.statistic
  500. # p-value as significance level [0:3]
  501. cr_pv[cnt] = sum([spearman.pvalue<0.05,
  502. spearman.pvalue<0.01,
  503. spearman.pvalue<0.001])
  504. cnt += 1
  505. Full_Seg_L_CrCf.append(cr_cf)
  506. Full_Seg_L_CrpV.append(cr_pv)
  507. # Scatterplot of Coefficients for each patietns color coding the signifiance
  508. X = np.hstack([np.repeat(I[i], len(Full_Seg_L_CrCf[i])) for i in range(0,len(I))])
  509. Y = np.hstack(Full_Seg_L_CrCf)
  510. H = np.hstack(Full_Seg_L_CrpV)
  511. asdf = sns.scatterplot(x = X.astype(str), y = Y, hue = H,
  512. hue_norm = (0,4), palette="viridis_r")
  513. plt.axhline(0,0,1,color='k', linestyle=":")
  514. plt.title("Full Duration vs Sates Duration")
  515. plt.ylabel("Spearman's Correlation Coefficient")
  516. plt.legend(asdf,title='p-value', loc='lower left', labels=['','n.s.', '<0.05','<0.01','<0.001'])
  517. x_ticks = ["id"+str(i) for i in I]
  518. plt.xticks(np.linspace(0,len(I)-1,len(I)),x_ticks,rotation=30)
  519. if save_fig:
  520. plt.savefig(path_save_fig + "/SUP_CMN_nSST_Corr.svg", format='svg', dpi=3000, bbox_inches='tight')
  521. plt.savefig(path_save_fig + "/PDF/SUP_CMN_nSST_Corr.pdf", format='pdf', dpi=3000, bbox_inches='tight')
  522. #%% Supplementary: Effect of ASM types
  523. # Get the full dataset seizure duration
  524. rsp = "Duration_10"
  525. rm_dx = np.logical_or(np.isnan(sz_Clust[rsp]),np.isinf(sz_Clust[rsp]))
  526. stData = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  527. plt.figure(figsize=[10,5])
  528. palt = "mako"
  529. Hue_Patt = ["CMN_Normo","CMN_Under","UND_Under"]
  530. # ASM types on the dataset
  531. # Type of ASM related to the target
  532. # GB -> Gabba receptor
  533. # SC -> Sodium Channels
  534. # SV -> SVA1 receptor
  535. # ML -> Multitarget
  536. # OT -> Other medication (low representation)
  537. drgt = np.array(['GB', 'ML', 'OT', 'SC', 'SV'])
  538. # Usage of each ASM type across the dataset -----------------------------------
  539. plt.subplot(1,2,1)
  540. # Number of patietns with ASM type tapered
  541. sbj_n = np.zeros(len(drgt))
  542. for i in range(0,len(drgt)):
  543. idx = stData[drgt[i]] == 1
  544. sbj_n[i] = len(np.unique(stData.patient_id[idx]))
  545. sns.barplot(x=drgt,y=sbj_n)
  546. plt.title("ASM type used on tapering")
  547. plt.ylim([0,len(np.unique(stData.patient_id))])
  548. plt.ylabel("N. of Individuals")
  549. plt.yticks(range(0, 29, 2))
  550. plt.grid(visible=True,axis="y")
  551. # Seizure duration segregates by ASM type -------------------------------------
  552. plt.subplot(1,2,2)
  553. for i in range(0,len(drgt)):
  554. # Identify patients with ASM type tapred
  555. idx = stData[drgt[i]] == 1
  556. # Distribution(boxplot) and datapoints fo all seiuzres/patietns identified
  557. # Color code seizure type
  558. sns.stripplot(x=i, y=stData[rsp][idx],legend=False, hue=stData.Sz_Class[idx],
  559. palette=palt, hue_order=Hue_Patt)
  560. sns.boxplot(x=i, y=stData[rsp][idx], fill=False, flierprops={"marker": ""}, color='k')
  561. plt.xticks(range(0,len(drgt)),drgt)
  562. plt.ylim([0,3.5])
  563. plt.ylabel("Duration (log10)")
  564. plt.title("Seizure duration by tapered ASM type")
  565. if save_fig:
  566. plt.savefig(path_save_fig + "/SUP_ASM_Type.svg", format='svg', dpi=3000, bbox_inches='tight')
  567. plt.savefig(path_save_fig + "/PDF/SUP_ASM_Type.pdf", format='pdf', dpi=3000, bbox_inches='tight')
  568. #%% Supplementary: Seizure dutation withouth Cyrc / Ultra dian effect
  569. # Repica of 2nd resutls with changed MELM formula
  570. # Fixed effects only related to ASM levels (No ToD variables included)
  571. prd ="ASM_lvl"
  572. rsp = "DSS_Full"
  573. Y_Lim1 = [0,3]
  574. Y_Lim2 = [0,3]
  575. Y_Label= "Duration (log10)"
  576. X_Lim_asm = [-10,1]
  577. X_Lim_tod = [0,24]
  578. palt = "mako"
  579. Hue_Patt = ["CMN_Normo","CMN_Under","UND_Under"]
  580. Axs_Patt = ["UND_Under","CMN_Under","CMN_Normo"]
  581. Cater = "Sz_Class"
  582. # Data of relevance
  583. rm_dx = np.logical_or(np.isnan(sz_Clust[rsp]),np.isinf(sz_Clust[rsp]))
  584. stData = sz_Clust.drop(np.where(rm_dx)[0]).reset_index(drop=True)
  585. # Fit the MELM
  586. mdl_Chr_Ams_nCrn = smf.mixedlm(rsp + " ~ " + prd , stData, groups=stData.patient_id).fit()
  587. mdl_Chr_Ams_nCrn.summary()
  588. rnd_eff = mdl_Chr_Ams_nCrn.random_effects
  589. int_eff = mdl_Chr_Ams_nCrn.params.Intercept
  590. asm_eff = mdl_Chr_Ams_nCrn.params.ASM_lvl
  591. asm_pvl = mdl_Chr_Ams_nCrn.pvalues.ASM_lvl
  592. # Remove Patient-level group effect
  593. FL = np.repeat(np.nan, stData.shape[0])
  594. for i in rnd_eff.keys():
  595. dt_dx = stData.patient_id == i
  596. if any(dt_dx):
  597. FL[dt_dx] = stData[rsp][dt_dx] - rnd_eff.get(i).Group
  598. Data = stData.copy()
  599. stData[rsp] = FL
  600. # Plt seizure duration vs ASM level with MELM ASM level fixed effect
  601. plt.figure(figsize=[5,5])
  602. sns.scatterplot(data = stData, x="ASM_lvl", y=rsp,
  603. hue = Cater, palette = palt, hue_order = Hue_Patt, legend = False)
  604. X = np.linspace(X_Lim_asm[0], X_Lim_asm[1])
  605. Y = int_eff
  606. Y += X * asm_eff * (asm_pvl < 0.05)
  607. sns.lineplot(x=X, y=Y, color = "red", legend = False)#, label = "ASM lvl. - Fixed eff.")
  608. plt.fill_between(range(X_Lim_asm[0],X_Lim_asm[1]+1), Y_Lim2[0], Y_Lim2[1],
  609. np.array(range(X_Lim_asm[0],X_Lim_asm[1]+1))>=-1,
  610. alpha=0.1, color='k')
  611. plt.xlim(X_Lim_asm)
  612. plt.ylim(Y_Lim2)
  613. plt.ylabel(Y_Label)
  614. plt.xlabel("normalized ASM plasma concentration")
  615. plt.title("All Seizures (" +
  616. str(stData.shape[0])+ " Szs. | "+
  617. str(len(np.unique(stData.patient_id)))+ " Pts.)" +
  618. "\n MELM - ASM lvl. eff=" + str(round(asm_eff,3)) + ", p=" + str(round(asm_pvl,3)))
  619. if save_fig:
  620. plt.savefig(path_save_fig + "/SUP_Durt_SzSt_nCrn.svg", format='svg',
  621. dpi=3000, bbox_inches='tight')
  622. plt.savefig(path_save_fig + "/PDF/SUP_Durt_SzSt_nCrn.pdf", format='pdf',
  623. dpi=3000, bbox_inches='tight')

gmb_SNS_ASM_Dur_V8.py at commit 05e64c0, no license · at the source

Overview

Authors: Guillermo M Besné1, Emmanuel Molefi1, Billy Smith1, Nathan Evans1, Sarah J Gascoigne1, Chris Thornton1, Fahmida A Chowdhury2, Beate Diehl2, John S Duncan2, Andrew W McEvoy2, Anna Miserocchi2, Jane de Tisi2, Matthew C Walker2, Peter N Taylor1,2,3, Yujiang Wang1,2,3
  1. CNNP Lab (www.cnnp-lab.com), School of Computing, Newcastle University, Newcastle upon Tyne NE4 5TG, United Kingdom
  2. Department of Clinical and Experimental Epilepsy, UCL Queen Square Institute of Neurology, University College London, London WC1N 3BG, United Kingdom
  3. Faculty of Medical Sciences, Newcastle University, Newcastle upon Tyne NE1 7RU, United Kingdom
Institutions: Newcastle University (United Kingdom); UCL Queen Square Institute of Neurology (United Kingdom); University College London (United Kingdom)
Journal: Brain communications, volume 8, issue 2, article fcag088
Dates: received 17 June 2025; accepted 12 March 2026; published online 16 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1093/braincomms/fcag088 · PMID 41907313 · PMCID PMC13023363 · OpenAlex W7138212801
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: human (organism), epilepsy (population)
Methods: Spectral & time-frequency, Preprocessing, Connectivity, Statistics, Machine learning, fMRI & imaging, Smoothing, state filtering, decompositions
Keywords: neurophysiology, dynamic states, seizure states, seizure propagation, bifurcation
Topic: Epilepsy research and treatment (Psychiatry and Mental health, Medicine), according to OpenAlex
Citations: not cited yet (Europe PMC); 38 references in the paper

Abstract

Anti-seizure medications (ASMs) can reduce seizure duration, but their precise modes of action are unclear. Specifically, it is unknown whether ASMs shorten seizures by curtailing existing seizure activity early or by selectively suppressing certain seizure activity patterns from emerging. We retrospectively analysed intracranial EEG (iEEG) recordings of 457 seizures from 28 people with epilepsy undergoing ASM tapering. Beyond measuring seizure occurrence and duration, we categorized distinct seizure propagation activity patterns (states) based on spatial and frequency power characteristics and related these to different ASM levels. We found that reducing ASM levels led to increased seizure frequency (r = 0.87, P < 0.001) and longer seizure duration (β = −0.033, P < 0.001), consistent with prior research. Further analysis revealed two distinct mechanisms in which seizures became prolonged: Emergence of new seizure propagation patterns—In ∼40% of patients, ASM tapering unmasked additional seizure activity states, and seizures containing these ‘taper-emergent states’ were substantially longer (r = 0.49, P < 0.001). Prolongation of existing seizure patterns—Even in seizures without taper-emergent states, lower ASM levels still resulted in ∼12–224% longer durations depending on the ASM dosage and tapering (β = −0.049, P < 0.001). ASMs influence seizures through two mechanisms: they (i) suppress specific seizure propagation patterns (states) in an all-or-nothing fashion and (ii) curtail the duration of other seizure patterns. These findings highlight the complex role of ASMs in seizure modulation and could inform personalized dosing strategies for epilepsy management. These findings may also have implications in understanding the effects of ASMs on cognition and mood.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above.

cnnp-lab/2025_ASM-SzState_GMB

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 05e64c0ab2822c31b81574213c44c6d4d45c04d7, 10 March 2025
Languages: Python (1)
Size: 23 files, 1 script
Software Heritage: not archived
Found in: “Data availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (1 file), NumPy (1 file), pandas (1 file), SciPy (1 file), seaborn (1 file), statsmodels (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
2 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;
  • 1 script, each with its path and the digest of its content;
  • no match between paragraphs and code yet;
  • neither the text of the paper nor the code itself.

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

Data

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

Data availability

Anonymized seizure state data and ASM intake schedule, along with analysis code, is available on GitHub: https://github.com/cnnp-lab/2025_ASM-SzState_GMB.

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

Recorded: type, language, journal, volume, issue, pages, dates, 15 authors, 5 keywords, 5 funders, 35 references.

Cite

This paper

Besné, G. M., Molefi, E., Smith, B., Evans, N., Gascoigne, S. J., Thornton, C., Chowdhury, F. A., Diehl, B., Duncan, J. S., McEvoy, A. W., Miserocchi, A., de Tisi, J., Walker, M. C., Taylor, P. N., & Wang, Y. (2026). Dual mechanism of anti-seizure medications in controlling seizure activity. Brain communications, 8(2), fcag088. https://doi.org/10.1093/braincomms/fcag088

BibTeX

@article{besne2026dual,
author = {Besné, Guillermo M and Molefi, Emmanuel and Smith, Billy and Evans, Nathan and Gascoigne, Sarah J and Thornton, Chris and Chowdhury, Fahmida A and Diehl, Beate and Duncan, John S and McEvoy, Andrew W and Miserocchi, Anna and de Tisi, Jane and Walker, Matthew C and Taylor, Peter N and Wang, Yujiang},
title = {{Dual mechanism of anti-seizure medications in controlling seizure activity}},
journal = {Brain communications},
year = {2026},
month = mar,
volume = {8},
number = {2},
pages = {fcag088},
publisher = {Oxford University Press},
issn = {2632-1297},
doi = {10.1093/braincomms/fcag088},
url = {https://doi.org/10.1093/braincomms/fcag088},
pmid = {41907313},
pmcid = {PMC13023363}
}

RIS

TY - JOUR
AU - Besné, Guillermo M
AU - Molefi, Emmanuel
AU - Smith, Billy
AU - Evans, Nathan
AU - Gascoigne, Sarah J
AU - Thornton, Chris
AU - Chowdhury, Fahmida A
AU - Diehl, Beate
AU - Duncan, John S
AU - McEvoy, Andrew W
AU - Miserocchi, Anna
AU - de Tisi, Jane
AU - Walker, Matthew C
AU - Taylor, Peter N
AU - Wang, Yujiang
TI - Dual mechanism of anti-seizure medications in controlling seizure activity
T2 - Brain communications
J2 - Brain Commun
PY - 2026
DA - 2026/03/16
VL - 8
IS - 2
SP - fcag088
SN - 2632-1297
PB - Oxford University Press
DO - 10.1093/braincomms/fcag088
UR - https://doi.org/10.1093/braincomms/fcag088
LA - en
ER -

CSL-JSON

{
"id": "10.1093/braincomms/fcag088",
"type": "article-journal",
"title": "Dual mechanism of anti-seizure medications in controlling seizure activity",
"container-title": "Brain communications",
"author": [
{
"family": "Besné",
"given": "Guillermo M"
},
{
"family": "Molefi",
"given": "Emmanuel"
},
{
"family": "Smith",
"given": "Billy"
},
{
"family": "Evans",
"given": "Nathan"
},
{
"family": "Gascoigne",
"given": "Sarah J"
},
{
"family": "Thornton",
"given": "Chris"
},
{
"family": "Chowdhury",
"given": "Fahmida A"
},
{
"family": "Diehl",
"given": "Beate"
},
{
"family": "Duncan",
"given": "John S"
},
{
"family": "McEvoy",
"given": "Andrew W"
},
{
"family": "Miserocchi",
"given": "Anna"
},
{
"family": "de Tisi",
"given": "Jane"
},
{
"family": "Walker",
"given": "Matthew C"
},
{
"family": "Taylor",
"given": "Peter N"
},
{
"family": "Wang",
"given": "Yujiang"
}
],
"container-title-short": "Brain Commun",
"volume": "8",
"issue": "2",
"page": "fcag088",
"DOI": "10.1093/braincomms/fcag088",
"PMID": "41907313",
"PMCID": "PMC13023363",
"ISSN": "2632-1297",
"publisher": "Oxford University Press",
"URL": "https://doi.org/10.1093/braincomms/fcag088",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
16
]
]
}
}

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.64898/2026.08.18.26360725 [code]
Temporal pole blurring in hippocampal sclerosis reflects seizure-disrupted myelination
Journal: medRxiv (preprint)
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, author John S. Duncan
[2] doi:10.1093/braincomms/fcag120 [code]
The heartbeat evoked potential and the prediction of functional seizure semiology.
Journal: Brain communications
In common: pandas, SciPy, Matplotlib, 1 other tool, epilepsy, author Matthew C Walker
[3] doi:10.1038/s41598-026-44063-w [code]
Neuronal silence as a predictive biomarker and target for epileptic seizures suppression.
Journal: Scientific reports
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, 1 reference
[4] doi:10.1038/s41593-026-02258-4 [code]
Laminar organization of cellular microcircuits modulating human interictal epileptiform discharges.
Journal: Nature neuroscience
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, 1 reference
[5] doi:10.1038/s41598-026-43151-1 [code]
Stabilizing fractional dynamical networks suppresses epileptic seizures.
Journal: Scientific reports
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, 1 reference
[6] doi:10.1016/j.ebiom.2026.106375 [code]
Brainwaves under medication: revealing class-specific neural signatures of psychotropic medication from 24,000 EEGs.
Journal: EBioMedicine
In common: statsmodels, seaborn, pandas, 3 other tools, 1 reference
[7] doi:10.1002/epi4.70336 [code]
Quantifying extra-lesional interhemispheric cortical asymmetry in focal cortical dysplasia type II.
Journal: Epilepsia open
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, 1 reference
[8] doi:10.1007/s00234-026-04103-8 [code]
Enhanced detection of subtle cortical abnormalities in focal epilepsy using 7 T MRI surface-based models and graph neural networks.
Journal: Neuroradiology
In common: statsmodels, seaborn, pandas, 3 other tools, epilepsy, 1 reference
[9] doi:10.1038/s41467-026-75959-w [code]
Charting higher-order models of brain function beyond pairwise interactions.
Journal: Nature communications
In common: statsmodels, seaborn, pandas, 3 other tools, 1 reference
[10] doi:10.1093/brain/awaf317 [code]
High-resolution electrophysiological mapping of effective connectivity of lateral prefrontal cortex.
Journal: Brain : a journal of neurology
In common: statsmodels, pandas, SciPy, 2 other tools, epilepsy, 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.

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.