Roles of beta synchronization for motor skill acquisition change after stroke.
The 8 matches
- [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] § 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] § 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] § 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] § 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] § 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] § 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] § 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
- # beta ERS and motor skill acquisition
- # prepare environment
- install.packages('rstatix')
- install.packages('emmeans')
- install.packages('tidyplots')
- install.packages('dplyr')
- install.packages('patchwork')
- install.packages('ggplot2')
- install.packages('ggeffects')
- install.packages('RColorBrewer')
- install.packages('extrafont')
- library(rstatix)
- library(emmeans)
- library(tidyplots)
- library(dplyr)
- library(patchwork)
- library(ggplot2)
- library(ggeffects)
- library(RColorBrewer)
- library(extrafont)
- loadfonts(device = "all")
- # load data
- setwd("scripts_for_data_availability") # your own path to correct working directory
- data <- read.csv("data/subjectlevel_alldata.csv")
- ################################################################################
- #### PART 1: STATISTICS AND MODELLING ####
- ################################################################################
- ################################################################################
- ### mean and SD of age, month after stroke, clinical scores, integrity of the cortico-spinal-tract, task behavior ###
- ################################################################################
- # age
- mean(data$age[data$group=='stroke'])
- sd(data$age[data$group=='stroke'])
- mean(data$age[data$group=='control'])
- sd(data$age[data$group=='control'])
- # month after stroke
- mean(data$mas[data$group=='stroke'])
- sd(data$mas[data$group=='stroke'])
- # Mini Mental Status Exam (MMST)
- mean(data$mmst[data$group=='stroke'])
- mean(data$mmst[data$group=='control'])
- # Upper Extremity Fugl-Meyer Test (UEFM)
- mean(data$fmue[data$group=='stroke'])
- sd(data$fmue[data$group=='stroke'])
- mean(data$fmue[data$group=='control'])
- sd(data$fmue[data$group=='control'])
- # Action Research Arm Test of performing/affected hand (ARAT)
- mean(data$arat_a[data$group=='stroke'])
- sd(data$arat_a[data$group=='stroke'])
- mean(data$arat_a[data$group=='control'])
- sd(data$arat_a[data$group=='control'])
- # Box and Blot Test of affected/performing hand (BBT)
- mean(data$bbt_a[data$group=='stroke'])
- sd(data$bbt_a[data$group=='stroke'])
- mean(data$bbt_a[data$group=='control'])
- sd(data$bbt_a[data$group=='control'])
- # Nine Hole Peg Test of affected/performing hand (NHP)
- mean(data$nhp_a[data$group=='stroke'])
- sd(data$nhp_a[data$group=='stroke'])
- mean(data$nhp_a[data$group=='control'])
- sd(data$nhp_a[data$group=='control'])
- # Whole hand grip force ratio, i.e. affected(performing)/unaffected(not performing) hand
- mean(data$grip_ratio[data$group=='stroke'])
- sd(data$grip_ratio[data$group=='stroke'])
- mean(data$grip_ratio[data$group=='control'])
- sd(data$grip_ratio[data$group=='control'])
- # Key grip force ratio, i.e. affected(performing)/unaffected(not performing) hand
- mean(data$key_ratio[data$group=='stroke'])
- sd(data$key_ratio[data$group=='stroke'])
- mean(data$key_ratio[data$group=='control'])
- sd(data$key_ratio[data$group=='control'])
- # Integrity of the cortico-spinal-tract (CST) ratio, i.e. affected(contralateral to performing)/unaffected(ipsilateral to performing) hemisphere
- mean(data$mesencephalon_ratio[data$group=='stroke'], na.rm=TRUE)
- sd(data$mesencephalon_ratio[data$group=='stroke'], na.rm=TRUE)
- mean(data$mesencephalon_ratio[data$group=='control'])
- sd(data$mesencephalon_ratio[data$group=='control'])
- # behavior task: movement rate block 1
- mean(data$performance_b1[data$group=='stroke'])
- sd(data$performance_b1[data$group=='stroke'])
- mean(data$performance_b1[data$group=='control'])
- sd(data$performance_b1[data$group=='control'])
- # behavior task: improvement (first to best block)
- mean(data$improvement_perf[data$group=='stroke'])
- sd(data$improvement_perf[data$group=='stroke'])
- mean(data$improvement_perf[data$group=='control'])
- sd(data$improvement_perf[data$group=='control'])
- ################################################################################
- ### clinical scores, CST, behavior, beta ERD and ERS in pMV: differences between stroke survivors and control participants ###
- ################################################################################
- ## test for normal distribution with Shapiro-Wilk-Test ##
- shapiro.test(data$fmue[data$group=='stroke']) # UEFM
- shapiro.test(data$fmue[data$group=='control'])
- shapiro.test(data$arat_a[data$group=='stroke']) # ARAT
- shapiro.test(data$arat_a[data$group=='control'])
- shapiro.test(data$bbt_a[data$group=='stroke']) # BBT
- shapiro.test(data$bbt_a[data$group=='control'])
- shapiro.test(data$nhp_a[data$group=='stroke']) # NHP
- shapiro.test(data$nhp_a[data$group=='control'])
- shapiro.test(data$grip_ratio[data$group=='stroke']) # whole hand grip force
- shapiro.test(data$grip_ratio[data$group=='control'])
- shapiro.test(data$key_ratio[data$group=='stroke']) # key grip force
- shapiro.test(data$key_ratio[data$group=='control'])
- shapiro.test(data$mesencephalon_ratio[data$group=='stroke']) # CST
- shapiro.test(data$mesencephalon_ratio[data$group=='control'])
- shapiro.test(data$performance_b1[data$group=='stroke']) # movement rate block 1
- shapiro.test(data$performance_b1[data$group=='control'])
- shapiro.test(data$performance_b6[data$group=='stroke']) # movement rate block 6
- shapiro.test(data$performance_b6[data$group=='control'])
- shapiro.test(data$improvement_perf[data$group=='stroke']) # improvement
- shapiro.test(data$improvement_perf[data$group=='control'])
- shapiro.test(data$pmva_erd_brainnetome[data$group=='stroke']) # beta ERD pMV
- shapiro.test(data$pmva_erd_brainnetome[data$group=='control'])
- shapiro.test(data$pmva_ers_brainnetome[data$group=='stroke']) # beta ERS pMV
- shapiro.test(data$pmva_ers_brainnetome[data$group=='control'])
- ## based on Shapiro-Wilk-Test: choose adequate test (T-test or Wilcoxon test) to test group differences ##
- # select comparisons
- data$group <- factor(data$group,levels = c('stroke','control'), order=TRUE)
- my_comparisons=list(c('stroke', 'control'))
- # apply tests
- wilcox_test(data, fmue ~ group, comparisons=my_comparisons) # UEFM
- wilcox_test(data, arat_a ~ group, comparisons=my_comparisons) # ARAT
- t_test(data, nhp_a ~ group, comparisons=my_comparisons) # NHP
- t_test(data, bbt_a ~ group, comparisons=my_comparisons) # BBT
- wilcox_test(data, grip_ratio ~ group, comparisons=my_comparisons) # grip force
- t_test(data, key_ratio ~ group, comparisons=my_comparisons) # key grip force
- t_test(data, mesencephalon_ratio ~ group, comparisons=my_comparisons) # CST
- t_test(data, performance_b1 ~ group, comparisons=my_comparisons) # movement rate block 1
- t_test(data, improvement_perf ~ group, comparisons=my_comparisons) # improvement
- t_test(data, pmva_erd_brainnetome ~ group, comparisons=my_comparisons) # beta ERD pMV
- p=(t_test(data, pmva_erd_brainnetome ~ group, comparisons=my_comparisons))$p # get p value
- wilcox_test(data, pmva_ers_brainnetome ~ group, comparisons=my_comparisons) # beta ERS pMV
- p[2]=(wilcox_test(data, pmva_ers_brainnetome ~ group, comparisons=my_comparisons))$p # get p value
- p.adjust(p, method='bonferroni') # correct for two comparisons
- # also compare movement rate between block 1 and block 6 for both groups
- t.test(data$performance_b1[data$group=='stroke'], data$performance_b6[data$group=='stroke'], paired=TRUE) # stroke survivors
- p=(t.test(data$performance_b1[data$group=='stroke'], data$performance_b6[data$group=='stroke'], paired=TRUE))$p.value
- t.test(data$performance_b1[data$group=='control'], data$performance_b6[data$group=='control'], paired=TRUE) # control participants
- p[2]=(t.test(data$performance_b1[data$group=='control'], data$performance_b6[data$group=='control'], paired=TRUE))$p.value
- p.adjust(p, method='bonferroni') # correct for two comparisons
- ################################################################################
- ### main model: modeling relation between improvement and maximum cluster beta ERS ###
- ################################################################################
- #load data
- datatmp <- data
- # build main model and get summary
- model<- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
- summary(model)
- # check general assumptions for linear models
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc analysis: interaction improvement x group
- emm_group <- emmeans(model, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data")) # rm(list = ls())
- ################################################################################
- ### testing robustness of the main model ###
- ################################################################################
- ## organised into calculations (1) - (5) ##
- ### (1) outlier testing: rebuilding model after removal of outlier ###
- # load data
- datatmp <- data
- # main model
- model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- # detect outliers with cook's distance
- cooksd <- cooks.distance(model) # calculate cook's distance
- plot(cooksd, pch="*", cex=2, main="Influential Obs by Cooks distance") # plot cook's distance
- abline(h = 4*mean(cooksd, na.rm=T), col="red") # add cutoff line
- text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>4*mean(cooksd, na.rm=T),names(cooksd),""), col="red") # add labels
- # remove detected outliers
- datatmp <- data %>%
- filter(!index==28) %>%
- filter(!index==9)
- # calculate reduced model without outliers and get summary
- modelred<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- summary(modelred)
- # post-hoc analysis of reduced model
- emm_group <- emmeans(modelred, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ### (2) outlier testing: Bonferroni Outlier Test ###
- #load data
- datatmp <- data
- # build main model
- model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- # calculate Bonferroni Outlier Test
- car::outlierTest(model)
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ### (3) leave-one-out analysis ###
- #load data
- datatmp <- data
- # build main model
- model<- lm(cluster_ers_max ~ performance_b1 + performed_hand + improvement_perf*group, data=datatmp)
- # define model formula
- model_formula <- cluster_ers_max ~ performance_b1 + performed_hand + improvement_perf*group
- # initialize a vector to store p-values for the interaction term
- loo_pvalues <- numeric(nrow(datatmp))
- ## perform leave-one-out analysis ##
- for (i in 1:nrow(datatmp)) {
- # Exclude the i-th observation
- train_data <- datatmp[-i, ]
- # fit the model on the remaining data
- loo_model <- lm(model_formula, data = train_data)
- # extract the p-value of the interaction term if it exists
- interaction_term <- "improvement_perf:groupstroke"
- if (interaction_term %in% rownames(summary(loo_model)$coefficients)) {
- loo_pvalues[i] <- summary(loo_model)$coefficients[interaction_term, "Pr(>|t|)"]
- } else {
- loo_pvalues[i] <- NA # Assign NA if the term is not present
- }
- }
- # output the p-values for the interaction term
- loo_pvalues
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ### (4) recalculating the model with only stroke survivors with (a) subcortical and (b) cortical lesions ###
- ## (4a) only stroke survivors with subcortical lesions ##
- # load data and select only stroke survivors with subcortical lesions
- datatmp <-data %>%
- filter(index!=7) %>%
- filter(index!=11) %>%
- filter(index!=14)
- # build model with only stroke survivors with subcortical lesions and get summary
- model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- summary(model)
- # check general assumptions for linear models of model with only stroke survivors with subcortical lesions
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc analysis for model with only stroke survivors with subcortical lesions: interaction improvement x group
- emm_group <- emmeans(model, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ## (4b) only stroke survivors with cortical lesions ##
- # load data and select only stroke survivors with cortical lesions
- datatmp <-data %>%
- filter(index==7|index==11|index==14|group=="control")
- # build model with only stroke survivors with cortical lesions and get summary
- model<- lm(cluster_ers_max ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- summary(model)
- # check general assumptions for linear models of model with only stroke survivors with cortical lesions
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc analysis for model with only stroke survivors with cortical lesions: interaction improvement x group
- emm_group <- emmeans(model, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ### (5) recalculating the model with only stroke survivors with (a) low beta ERS and (b) high beta ERS ###
- ## (5a) low beta ERS (14 - 20 Hz) ##
- # load data
- datatmp <- data
- # build model with low beta ERS and get summary
- model<- lm(cluster_ers_0_01_max_low ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- summary(model)
- # check general assumptions for linear models of model with low beta ERS
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc analysis for model with low beta ERS: interaction improvement x group
- emm_group <- emmeans(model, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ## (5b) high beta ERS (21 - 29 Hz) ##
- # load data
- datatmp <- data
- # build model with high beta ERS and get summary
- model<- lm(cluster_ers_0_01_max_high ~ improvement_perf*group + performance_b1 + performed_hand, data=datatmp)
- summary(model)
- # check general assumptions for linear models of model with high beta ERS
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc analysis for model with high beta ERS: interaction improvement x group
- emm_group <- emmeans(model, ~ improvement_perf * group)
- test(emm_group, by = "group")
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ################################################################################
- ### exploratory analysis ###
- ################################################################################
- ## prepare data and environment ##
- # load data
- datatmp <- data
- # select parameters to include in model
- vars <- list("fmue", "arat_a", "bbt_a", "nhp_a", "grip_ratio", "key_ratio", "mesencephalon_ratio", "age")
- names <- list("UEFM", "ARAT", "BBT", "NHP", "grip force", "key grip force", "CST", "Age") # list of names of parameters
- # build exploratory model with improvement x group x parameter interaction
- allModelsList <- lapply(paste("cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*group*", vars), as.formula)
- # function to extract p value of the whole model
- overall_p <- function(my_model) {
- f <- summary(my_model)$fstatistic
- p <- pf(f[1],f[2],f[3],lower.tail=F)
- attributes(p) <- NULL
- return(p)}
- ## calculate exploratory model for all selected parameters and extract results##
- # get coefficients: p-values of each term in model
- allModelsResults_1 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[1,4], error=function(e) NaN)) # coefficients model p-value: intercept
- 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
- 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
- allModelsResults_4 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[4,4], error=function(e) NaN)) # coefficients model p-value: improvement
- 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
- allModelsResults_6 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[6,4], error=function(e) NaN)) # coefficients model p-value: parameter
- 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
- allModelsResults_8 <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = datatmp))$coefficients[8,4], error=function(e) NaN)) # coefficients p-value: improvement * parameter
- 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
- 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
- # get coefficients: SE of each term in model
- allModelsResults_1SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[1,2], error=function(e) NaN)) # coefficients model SE: intercept
- 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
- 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
- allModelsResults_4SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[4,2], error=function(e) NaN)) # coefficients model SE: improvement
- 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
- allModelsResults_6SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[6,2], error=function(e) NaN)) # coefficients model SE: parameter
- 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
- allModelsResults_8SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[8,2], error=function(e) NaN)) # coefficients SE: improvement * parameter
- allModelsResults_9SE <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$coefficients[9,2], error=function(e) NaN)) # coefficients SE: group stroke * parameter
- 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
- # get overall p-value, F-statistics and R-squared of each model
- allModelsResultsR <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$r.squared, error=function(e) NaN)) # R-squared
- allModelsResultsF <- lapply(allModelsList, function(x) tryCatch(summary(lm(x, data = data))$fstatistic[1], error=function(e) NaN)) # F-statistics
- allModelsResults <- lapply(allModelsList, function(x) tryCatch(overall_p(lm(x, data = data)), error=function(e) NaN)) # overall p-value of model
- ## results of exploratory analysis ##
- # summaries results in one data frame
- df <- data.frame(Parameters=(unlist(vars)),
- Intercept_p=unlist(allModelsResults_1),
- performed_handr_p=unlist(allModelsResults_2),
- performance_b1_p=unlist(allModelsResults_3),
- improvement_perf_p=unlist(allModelsResults_4),
- groupstroke_p=unlist(allModelsResults_5),
- varaiable_p=unlist(allModelsResults_6),
- improvement_perf_groupstroke_p=unlist(allModelsResults_7),
- improvement_perf_variable_p=unlist(allModelsResults_8),
- groupstroke_variable_p=unlist(allModelsResults_9),
- improvement_perf_groupstroke_variabl_p=unlist(allModelsResults_10),
- Rsquared=unlist(allModelsResultsR),
- Fstat=unlist(allModelsResultsF),
- model_p=unlist(allModelsResults),
- Intercept_SE=unlist(allModelsResults_1SE),
- performed_handr_SE=unlist(allModelsResults_2SE),
- performance_b1_SE=unlist(allModelsResults_3SE),
- improvement_SE=unlist(allModelsResults_4SE),
- groupstroke_SE=unlist(allModelsResults_5SE),
- varaiable_SE=unlist(allModelsResults_6SE),
- improvement_perf_groupstroke_SE=unlist(allModelsResults_7SE),
- improvement_perf_variable_SE=unlist(allModelsResults_8SE),
- groupstroke_variable_SE=unlist(allModelsResults_9SE),
- improvement_perf_groupstroke_variabl_SE=unlist(allModelsResults_10SE))
- df = t(df)
- # output results
- df
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ################################################################################
- ### further analysis of results of exploratory analysis: improvement x group x BBT interaction ###
- ################################################################################
- # load data
- datatmp <- data
- # build model with improvement x group x BBT interaction an get summary
- model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*group*bbt_a, data=datatmp)
- summary(model)
- # check general assumptions for linear models
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # post-hoc test to check for group differences
- emmeans_result <- emmeans(model, pairwise ~ group|improvement_perf*bbt_a)
- summary(emmeans_result, adjust = "turkey")
- ### as groups differ significantly in post-hoc test: recalculate improvement x BBT interaction model for each group separately ###
- ## control participants ##
- # select group
- datatmp <-data %>%
- filter(group=="control")
- # calculate model and get summary
- model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*bbt_a, data=datatmp)
- summary(model)
- # check general assumptions for linear models
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- ## stroke survivors ##
- # select group
- datatmp <-data %>%
- filter(group=="stroke")
- # calculate model and get summary
- model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf*bbt_a, data=datatmp)
- summary(model)
- # check general assumptions for linear models
- par(mfrow = c(2, 2)) # Set up the layout of plots
- plot(model) # Plot diagnostics for the model
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ################################################################################
- #### PART 2: PLOTTING ####
- ################################################################################
- ################################################################################
- ### figure 1B, 1C, 1D and supplementary figure 1B ###
- ################################################################################
- ### create function for plotting ###
- myboxplot <- function(data, yparameter, stat_test, title, ytitle, limits=NULL) {
- group_colors <- c("stroke" = "#0072c7", "control" = "#f39f18") # select group colors
- data <- data %>%
- mutate(group = factor(group, levels = c("stroke", "control"))) # swap the order of the groups
- plot <- data |>
- tidyplot(x=group, y=!!sym(yparameter), color=group) |>
- add_data_points_jitter(data = filter_rows(group=="stroke"), shape = 16,
- alpha=0.8, size=0.3, jitter_width =1) |>
- add_data_points_jitter(data = filter_rows(group=="control"), shape = 17,
- alpha=0.8, size=0.3, jitter_width =1) |>
- add_boxplot(show_outliers = FALSE) |>
- add_test_asterisks(method = stat_test,hide_info = TRUE,
- family = "Arial", label.size = 6/ggplot2::.pt) |>
- adjust_font(family = "Arial", fontsize=6) |>
- adjust_colors(new_colors = group_colors) |>
- adjust_title(title) |>
- remove_x_axis_ticks() |>
- remove_x_axis_labels() |>
- remove_x_axis_title() |>
- adjust_y_axis_title(ytitle) |>
- adjust_y_axis(limits=limits) |>
- remove_legend() |>
- adjust_size(width = 11, height = 20, unit = "mm")
- return(plot)
- }
- ### plot figure 1 ###
- # load data
- datatmp <- data
- # create plots
- uefm <- myboxplot(datatmp, "fmue", "wilcoxon", "UEFM", "score")
- arat <- myboxplot(datatmp, "arat_a", "wilcoxon", "ARAT", "score")
- grip <- myboxplot(datatmp, "grip_ratio", "t_test", "grip force", "ratio")
- keygrip <- myboxplot(datatmp, "key_ratio", "t_test", "key grip force", "ratio", c(0.53, 1.42))
- nhp <- myboxplot(datatmp, "nhp_a", "t_test", "NHP", "pegs/s")
- bbt <- myboxplot(datatmp, "bbt_a", "t_test", "BBT", "blocks/min")
- cst <- myboxplot(datatmp, "mesencephalon_ratio", "t_test", "CST", "ratio")
- # combine figure
- figure_1_BCD <- (uefm | arat | bbt | nhp) / (grip | keygrip | cst )
- # output figure
- figure_1_BCD
- # eventually save figure
- #ggsave("figures/fig_1B_1C_1D.svg",
- # plot = plot, width = 180, height = 80, units = "mm", device = "svg", dpi = 300)
- ### plot supplementary figure 1B ###
- erd_pmv <- myboxplot(datatmp, "pmva_erd_brainnetome", "t_test", "PMv beta ERD", "relative power")
- ers_pmv <- myboxplot(datatmp, "pmva_ers_brainnetome", "wilcoxon", "PMv beta ERS", "relative power")
- # combine figure
- suppl_figure_1B <- erd_pmv | ers_pmv
- # output figure
- suppl_figure_1B
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ################################################################################
- ### figure 4D & figure 5 ###
- ################################################################################
- ### create function for plotting ###
- mypredictionplot <- function(data, model, prediction_terms, yparameter, ytitle, title=NULL) {
- pred_data <- ggpredict(model, terms = prediction_terms) # calculate prediction
- plot <- ggplot() +
- geom_point(data = data, aes(x = improvement_perf, y=!!sym(yparameter), shape = group, color = group), size = 1, alpha = 0.8) +
- scale_shape_manual(values = c("stroke" = 16, "control" = 17)) +
- geom_line(data = pred_data, aes(x = x, y = predicted, color = group), linewidth = 0.236) +
- geom_ribbon(data = pred_data, aes(x = x, ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.15) +
- scale_color_manual(values = c("stroke" = "#0072c7", "control" = "#f39f18")) +
- scale_fill_manual(values = c("stroke" = "#0072c7", "control" = "#f39f18"),name="fill") +
- labs(title = title,
- x = "improvement (%)",
- y = ytitle,
- shape = "group",
- color = "group") +
- theme_classic()+
- theme(legend.position = "none", text = element_text(family = "Arial", size = 6),
- axis.text=element_text(colour="black", size=6),
- axis.line = element_line(linewidth = 0.236),
- axis.ticks = element_line(size = 0.236),
- plot.title = element_text(size = 6, family = "Arial"))
- return(plot)
- }
- ### plot figure 4D (main model) ###
- # load data
- datatmp <- data
- # create model and plot
- model <- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand, data=datatmp)
- figure_4D <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS")
- # output figure 4D
- figure_4D
- # eventually save figure
- #ggsave("figures/fig_4D.svg",
- # plot = figure_4D, width = 45, height = 55, units = "mm", device = "svg", dpi = 300)
- ### plot figure 5 ###
- ## plot model with only stroke survivors with subcortical lesions ##
- # load data
- datatmp <- data %>%
- filter(index!=7) %>%
- filter(index!=11) %>%
- filter(index!=14)
- # create model and plot
- model <- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
- subcortical <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS", "subgroup stroke survivors:\nsubcortical lesions")
- ## plot model with only stroke survivors with cortical lesions ##
- # load data
- datatmp <- data %>%
- filter(index==7|index==11|index==14|group=="control")
- # create model and plot
- model<- lm(cluster_ers_max ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
- cortical <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_max", "cluster ERS", "subgroup stroke survivors:\ncortical lesions")
- ## plot model with low beta ERS ##
- # load data
- datatmp <- data
- # create model and plot
- model <- lm(cluster_ers_0_01_max_low ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
- low_beta <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_0_01_max_low", "cluster ERS", "low frequency beta")
- ## plot model with high beta ERS ##
- # load data
- datatmp <- data
- # create model and plot
- model<- lm(cluster_ers_0_01_max_high ~ improvement_perf*group+performance_b1+performed_hand,data=datatmp)
- high_beta <- mypredictionplot(datatmp, model, c("improvement_perf", "group"), "cluster_ers_0_01_max_high", "cluster ERS", "high frequency beta")
- ## combine plots for figure 5 ##
- figure_5 <- subcortical + cortical + low_beta + high_beta + plot_layout(ncol = 2)
- # output figure 5
- figure_5
- #eventually save figure 5
- #ggsave("figures/fig_5_R.svg",
- # plot = figure_5, width = 80, height = 80, units = "mm", device = "svg", dpi = 300)
- # clear environment
- rm(list=setdiff(ls(), "data"))
- ################################################################################
- ### figure 6 ###
- ################################################################################
- # load data
- datatmp <- data
- ## define color palettes (outside loop) ##
- # line/ribbon colors
- control_line_colors <- brewer.pal(9, "Oranges")[c(5, 8)]
- stroke_line_colors <- brewer.pal(9, "Blues")[c(5, 8)]
- # point colors (lighter/darker shades for below/above median)
- control_point_colors <- setNames(brewer.pal(9, "Oranges")[c(4, 7)], c("below median", "above median"))
- stroke_point_colors <- setNames(brewer.pal(9, "Blues")[c(4, 7)], c("below median", "above median"))
- ## create list to store plots ##
- plot_list <- list()
- ### loop through specified groups ###
- groups_to_process <- c("control", "stroke")
- for (g in groups_to_process) {
- # subset data for the current group
- group_data <- subset(datatmp, group == g)
- # print(paste("--- Processing Group:", g, "---")) # Optional progress indicator
- # calculate median split values & labels *within* the group
- group_median_bbt_a <- median(group_data$bbt_a, na.rm = TRUE)
- mean_bbt_a_low <- mean(group_data$bbt_a[group_data$bbt_a < group_median_bbt_a], na.rm = TRUE)
- mean_bbt_a_high <- mean(group_data$bbt_a[group_data$bbt_a >= group_median_bbt_a], na.rm = TRUE)
- # define the split values and labels based on group calculations
- split_values <- c(mean_bbt_a_low, mean_bbt_a_high)
- split_values_legend_labels <- c(paste("below med (avg:", round(split_values[1], 1), ")"),
- paste("above med (avg:", round(split_values[2], 1), ")"))
- # add BBT split group column based on GROUP median
- group_data <- group_data %>%
- mutate(bbt_a = as.numeric(bbt_a)) %>%
- mutate(bbt_a_split_group = factor(ifelse(bbt_a < group_median_bbt_a, "below median", "above median"),
- levels = c("below median", "above median"))) %>%
- filter(!is.na(bbt_a_split_group)) # keep only rows with valid split group
- ## model fitting and prediction ##
- # fit the model on the original subset for the group
- model_fit_data <- subset(datatmp, group == g)
- group_model <- lm(cluster_ers_max ~ performed_hand + performance_b1 + improvement_perf * bbt_a,
- data = model_fit_data)
- summary(group_model)
- # use ggpredict with the group-specific split_values
- pred_data <- ggpredict(group_model, terms = c("improvement_perf", paste0("bbt_a [", paste(split_values, collapse=","), "]")))
- # map prediction levels to the group-specific legend labels
- label_map <- setNames(split_values_legend_labels, as.character(round(split_values, 6)))
- if (is.factor(pred_data$group)) {
- numeric_group_vals <- as.numeric(levels(pred_data$group))[pred_data$group]
- } else {
- numeric_group_vals <- as.numeric(pred_data$group)
- }
- group_vals_for_lookup <- as.character(round(numeric_group_vals, 6))
- pred_data$bbt_a_level <- factor(label_map[group_vals_for_lookup], levels = split_values_legend_labels)
- ## plotting ##
- # assign colors (based on group 'g')
- current_line_colors <- if (tolower(g) == "control") control_line_colors else stroke_line_colors
- current_fill_colors <- current_line_colors
- current_point_palette <- if (tolower(g) == "control") control_point_colors else stroke_point_colors
- namegroup <- if (tolower(g) == "control") c("control participants") else c("stroke survivors")
- # build the ggplot80
- p <- ggplot() +
- # layers for lines/ribbons
- geom_ribbon(data = pred_data, aes(x = x, ymin = conf.low, ymax = conf.high, fill = bbt_a_level), alpha = 0.15) +
- geom_line(data = pred_data, aes(x = x, y = predicted, color = bbt_a_level), linewidth = 0.236) +
- scale_color_manual(values = current_line_colors, name = "prediction (BBT)", labels = levels(pred_data$bbt_a_level)) +
- scale_fill_manual(values = current_fill_colors, name = "prediction (BBT)", labels = levels(pred_data$bbt_a_level)) +
- # new color scale for points
- ggnewscale::new_scale_color() +
- # layers for points (using group_data with the group-specific split)
- geom_point(data = group_data, aes(x = improvement_perf, y = cluster_ers_max, color = bbt_a_split_group), size = 1, shape = 16) +
- # hide point legend using guide = "none"
- scale_color_manual(values = current_point_palette, name = "Data Points (BBT)", labels = levels(group_data$bbt_a_split_group), na.translate = FALSE,
- guide = "none") +
- # labels, title, theme
- labs(x = "improvement (%)", y = "cluster ERS", title = paste(namegroup)) +
- theme_bw() +
- theme(aspect.ratio = 1, # Square plot panel
- legend.position = "bottom") # Legend at bottom
- plot_list[[as.character(g)]] <- p
- } # end of loop
- ### combine the plots ###
- # directly attempt combination assuming both plots were generated
- combined_plot <- plot_list[["control"]] + plot_list[["stroke"]] +
- plot_layout(ncol = 2, guides = 'collect') & # collect the single active legend
- theme_classic()+
- theme(legend.position = 'bottom', legend.title.position = "top", legend.text = element_text(size=6),legend.justification = c("left"),legend.direction="vertical",
- legend.key.size = unit(0.3, 'cm'),
- text = element_text(family = "Arial", size = 6),
- axis.text=element_text(colour="black"),
- axis.line = element_line(linewidth = 0.236),
- axis.ticks = element_line(linewidth = 0.236),
- plot.title = element_text(size = 6, family = "Arial"))
- combined_plot <- combined_plot +
- plot_annotation(title = "Interaction (group-specific median split) between improvement and BBT",
- theme = theme(plot.title = element_text(family= "Arial", size= 6, face = "bold", hjust = 0.5),
- plot.margin = margin(t = 20, r = 5, b = 5, l = 5)))
- # output final plot
- print(combined_plot)
- # eventually save plot
- #ggsave("figures/fig_6_R.svg",
- # plot = combined_plot, width = 80, height = 70, units = "mm", device = "svg", dpi = 300)
- # clear environment
- rm(list=setdiff(ls(), "data"))
main_script_beta_R.R at commit 5e8450d, no license · at the source
Overview
- Department of Neurology, University Medical Center Hamburg-Eppendorf, Hamburg 20246, Germany
- Department of Neurophysiology and Pathophysiology, University Medical Center Hamburg-Eppendorf, Hamburg 20246, Germany
- Oxford Centre for Integrative Neuroimaging, FMRIB, Nuffield Department of Clinical Neurosciences, University of Oxford, Oxford OX3 9DU, UK
- UKRI Medical Research Council Brain Network Dynamics Unit, Nuffield Department of Clinical Neurosciences, University of Oxford, Oxford OX3 9DU, UK
- Biomedical Signals and Systems, Technical Medical Centre, University of Twente, Enschede 7522 NB, The Netherlands
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
5e8450d9d127143fbca330a31743ebd7d12eec5c, 29 September 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
11 files
- scripts/
functions/ , MATLAB, 161 linescfc_figure_2B_2C.m - scripts/
functions/ , MATLAB, 86 lines, 2 matchescfc_figure_3C_3D.m - scripts/
functions/ , MATLAB, 117 linescfc_figure_4A_4B_4C_supp lfig_3_4.m - scripts/
functions/ , MATLAB, 82 linescfc_sourcestatistics_bas eline.m - scripts/
functions/ , MATLAB, 77 linescfc_sourcestatistics_bet weengroups.m - scripts/
functions/ , MATLAB, 79 linescfc_sourcestatistics_lm. m - scripts/
functions/ , MATLAB, 85 linescfc_supplfig_2A.m - scripts/
functions/ , MATLAB, 138 linesft_statfun_lm.m - scripts/
main_script_beta_MATLAB. , MATLAB, 167 linesm - scripts/
main_script_beta_R.R , R, 821 lines, 6 matches - README.md, Text, 160 lines
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://
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://
BibTeX
@article{timmsen2026role
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/
url = {https://
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/
VL - 8
IS - 2
SP - fcag077
SN - 2632-1297
PB - Oxford University Press
DO - 10.1093/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1093/
"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":
"volume": "8",
"issue": "2",
"page": "fcag077",
"DOI": "10.1093/
"PMID": "41884601",
"PMCID": "PMC13010071",
"ISSN": "2632-1297",
"publisher": "Oxford University Press",
"URL": "https://
"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 communicationsIn 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 communicationsIn 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: eNeuroIn 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 adaptationJournal: 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 evaluationJournal: 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: iScienceIn 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: NeuroImageIn 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 dataIn 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 biologyIn 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: eLifeIn 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 10 scripts, and 8 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:1e457d29883581d4…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
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.
