OSCR

Roles of beta synchronization for motor skill acquisition change after stroke.

Code ↔ Paper

8 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 8 matches
  1. [1] § Materials and methods › Participants and setting ↔ scripts/main_script_beta_R.R, lines 41–83 · score 0.93 · Mini Mental, Fugl Meyer, Action Research Arm, Hole Peg, Upper Extremity, hand grip force
  2. [2] § Materials and methods › Data analysis and statistics › Dependence of the relationship between beta power and improvement on lesion location, beta frequency band and effects of fatigue ↔ scripts/main_script_beta_R.R, lines 318–400 · score 0.73 · 14–20 Hz, 21–29 Hz, cortical lesions, linear model, high beta, 21 Hz
  3. [3] § Results › Results do not depend on lesion location, beta sub-band or definition of improvement ↔ scripts/main_script_beta_R.R, lines 318–400 · score 0.62 · 14–20 Hz, 21–29 Hz, cortical lesions, 21 Hz, beta ERS, interaction
  4. [4] § Materials and methods › Participants and setting ↔ scripts/main_script_beta_R.R, lines 41–83 · score 0.59 · Hole Peg, hand grip force, NHP, Box, ARAT, UEFM
  5. [5] § Materials and methods › Data analysis › Clinical and movement data ↔ scripts/main_script_beta_R.R, lines 85–149 · score 0.59 · hand grip force, best block, movement rate, ARAT, UEFM, ratio
  6. [6] § Results › Clinical scores and structural imaging ↔ scripts/main_script_beta_R.R, lines 85–149 · score 0.56 · grip force ratio, hand grip force, corticospinal, tract, integrity, CST
  7. [7] § Results › Movement-related beta power in stroke survivors and control participants ↔ scripts/functions/cfc_figure_3C_3D.m, lines 25–86 · score 0.52 · 14–28 Hz, 0.6–1.4 s, 0.6 s, 0.3 s, 0.5 s, ERD
  8. [8] § Results › Movement-related beta power in stroke survivors and control participants ↔ scripts/functions/cfc_figure_3C_3D.m, lines 25–86 · score 0.51 · 14–28 Hz, 0.6–1.4 s, window, 0.6 s, 0.3 s, 0.5 s

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

R · 821 lines · 36 KB · no license · 6 matches

  1. # beta ERS and motor skill acquisition
  2. # prepare environment
  3. install.packages('rstatix')
  4. install.packages('emmeans')
  5. install.packages('tidyplots')
  6. install.packages('dplyr')
  7. install.packages('patchwork')
  8. install.packages('ggplot2')
  9. install.packages('ggeffects')
  10. install.packages('RColorBrewer')
  11. install.packages('extrafont')
  12. library(rstatix)
  13. library(emmeans)
  14. library(tidyplots)
  15. library(dplyr)
  16. library(patchwork)
  17. library(ggplot2)
  18. library(ggeffects)
  19. library(RColorBrewer)
  20. library(extrafont)
  21. loadfonts(device = "all")
  22. # load data
  23. setwd("scripts_for_data_availability") # your own path to correct working directory
  24. data <- read.csv("data/subjectlevel_alldata.csv")
  25. ################################################################################
  26. #### PART 1: STATISTICS AND MODELLING ####
  27. ################################################################################
  28. ################################################################################
  29. ### mean and SD of age, month after stroke, clinical scores, integrity of the cortico-spinal-tract, task behavior ###
  30. ################################################################################
  31. # age
  32. mean(data$age[data$group=='stroke'])
  33. sd(data$age[data$group=='stroke'])
  34. mean(data$age[data$group=='control'])
  35. sd(data$age[data$group=='control'])
  36. # month after stroke
  37. mean(data$mas[data$group=='stroke'])
  38. sd(data$mas[data$group=='stroke'])
  39. # Mini Mental Status Exam (MMST)
  40. mean(data$mmst[data$group=='stroke'])
  41. mean(data$mmst[data$group=='control'])
  42. # Upper Extremity Fugl-Meyer Test (UEFM)
  43. mean(data$fmue[data$group=='stroke'])
  44. sd(data$fmue[data$group=='stroke'])
  45. mean(data$fmue[data$group=='control'])
  46. sd(data$fmue[data$group=='control'])
  47. # Action Research Arm Test of performing/affected hand (ARAT)
  48. mean(data$arat_a[data$group=='stroke'])
  49. sd(data$arat_a[data$group=='stroke'])
  50. mean(data$arat_a[data$group=='control'])
  51. sd(data$arat_a[data$group=='control'])
  52. # Box and Blot Test of affected/performing hand (BBT)
  53. mean(data$bbt_a[data$group=='stroke'])
  54. sd(data$bbt_a[data$group=='stroke'])
  55. mean(data$bbt_a[data$group=='control'])
  56. sd(data$bbt_a[data$group=='control'])
  57. # Nine Hole Peg Test of affected/performing hand (NHP)
  58. mean(data$nhp_a[data$group=='stroke'])
  59. sd(data$nhp_a[data$group=='stroke'])
  60. mean(data$nhp_a[data$group=='control'])
  61. sd(data$nhp_a[data$group=='control'])
  62. # Whole hand grip force ratio, i.e. affected(performing)/unaffected(not performing) hand
  63. mean(data$grip_ratio[data$group=='stroke'])
  64. sd(data$grip_ratio[data$group=='stroke'])
  65. mean(data$grip_ratio[data$group=='control'])
  66. sd(data$grip_ratio[data$group=='control'])
  67. # Key grip force ratio, i.e. affected(performing)/unaffected(not performing) hand
  68. mean(data$key_ratio[data$group=='stroke'])
  69. sd(data$key_ratio[data$group=='stroke'])
  70. mean(data$key_ratio[data$group=='control'])
  71. sd(data$key_ratio[data$group=='control'])
  72. # Integrity of the cortico-spinal-tract (CST) ratio, i.e. affected(contralateral to performing)/unaffected(ipsilateral to performing) hemisphere
  73. mean(data$mesencephalon_ratio[data$group=='stroke'], na.rm=TRUE)
  74. sd(data$mesencephalon_ratio[data$group=='stroke'], na.rm=TRUE)
  75. mean(data$mesencephalon_ratio[data$group=='control'])
  76. sd(data$mesencephalon_ratio[data$group=='control'])
  77. # behavior task: movement rate block 1
  78. mean(data$performance_b1[data$group=='stroke'])
  79. sd(data$performance_b1[data$group=='stroke'])
  80. mean(data$performance_b1[data$group=='control'])
  81. sd(data$performance_b1[data$group=='control'])
  82. # behavior task: improvement (first to best block)
  83. mean(data$improvement_perf[data$group=='stroke'])
  84. sd(data$improvement_perf[data$group=='stroke'])
  85. mean(data$improvement_perf[data$group=='control'])
  86. sd(data$improvement_perf[data$group=='control'])
  87. ################################################################################
  88. ### clinical scores, CST, behavior, beta ERD and ERS in pMV: differences between stroke survivors and control participants ###
  89. ################################################################################
  90. ## test for normal distribution with Shapiro-Wilk-Test ##
  91. shapiro.test(data$fmue[data$group=='stroke']) # UEFM
  92. shapiro.test(data$fmue[data$group=='control'])
  93. shapiro.test(data$arat_a[data$group=='stroke']) # ARAT
  94. shapiro.test(data$arat_a[data$group=='control'])
  95. shapiro.test(data$bbt_a[data$group=='stroke']) # BBT
  96. shapiro.test(data$bbt_a[data$group=='control'])
  97. shapiro.test(data$nhp_a[data$group=='stroke']) # NHP
  98. shapiro.test(data$nhp_a[data$group=='control'])
  99. shapiro.test(data$grip_ratio[data$group=='stroke']) # whole hand grip force
  100. shapiro.test(data$grip_ratio[data$group=='control'])
  101. shapiro.test(data$key_ratio[data$group=='stroke']) # key grip force
  102. shapiro.test(data$key_ratio[data$group=='control'])
  103. shapiro.test(data$mesencephalon_ratio[data$group=='stroke']) # CST
  104. shapiro.test(data$mesencephalon_ratio[data$group=='control'])
  105. shapiro.test(data$performance_b1[data$group=='stroke']) # movement rate block 1
  106. shapiro.test(data$performance_b1[data$group=='control'])
  107. shapiro.test(data$performance_b6[data$group=='stroke']) # movement rate block 6
  108. shapiro.test(data$performance_b6[data$group=='control'])
  109. shapiro.test(data$improvement_perf[data$group=='stroke']) # improvement
  110. shapiro.test(data$improvement_perf[data$group=='control'])
  111. shapiro.test(data$pmva_erd_brainnetome[data$group=='stroke']) # beta ERD pMV
  112. shapiro.test(data$pmva_erd_brainnetome[data$group=='control'])
  113. shapiro.test(data$pmva_ers_brainnetome[data$group=='stroke']) # beta ERS pMV
  114. shapiro.test(data$pmva_ers_brainnetome[data$group=='control'])
  115. ## based on Shapiro-Wilk-Test: choose adequate test (T-test or Wilcoxon test) to test group differences ##
  116. # select comparisons
  117. data$group <- factor(data$group,levels = c('stroke','control'), order=TRUE)
  118. my_comparisons=list(c('stroke', 'control'))
  119. # apply tests
  120. wilcox_test(data, fmue ~ group, comparisons=my_comparisons) # UEFM
  121. wilcox_test(data, arat_a ~ group, comparisons=my_comparisons) # ARAT
  122. t_test(data, nhp_a ~ group, comparisons=my_comparisons) # NHP
  123. t_test(data, bbt_a ~ group, comparisons=my_comparisons) # BBT
  124. wilcox_test(data, grip_ratio ~ group, comparisons=my_comparisons) # grip force
  125. t_test(data, key_ratio ~ group, comparisons=my_comparisons) # key grip force
  126. t_test(data, mesencephalon_ratio ~ group, comparisons=my_comparisons) # CST
  127. t_test(data, performance_b1 ~ group, comparisons=my_comparisons) # movement rate block 1
  128. t_test(data, improvement_perf ~ group, comparisons=my_comparisons) # improvement
  129. t_test(data, pmva_erd_brainnetome ~ group, comparisons=my_comparisons) # beta ERD pMV
  130. p=(t_test(data, pmva_erd_brainnetome ~ group, comparisons=my_comparisons))$p # get p value
  131. wilcox_test(data, pmva_ers_brainnetome ~ group, comparisons=my_comparisons) # beta ERS pMV
  132. p[2]=(wilcox_test(data, pmva_ers_brainnetome ~ group, comparisons=my_comparisons))$p # get p value
  133. p.adjust(p, method='bonferroni') # correct for two comparisons
  134. # also compare movement rate between block 1 and block 6 for both groups
  135. t.test(data$performance_b1[data$group=='stroke'], data$performance_b6[data$group=='stroke'], paired=TRUE) # stroke survivors
  136. p=(t.test(data$performance_b1[data$group=='stroke'], data$performance_b6[data$group=='stroke'], paired=TRUE))$p.value
  137. t.test(data$performance_b1[data$group=='control'], data$performance_b6[data$group=='control'], paired=TRUE) # control participants
  138. p[2]=(t.test(data$performance_b1[data$group=='control'], data$performance_b6[data$group=='control'], paired=TRUE))$p.value
  139. p.adjust(p, method='bonferroni') # correct for two comparisons
  140. ################################################################################
  141. ### main model: modeling relation between improvement and maximum cluster beta ERS ###
  142. ################################################################################
  143. #load data
  144. datatmp <- data
  145. # build main model and get summary
  146. model<- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
  147. summary(model)
  148. # check general assumptions for linear models
  149. par(mfrow = c(2, 2)) # Set up the layout of plots
  150. plot(model) # Plot diagnostics for the model
  151. # post-hoc analysis: interaction improvement x group
  152. emm_group <- emmeans(model, ~ improvement_perf * group)
  153. test(emm_group, by = "group")
  154. # clear environment
  155. rm(list=setdiff(ls(), "data")) # rm(list = ls())
  156. ################################################################################
  157. ### testing robustness of the main model ###
  158. ################################################################################
  159. ## organised into calculations (1) - (5) ##
  160. ### (1) outlier testing: rebuilding model after removal of outlier ###
  161. # load data
  162. datatmp <- data
  163. # main model
  164. model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  165. # detect outliers with cook's distance
  166. cooksd <- cooks.distance(model) # calculate cook's distance
  167. plot(cooksd, pch="*", cex=2, main="Influential Obs by Cooks distance") # plot cook's distance
  168. abline(h = 4*mean(cooksd, na.rm=T), col="red") # add cutoff line
  169. text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>4*mean(cooksd, na.rm=T),names(cooksd),""), col="red") # add labels
  170. # remove detected outliers
  171. datatmp <- data %>%
  172. filter(!index==28) %>%
  173. filter(!index==9)
  174. # calculate reduced model without outliers and get summary
  175. modelred<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  176. summary(modelred)
  177. # post-hoc analysis of reduced model
  178. emm_group <- emmeans(modelred, ~ improvement_perf * group)
  179. test(emm_group, by = "group")
  180. # clear environment
  181. rm(list=setdiff(ls(), "data"))
  182. ### (2) outlier testing: Bonferroni Outlier Test ###
  183. #load data
  184. datatmp <- data
  185. # build main model
  186. model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  187. # calculate Bonferroni Outlier Test
  188. car::outlierTest(model)
  189. # clear environment
  190. rm(list=setdiff(ls(), "data"))
  191. ### (3) leave-one-out analysis ###
  192. #load data
  193. datatmp <- data
  194. # build main model
  195. model<- lm(cluster_ers_max ~ performance_b1 + performed_hand + improvement_perf*group, data=datatmp)
  196. # define model formula
  197. model_formula <- cluster_ers_max ~ performance_b1 + performed_hand + improvement_perf*group
  198. # initialize a vector to store p-values for the interaction term
  199. loo_pvalues <- numeric(nrow(datatmp))
  200. ## perform leave-one-out analysis ##
  201. for (i in 1:nrow(datatmp)) {
  202. # Exclude the i-th observation
  203. train_data <- datatmp[-i, ]
  204. # fit the model on the remaining data
  205. loo_model <- lm(model_formula, data = train_data)
  206. # extract the p-value of the interaction term if it exists
  207. interaction_term <- "improvement_perf:groupstroke"
  208. if (interaction_term %in% rownames(summary(loo_model)$coefficients)) {
  209. loo_pvalues[i] <- summary(loo_model)$coefficients[interaction_term, "Pr(>|t|)"]
  210. } else {
  211. loo_pvalues[i] <- NA # Assign NA if the term is not present
  212. }
  213. }
  214. # output the p-values for the interaction term
  215. loo_pvalues
  216. # clear environment
  217. rm(list=setdiff(ls(), "data"))
  218. ### (4) recalculating the model with only stroke survivors with (a) subcortical and (b) cortical lesions ###
  219. ## (4a) only stroke survivors with subcortical lesions ##
  220. # load data and select only stroke survivors with subcortical lesions
  221. datatmp <-data %>%
  222. filter(index!=7) %>%
  223. filter(index!=11) %>%
  224. filter(index!=14)
  225. # build model with only stroke survivors with subcortical lesions and get summary
  226. model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  227. summary(model)
  228. # check general assumptions for linear models of model with only stroke survivors with subcortical lesions
  229. par(mfrow = c(2, 2)) # Set up the layout of plots
  230. plot(model) # Plot diagnostics for the model
  231. # post-hoc analysis for model with only stroke survivors with subcortical lesions: interaction improvement x group
  232. emm_group <- emmeans(model, ~ improvement_perf * group)
  233. test(emm_group, by = "group")
  234. # clear environment
  235. rm(list=setdiff(ls(), "data"))
  236. ## (4b) only stroke survivors with cortical lesions ##
  237. # load data and select only stroke survivors with cortical lesions
  238. datatmp <-data %>%
  239. filter(index==7|index==11|index==14|group=="control")
  240. # build model with only stroke survivors with cortical lesions and get summary
  241. model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  242. summary(model)
  243. # check general assumptions for linear models of model with only stroke survivors with cortical lesions
  244. par(mfrow = c(2, 2)) # Set up the layout of plots
  245. plot(model) # Plot diagnostics for the model
  246. # post-hoc analysis for model with only stroke survivors with cortical lesions: interaction improvement x group
  247. emm_group <- emmeans(model, ~ improvement_perf * group)
  248. test(emm_group, by = "group")
  249. # clear environment
  250. rm(list=setdiff(ls(), "data"))
  251. ### (5) recalculating the model with only stroke survivors with (a) low beta ERS and (b) high beta ERS ###
  252. ## (5a) low beta ERS (14 - 20 Hz) ##
  253. # load data
  254. datatmp <- data
  255. # build model with low beta ERS and get summary
  256. model<- lm(cluster_ers_0_01_max_low ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  257. summary(model)
  258. # check general assumptions for linear models of model with low beta ERS
  259. par(mfrow = c(2, 2)) # Set up the layout of plots
  260. plot(model) # Plot diagnostics for the model
  261. # post-hoc analysis for model with low beta ERS: interaction improvement x group
  262. emm_group <- emmeans(model, ~ improvement_perf * group)
  263. test(emm_group, by = "group")
  264. # clear environment
  265. rm(list=setdiff(ls(), "data"))
  266. ## (5b) high beta ERS (21 - 29 Hz) ##
  267. # load data
  268. datatmp <- data
  269. # build model with high beta ERS and get summary
  270. model<- lm(cluster_ers_0_01_max_high ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
  271. summary(model)
  272. # check general assumptions for linear models of model with high beta ERS
  273. par(mfrow = c(2, 2)) # Set up the layout of plots
  274. plot(model) # Plot diagnostics for the model
  275. # post-hoc analysis for model with high beta ERS: interaction improvement x group
  276. emm_group <- emmeans(model, ~ improvement_perf * group)
  277. test(emm_group, by = "group")
  278. # clear environment
  279. rm(list=setdiff(ls(), "data"))
  280. ################################################################################
  281. ### exploratory analysis ###
  282. ################################################################################
  283. ## prepare data and environment ##
  284. # load data
  285. datatmp <- data
  286. # select parameters to include in model
  287. vars <- list("fmue", "arat_a", "bbt_a", "nhp_a", "grip_ratio", "key_ratio", "mesencephalon_ratio", "age")
  288. names <- list("UEFM", "ARAT", "BBT", "NHP", "grip force", "key grip force", "CST", "Age") # list of names of parameters
  289. # build exploratory model with improvement x group x parameter interaction
  290. allModelsList <- lapply(paste("cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*group*", vars), as.formula)
  291. # function to extract p value of the whole model
  292. overall_p <- function(my_model) {
  293. f <- summary(my_model)$fstatistic
  294. p <- pf(f[1],f[2],f[3],lower.tail=F)
  295. attributes(p) <- NULL
  296. return(p)}
  297. ## calculate exploratory model for all selected parameters and extract results##
  298. # get coefficients: p-values of each term in model
  299. allModelsResults_1 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[1,4], error=function(e) NaN)) # coefficients model p-value: intercept
  300. allModelsResults_2 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[2,4], error=function(e) NaN)) # coefficients model p-value: performed hand r
  301. allModelsResults_3 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[3,4], error=function(e) NaN)) # coefficients model p-value: movement rate block 1
  302. allModelsResults_4 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[4,4], error=function(e) NaN)) # coefficients model p-value: improvement
  303. allModelsResults_5 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[5,4], error=function(e) NaN)) # coefficients model p-value: group stroke survivors
  304. allModelsResults_6 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[6,4], error=function(e) NaN)) # coefficients model p-value: parameter
  305. allModelsResults_7 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[7,4], error=function(e) NaN)) # coefficients model p-value: improvement * group stroke
  306. allModelsResults_8 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[8,4], error=function(e) NaN)) # coefficients p-value: improvement * parameter
  307. allModelsResults_9 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[9,4], error=function(e) NaN)) # coefficients p-value: group stroke * parameter
  308. allModelsResults_10 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[10,4], error=function(e) NaN)) # coefficients p-value: improvement * group stroke * parameter
  309. # get coefficients: SE of each term in model
  310. allModelsResults_1SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[1,2], error=function(e) NaN)) # coefficients model SE: intercept
  311. allModelsResults_2SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[2,2], error=function(e) NaN)) # coefficients model SE: performed hand r
  312. allModelsResults_3SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[3,2], error=function(e) NaN)) # coefficients model SE: movement rate block 1
  313. allModelsResults_4SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[4,2], error=function(e) NaN)) # coefficients model SE: improvement
  314. allModelsResults_5SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[5,2], error=function(e) NaN)) # coefficients model SE: group stroke survivors
  315. allModelsResults_6SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[6,2], error=function(e) NaN)) # coefficients model SE: parameter
  316. allModelsResults_7SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[7,2], error=function(e) NaN)) # coefficients model SE: improvement * group stroke
  317. allModelsResults_8SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[8,2], error=function(e) NaN)) # coefficients SE: improvement * parameter
  318. allModelsResults_9SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[9,2], error=function(e) NaN)) # coefficients SE: group stroke * parameter
  319. allModelsResults_10SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[10,2], error=function(e) NaN)) # coefficients SE: improvement * group stroke * parameter
  320. # get overall p-value, F-statistics and R-squared of each model
  321. allModelsResultsR <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$r.squared, error=function(e) NaN)) # R-squared
  322. allModelsResultsF <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$fstatistic[1], error=function(e) NaN)) # F-statistics
  323. allModelsResults <- lapply(allModelsList, function(x) tryCatch(overall_p(lm(x, data = data)), error=function(e) NaN)) # overall p-value of model
  324. ## results of exploratory analysis ##
  325. # summaries results in one data frame
  326. df <- data.frame(Parameters=(unlist(vars)),
  327. Intercept_p=unlist(allModelsResults_1),
  328. performed_handr_p=unlist(allModelsResults_2),
  329. performance_b1_p=unlist(allModelsResults_3),
  330. improvement_perf_p=unlist(allModelsResults_4),
  331. groupstroke_p=unlist(allModelsResults_5),
  332. varaiable_p=unlist(allModelsResults_6),
  333. improvement_perf_groupstroke_p=unlist(allModelsResults_7),
  334. improvement_perf_variable_p=unlist(allModelsResults_8),
  335. groupstroke_variable_p=unlist(allModelsResults_9),
  336. improvement_perf_groupstroke_variabl_p=unlist(allModelsResults_10),
  337. Rsquared=unlist(allModelsResultsR),
  338. Fstat=unlist(allModelsResultsF),
  339. model_p=unlist(allModelsResults),
  340. Intercept_SE=unlist(allModelsResults_1SE),
  341. performed_handr_SE=unlist(allModelsResults_2SE),
  342. performance_b1_SE=unlist(allModelsResults_3SE),
  343. improvement_SE=unlist(allModelsResults_4SE),
  344. groupstroke_SE=unlist(allModelsResults_5SE),
  345. varaiable_SE=unlist(allModelsResults_6SE),
  346. improvement_perf_groupstroke_SE=unlist(allModelsResults_7SE),
  347. improvement_perf_variable_SE=unlist(allModelsResults_8SE),
  348. groupstroke_variable_SE=unlist(allModelsResults_9SE),
  349. improvement_perf_groupstroke_variabl_SE=unlist(allModelsResults_10SE))
  350. df = t(df)
  351. # output results
  352. df
  353. # clear environment
  354. rm(list=setdiff(ls(), "data"))
  355. ################################################################################
  356. ### further analysis of results of exploratory analysis: improvement x group x BBT interaction ###
  357. ################################################################################
  358. # load data
  359. datatmp <- data
  360. # build model with improvement x group x BBT interaction an get summary
  361. model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*group*bbt_a, data=datatmp)
  362. summary(model)
  363. # check general assumptions for linear models
  364. par(mfrow = c(2, 2)) # Set up the layout of plots
  365. plot(model) # Plot diagnostics for the model
  366. # post-hoc test to check for group differences
  367. emmeans_result <- emmeans(model, pairwise ~ group|improvement_perf*bbt_a)
  368. summary(emmeans_result, adjust = "turkey")
  369. ### as groups differ significantly in post-hoc test: recalculate improvement x BBT interaction model for each group separately ###
  370. ## control participants ##
  371. # select group
  372. datatmp <-data %>%
  373. filter(group=="control")
  374. # calculate model and get summary
  375. model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*bbt_a, data=datatmp)
  376. summary(model)
  377. # check general assumptions for linear models
  378. par(mfrow = c(2, 2)) # Set up the layout of plots
  379. plot(model) # Plot diagnostics for the model
  380. ## stroke survivors ##
  381. # select group
  382. datatmp <-data %>%
  383. filter(group=="stroke")
  384. # calculate model and get summary
  385. model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*bbt_a, data=datatmp)
  386. summary(model)
  387. # check general assumptions for linear models
  388. par(mfrow = c(2, 2)) # Set up the layout of plots
  389. plot(model) # Plot diagnostics for the model
  390. # clear environment
  391. rm(list=setdiff(ls(), "data"))
  392. ################################################################################
  393. #### PART 2: PLOTTING ####
  394. ################################################################################
  395. ################################################################################
  396. ### figure 1B, 1C, 1D and supplementary figure 1B ###
  397. ################################################################################
  398. ### create function for plotting ###
  399. myboxplot <- function(data, yparameter, stat_test, title, ytitle, limits=NULL) {
  400. group_colors <- c("stroke" = "#0072c7", "control" = "#f39f18") # select group colors
  401. data <- data %>%
  402. mutate(group = factor(group, levels = c("stroke", "control"))) # swap the order of the groups
  403. plot <- data |>
  404. tidyplot(x=group, y=!!sym(yparameter), color=group) |>
  405. add_data_points_jitter(data = filter_rows(group=="stroke"), shape = 16,
  406. alpha=0.8, size=0.3, jitter_width =1) |>
  407. add_data_points_jitter(data = filter_rows(group=="control"), shape = 17,
  408. alpha=0.8, size=0.3, jitter_width =1) |>
  409. add_boxplot(show_outliers = FALSE) |>
  410. add_test_asterisks(method = stat_test,hide_info = TRUE,
  411. family = "Arial", label.size = 6/ggplot2::.pt) |>
  412. adjust_font(family = "Arial", fontsize=6) |>
  413. adjust_colors(new_colors = group_colors) |>
  414. adjust_title(title) |>
  415. remove_x_axis_ticks() |>
  416. remove_x_axis_labels() |>
  417. remove_x_axis_title() |>
  418. adjust_y_axis_title(ytitle) |>
  419. adjust_y_axis(limits=limits) |>
  420. remove_legend() |>
  421. adjust_size(width = 11, height = 20, unit = "mm")
  422. return(plot)
  423. }
  424. ### plot figure 1 ###
  425. # load data
  426. datatmp <- data
  427. # create plots
  428. uefm <- myboxplot(datatmp, "fmue", "wilcoxon", "UEFM", "score")
  429. arat <- myboxplot(datatmp, "arat_a", "wilcoxon", "ARAT", "score")
  430. grip <- myboxplot(datatmp, "grip_ratio", "t_test", "grip force", "ratio")
  431. keygrip <- myboxplot(datatmp, "key_ratio", "t_test", "key grip force", "ratio", c(0.53, 1.42))
  432. nhp <- myboxplot(datatmp, "nhp_a", "t_test", "NHP", "pegs/s")
  433. bbt <- myboxplot(datatmp, "bbt_a", "t_test", "BBT", "blocks/min")
  434. cst <- myboxplot(datatmp, "mesencephalon_ratio", "t_test", "CST", "ratio")
  435. # combine figure
  436. figure_1_BCD <- (uefm | arat | bbt | nhp) / (grip | keygrip | cst )
  437. # output figure
  438. figure_1_BCD
  439. # eventually save figure
  440. #ggsave("figures/fig_1B_1C_1D.svg",
  441. # plot = plot, width = 180, height = 80, units = "mm", device = "svg", dpi = 300)
  442. ### plot supplementary figure 1B ###
  443. erd_pmv <- myboxplot(datatmp, "pmva_erd_brainnetome", "t_test", "PMv beta ERD", "relative power")
  444. ers_pmv <- myboxplot(datatmp, "pmva_ers_brainnetome", "wilcoxon", "PMv beta ERS", "relative power")
  445. # combine figure
  446. suppl_figure_1B <- erd_pmv | ers_pmv
  447. # output figure
  448. suppl_figure_1B
  449. # clear environment
  450. rm(list=setdiff(ls(), "data"))
  451. ################################################################################
  452. ### figure 4D & figure 5 ###
  453. ################################################################################
  454. ### create function for plotting ###
  455. mypredictionplot <- function(data, model, prediction_terms, yparameter, ytitle, title=NULL) {
  456. pred_data <- ggpredict(model, terms = prediction_terms) # calculate prediction
  457. plot <- ggplot() +
  458. geom_point(data = data, aes(x = improvement_perf, y=!!sym(yparameter), shape = group, color = group), size = 1, alpha = 0.8) +
  459. scale_shape_manual(values = c("stroke" = 16, "control" = 17)) +
  460. geom_line(data = pred_data, aes(x = x, y = predicted, color = group), linewidth = 0.236) +
  461. geom_ribbon(data = pred_data, aes(x = x, ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.15) +
  462. scale_color_manual(values = c("stroke" = "#0072c7", "control" = "#f39f18")) +
  463. scale_fill_manual(values = c("stroke" = "#0072c7", "control" = "#f39f18"),name="fill") +
  464. labs(title = title,
  465. x = "improvement (%)",
  466. y = ytitle,
  467. shape = "group",
  468. color = "group") +
  469. theme_classic()+
  470. theme(legend.position = "none", text = element_text(family = "Arial", size = 6),
  471. axis.text=element_text(colour="black", size=6),
  472. axis.line = element_line(linewidth = 0.236),
  473. axis.ticks = element_line(size = 0.236),
  474. plot.title = element_text(size = 6, family = "Arial"))
  475. return(plot)
  476. }
  477. ### plot figure 4D (main model) ###
  478. # load data
  479. datatmp <- data
  480. # create model and plot
  481. model <- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand, data=datatmp)
  482. figure_4D <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS")
  483. # output figure 4D
  484. figure_4D
  485. # eventually save figure
  486. #ggsave("figures/fig_4D.svg",
  487. # plot = figure_4D, width = 45, height = 55, units = "mm", device = "svg", dpi = 300)
  488. ### plot figure 5 ###
  489. ## plot model with only stroke survivors with subcortical lesions ##
  490. # load data
  491. datatmp <- data %>%
  492. filter(index!=7) %>%
  493. filter(index!=11) %>%
  494. filter(index!=14)
  495. # create model and plot
  496. model <- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
  497. subcortical <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS", "subgroup stroke survivors:\nsubcortical lesions")
  498. ## plot model with only stroke survivors with cortical lesions ##
  499. # load data
  500. datatmp <- data %>%
  501. filter(index==7|index==11|index==14|group=="control")
  502. # create model and plot
  503. model<- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
  504. cortical <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS", "subgroup stroke survivors:\ncortical lesions")
  505. ## plot model with low beta ERS ##
  506. # load data
  507. datatmp <- data
  508. # create model and plot
  509. model <- lm(cluster_ers_0_01_max_low ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
  510. low_beta <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_0_01_max_low", "cluster ERS", "low frequency beta")
  511. ## plot model with high beta ERS ##
  512. # load data
  513. datatmp <- data
  514. # create model and plot
  515. model<- lm(cluster_ers_0_01_max_high ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
  516. high_beta <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_0_01_max_high", "cluster ERS", "high frequency beta")
  517. ## combine plots for figure 5 ##
  518. figure_5 <- subcortical + cortical + low_beta + high_beta + plot_layout(ncol = 2)
  519. # output figure 5
  520. figure_5
  521. #eventually save figure 5
  522. #ggsave("figures/fig_5_R.svg",
  523. # plot = figure_5, width = 80, height = 80, units = "mm", device = "svg", dpi = 300)
  524. # clear environment
  525. rm(list=setdiff(ls(), "data"))
  526. ################################################################################
  527. ### figure 6 ###
  528. ################################################################################
  529. # load data
  530. datatmp <- data
  531. ## define color palettes (outside loop) ##
  532. # line/ribbon colors
  533. control_line_colors <- brewer.pal(9, "Oranges")[c(5, 8)]
  534. stroke_line_colors <- brewer.pal(9, "Blues")[c(5, 8)]
  535. # point colors (lighter/darker shades for below/above median)
  536. control_point_colors <- setNames(brewer.pal(9, "Oranges")[c(4, 7)], c("below median", "above median"))
  537. stroke_point_colors <- setNames(brewer.pal(9, "Blues")[c(4, 7)], c("below median", "above median"))
  538. ## create list to store plots ##
  539. plot_list <- list()
  540. ### loop through specified groups ###
  541. groups_to_process <- c("control", "stroke")
  542. for (g in groups_to_process) {
  543. # subset data for the current group
  544. group_data <- subset(datatmp, group == g)
  545. # print(paste("--- Processing Group:", g, "---")) # Optional progress indicator
  546. # calculate median split values & labels *within* the group
  547. group_median_bbt_a <- median(group_data$bbt_a, na.rm = TRUE)
  548. mean_bbt_a_low <- mean(group_data$bbt_a[group_data$bbt_a < group_median_bbt_a], na.rm = TRUE)
  549. mean_bbt_a_high <- mean(group_data$bbt_a[group_data$bbt_a >= group_median_bbt_a], na.rm = TRUE)
  550. # define the split values and labels based on group calculations
  551. split_values <- c(mean_bbt_a_low, mean_bbt_a_high)
  552. split_values_legend_labels <- c(paste("below med (avg:", round(split_values[1], 1), ")"),
  553. paste("above med (avg:", round(split_values[2], 1), ")"))
  554. # add BBT split group column based on GROUP median
  555. group_data <- group_data %>%
  556. mutate(bbt_a = as.numeric(bbt_a)) %>%
  557. mutate(bbt_a_split_group = factor(ifelse(bbt_a < group_median_bbt_a, "below median", "above median"),
  558. levels = c("below median", "above median"))) %>%
  559. filter(!is.na(bbt_a_split_group)) # keep only rows with valid split group
  560. ## model fitting and prediction ##
  561. # fit the model on the original subset for the group
  562. model_fit_data <- subset(datatmp, group == g)
  563. group_model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf * bbt_a,
  564. data = model_fit_data)
  565. summary(group_model)
  566. # use ggpredict with the group-specific split_values
  567. pred_data <- ggpredict(group_model, terms = c("improvement_perf", paste0("bbt_a [", paste(split_values, collapse=","), "]")))
  568. # map prediction levels to the group-specific legend labels
  569. label_map <- setNames(split_values_legend_labels, as.character(round(split_values, 6)))
  570. if (is.factor(pred_data$group)) {
  571. numeric_group_vals <- as.numeric(levels(pred_data$group))[pred_data$group]
  572. } else {
  573. numeric_group_vals <- as.numeric(pred_data$group)
  574. }
  575. group_vals_for_lookup <- as.character(round(numeric_group_vals, 6))
  576. pred_data$bbt_a_level <- factor(label_map[group_vals_for_lookup], levels = split_values_legend_labels)
  577. ## plotting ##
  578. # assign colors (based on group 'g')
  579. current_line_colors <- if (tolower(g) == "control") control_line_colors else stroke_line_colors
  580. current_fill_colors <- current_line_colors
  581. current_point_palette <- if (tolower(g) == "control") control_point_colors else stroke_point_colors
  582. namegroup <- if (tolower(g) == "control") c("control participants") else c("stroke survivors")
  583. # build the ggplot80
  584. p <- ggplot() +
  585. # layers for lines/ribbons
  586. geom_ribbon(data = pred_data, aes(x = x, ymin = conf.low, ymax = conf.high, fill = bbt_a_level), alpha = 0.15) +
  587. geom_line(data = pred_data, aes(x = x, y = predicted, color = bbt_a_level), linewidth = 0.236) +
  588. scale_color_manual(values = current_line_colors, name = "prediction (BBT)", labels = levels(pred_data$bbt_a_level)) +
  589. scale_fill_manual(values = current_fill_colors, name = "prediction (BBT)", labels = levels(pred_data$bbt_a_level)) +
  590. # new color scale for points
  591. ggnewscale::new_scale_color() +
  592. # layers for points (using group_data with the group-specific split)
  593. geom_point(data = group_data, aes(x = improvement_perf, y = cluster_ers_max, color = bbt_a_split_group), size = 1, shape = 16) +
  594. # hide point legend using guide = "none"
  595. scale_color_manual(values = current_point_palette, name = "Data Points (BBT)", labels = levels(group_data$bbt_a_split_group), na.translate = FALSE,
  596. guide = "none") +
  597. # labels, title, theme
  598. labs(x = "improvement (%)", y = "cluster ERS", title = paste(namegroup)) +
  599. theme_bw() +
  600. theme(aspect.ratio = 1, # Square plot panel
  601. legend.position = "bottom") # Legend at bottom
  602. plot_list[[as.character(g)]] <- p
  603. } # end of loop
  604. ### combine the plots ###
  605. # directly attempt combination assuming both plots were generated
  606. combined_plot <- plot_list[["control"]] + plot_list[["stroke"]] +
  607. plot_layout(ncol = 2, guides = 'collect') & # collect the single active legend
  608. theme_classic()+
  609. theme(legend.position = 'bottom', legend.title.position = "top", legend.text = element_text(size=6),legend.justification = c("left"),legend.direction="vertical",
  610. legend.key.size = unit(0.3, 'cm'),
  611. text = element_text(family = "Arial", size = 6),
  612. axis.text=element_text(colour="black"),
  613. axis.line = element_line(linewidth = 0.236),
  614. axis.ticks = element_line(linewidth = 0.236),
  615. plot.title = element_text(size = 6, family = "Arial"))
  616. combined_plot <- combined_plot +
  617. plot_annotation(title = "Interaction (group-specific median split) between improvement and BBT",
  618. theme = theme(plot.title = element_text(family= "Arial", size= 6, face = "bold", hjust = 0.5),
  619. plot.margin = margin(t = 20, r = 5, b = 5, l = 5)))
  620. # output final plot
  621. print(combined_plot)
  622. # eventually save plot
  623. #ggsave("figures/fig_6_R.svg",
  624. # plot = combined_plot, width = 80, height = 70, units = "mm", device = "svg", dpi = 300)
  625. # clear environment
  626. rm(list=setdiff(ls(), "data"))

main_script_beta_R.R at commit 5e8450d, no license · at the source

Overview

Authors: Lena S Timmsen1,2, Benjamin Haverland1,2, Silke Wolf1, Charlotte J Stagg3,4, Jan Feldheim1, The Vinh Luu1, Robert Schulz1, Till R Schneider2, Fanny Quandt1, Bettina C Schwab1,5
  1. Department of Neurology, University Medical Center Hamburg-Eppendorf, Hamburg 20246, Germany
  2. Department of Neurophysiology and Pathophysiology, University Medical Center Hamburg-Eppendorf, Hamburg 20246, Germany
  3. Oxford Centre for Integrative Neuroimaging, FMRIB, Nuffield Department of Clinical Neurosciences, University of Oxford, Oxford OX3 9DU, UK
  4. UKRI Medical Research Council Brain Network Dynamics Unit, Nuffield Department of Clinical Neurosciences, University of Oxford, Oxford OX3 9DU, UK
  5. Biomedical Signals and Systems, Technical Medical Centre, University of Twente, Enschede 7522 NB, The Netherlands
Journal: Brain communications, volume 8, issue 2, article fcag077
Dates: received 1 October 2025; accepted 10 March 2026; published online 11 March 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1093/braincomms/fcag077 · PMID 41884601 · PMCID PMC13010071 · OpenAlex W7135088789
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: MEG (modality), human (organism), stroke (population)
Methods: Spectral & time-frequency, Statistics, Smoothing, state filtering, decompositions, Source localization, Physiology & signal measures, fMRI & imaging
Keywords: stroke, MEG, beta ERS, motor skill acquisition, source reconstruction
Topic: Motor Control and Adaptation (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Citations: not cited yet (Europe PMC); 54 references in the paper

Abstract

Beta event-related synchronization (ERS) following movement has been associated with motor skill acquisition in healthy individuals, yet its role in stroke recovery remains unclear. Given the prevalence of motor impairments after stroke, understanding how beta ERS relates to motor skill acquisition in this population is of significant clinical relevance, especially in view of emerging opportunities for neuromodulation. In this cohort study, we investigated whole-brain beta ERS during a feedback-guided motor skill acquisition task using magnetoencephalography (MEG) in 14 well-recovered stroke survivors in the chronic phase and 15 age-eligible healthy control participants. Motor ability was assessed with standardized clinical scales, and structural brain metrics were derived from magnetic resonance imaging. MEG data were projected into source space to enable comprehensive cluster-based analyses across the cortex. While stroke survivors exhibited significantly lower overall task performance, their capacity for motor skill acquisition did not significantly differ from that of control participants. In healthy participants, motor skill acquisition was strongly and positively associated with beta ERS in a cluster encompassing bilateral sensorimotor areas, which was absent in stroke survivors. Instead, stroke survivors showed a trend towards a negative association of motor skill acquisition with beta ERS. An exploratory analysis revealed that among various clinical and structural measures, only the Box and Block Test, a measure of gross manual dexterity, significantly moderated the association between beta ERS and motor skill acquisition. These findings suggest that although stroke survivors may retain the ability to acquire motor skills, the underlying neural mechanisms can be altered. In healthy adults with high manual dexterity, beta ERS appears to support short-term motor skill acquisition, whereas at lower dexterity levels, alternative mechanisms may compensate to sustain skill acquisition.

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

gitlab.rrz.uni-hamburg.de/xeni/beta-synchronisation-after-stroke

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 5e8450d9d127143fbca330a31743ebd7d12eec5c, 29 September 2025
Languages: MATLAB (9), R (1)
Size: 63 files, 10 scripts
Software Heritage: not archived
Found in: “Data availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: FieldTrip (7 files), Statistics and Machine Learning Toolbox (2 files), car (1 file), emmeans (1 file), ggplot2 (1 file), patchwork (1 file), rstatix (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
11 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;
  • 10 scripts, each with its path and the digest of its content;
  • 8 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

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

Data

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

Data availability

Data and code for this study are available via GitLab (https://gitlab.rrz.uni-hamburg.de/xeni/beta-synchronisation-after-stroke).

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, 10 authors, 5 keywords, 6 funders, 53 references.

Cite

This paper

Timmsen, L. S., Haverland, B., Wolf, S., Stagg, C. J., Feldheim, J., Luu, T. V., Schulz, R., Schneider, T. R., Quandt, F., & Schwab, B. C. (2026). Roles of beta synchronization for motor skill acquisition change after stroke. Brain communications, 8(2), fcag077. https://doi.org/10.1093/braincomms/fcag077

BibTeX

@article{timmsen2026roles,
author = {Timmsen, Lena S and Haverland, Benjamin and Wolf, Silke and Stagg, Charlotte J and Feldheim, Jan and Luu, The Vinh and Schulz, Robert and Schneider, Till R and Quandt, Fanny and Schwab, Bettina C},
title = {{Roles of beta synchronization for motor skill acquisition change after stroke}},
journal = {Brain communications},
year = {2026},
month = mar,
volume = {8},
number = {2},
pages = {fcag077},
publisher = {Oxford University Press},
issn = {2632-1297},
doi = {10.1093/braincomms/fcag077},
url = {https://doi.org/10.1093/braincomms/fcag077},
pmid = {41884601},
pmcid = {PMC13010071}
}

RIS

TY - JOUR
AU - Timmsen, Lena S
AU - Haverland, Benjamin
AU - Wolf, Silke
AU - Stagg, Charlotte J
AU - Feldheim, Jan
AU - Luu, The Vinh
AU - Schulz, Robert
AU - Schneider, Till R
AU - Quandt, Fanny
AU - Schwab, Bettina C
TI - Roles of beta synchronization for motor skill acquisition change after stroke
T2 - Brain communications
J2 - Brain Commun
PY - 2026
DA - 2026/03/11
VL - 8
IS - 2
SP - fcag077
SN - 2632-1297
PB - Oxford University Press
DO - 10.1093/braincomms/fcag077
UR - https://doi.org/10.1093/braincomms/fcag077
LA - en
ER -

CSL-JSON

{
"id": "10.1093/braincomms/fcag077",
"type": "article-journal",
"title": "Roles of beta synchronization for motor skill acquisition change after stroke",
"container-title": "Brain communications",
"author": [
{
"family": "Timmsen",
"given": "Lena S"
},
{
"family": "Haverland",
"given": "Benjamin"
},
{
"family": "Wolf",
"given": "Silke"
},
{
"family": "Stagg",
"given": "Charlotte J"
},
{
"family": "Feldheim",
"given": "Jan"
},
{
"family": "Luu",
"given": "The Vinh"
},
{
"family": "Schulz",
"given": "Robert"
},
{
"family": "Schneider",
"given": "Till R"
},
{
"family": "Quandt",
"given": "Fanny"
},
{
"family": "Schwab",
"given": "Bettina C"
}
],
"container-title-short": "Brain Commun",
"volume": "8",
"issue": "2",
"page": "fcag077",
"DOI": "10.1093/braincomms/fcag077",
"PMID": "41884601",
"PMCID": "PMC13010071",
"ISSN": "2632-1297",
"publisher": "Oxford University Press",
"URL": "https://doi.org/10.1093/braincomms/fcag077",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
11
]
]
}
}

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/s41467-026-75799-8 [code]
Behaviourally driven closed-loop beta-tACS enhances beta activity and motor behaviour.
Journal: Nature communications
In common: car, FieldTrip, emmeans, 3 other tools, 5 references
[2] doi:10.1093/braincomms/fcag043 [code]
Linking movement-related beta oscillations to cortical excitability, structural damage, and fatigue in multiple sclerosis.
Journal: Brain communications
In common: FieldTrip, Statistics and Machine Learning Toolbox, 7 references
[3] doi:10.1523/eneuro.0076-26.2026 [code]
Exogenously Driven Neural Reactivation of Spatially Matching Visual Working-Memory Contents.
Journal: eNeuro
In common: rstatix, car, FieldTrip, 4 other tools, 1 reference
[4] doi:10.64898/2026.03.06.710026 [code]
Distinct beta burst motifs exhibit opposing error relationships during motor adaptation
Journal: bioRxiv (preprint)
In common: car, FieldTrip, emmeans, 2 other tools, 2 references
[5] doi:10.64898/2026.05.08.26348885 [code]
Insights from nine nights of self-applied, low-density sleep EEG during sleep restriction therapy: a proof-of-concept evaluation
Journal: medRxiv (preprint)
In common: rstatix, FieldTrip, emmeans, 4 other tools, 1 reference
[6] doi:10.1016/j.isci.2026.116458 [code]
Neural tracking of prosodic and statistical rhythms jointly supports artificial language learning.
Journal: iScience
In common: FieldTrip, emmeans, Statistics and Machine Learning Toolbox, 2 other tools, 3 references
[7] doi:10.1016/j.neuroimage.2026.122115 [code]
Midfrontal theta power relates to response speeding following frustrative nonreward.
Journal: NeuroImage
In common: rstatix, car, emmeans, 4 other tools
[8] doi:10.1038/s41597-026-07350-9 [code]
An open multi-center MEG-EEG dataset for studying conscious visual perception.
Journal: Scientific data
In common: car, emmeans, Statistics and Machine Learning Toolbox, 2 other tools, MEG, 2 references
[9] doi:10.1371/journal.pbio.3003979 [code]
Impaired midfrontal‑motor theta phase synchronization characterizes maladaptive motivational behavior in people with obsessive‑compulsive disorder.
Journal: PLoS biology
In common: car, FieldTrip, emmeans, 3 other tools, 1 reference
[10] doi:10.7554/elife.107088 [code]
Development of auditory and spontaneous movement responses to music over the first postnatal year.
Journal: eLife
In common: car, FieldTrip, emmeans, 3 other tools, 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.