Browse Source

minor adjustments in resting state analyses

Lennart Wittkuhn 3 years ago
parent
commit
5e747bf8b8
1 changed files with 59 additions and 76 deletions
  1. 59 76
      code/highspeed-analysis-resting.Rmd

+ 59 - 76
code/highspeed-analysis-resting.Rmd

@@ -517,9 +517,7 @@ plot_means = function(data, variable, ylabel, ylim){
 fig_mean_beta = plot_means(data = dt_pred_conc_slope_stat, variable = "abs_mean_slope",
                            ylabel = "Absolute mean regression slope", ylim = c(0, 0.02))
 fig_mean_beta_abs = plot_means(data = dt_pred_conc_slope_stat, variable = "mean_abs_slope",
-                           ylabel = "Mean absolute regression slope", ylim = c(0, 0.1))
-fig_mean_beta_abs = plot_means(data = dt_pred_conc_slope_stat, variable = "mean_abs_slope",
-                           ylabel = "Mean absolute regression slope", ylim = c(0, 0.1))
+                           ylabel = "Regression slope (abs)", ylim = c(0, 0.1))
 fig_sd_prob = plot_means(data = dt_pred_conc_slope_stat, variable = "mean_sd_prob",
                            ylabel = "SD of probability", ylim = c(0, 0.4))
 fig_mean_beta; fig_mean_beta_abs; fig_sd_prob;
@@ -669,25 +667,26 @@ plot_means_seen = function(data, variable, ylabel, ylim){
           panel.grid.minor = element_blank(),
           panel.background = element_blank())
 }
-fig_mean_beta = plot_means_seen(
+fig_mean_beta_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "abs_mean_slope",
   ylabel = "Absolute mean regression slope", ylim = c(-0.01, 0.02))
-fig_mean_beta_abs = plot_means_seen(
+fig_mean_beta_abs_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "mean_abs_slope",
   ylabel = "Mean absolute regression slope", ylim = c(0, 0.1))
-fig_sd_prob = plot_means_seen(
+fig_sd_prob_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "mean_sd_prob",
   ylabel = "SD of probability", ylim = c(0, 0.4))
-fig_mean_pos_abs = plot_means_seen(
+fig_mean_pos_abs_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "abs_pos_slope",
   ylabel = "Mean absolute regression slope", ylim = c(0, 0.1))
-fig_mean_neg_abs = plot_means_seen(
+fig_mean_neg_abs_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "abs_neg_slope",
   ylabel = "Mean absolute regression slope", ylim = c(0, 0.1))
-fig_mean_slope = plot_means_seen(
+fig_mean_slope_seen = plot_means_seen(
   data = dt_pred_conc_slope_stat_seen, variable = "mean_slope",
   ylabel = "Absolute mean regression slope", ylim = c(-0.01, 0.02))
-fig_mean_beta; fig_mean_beta_abs; fig_sd_prob; fig_mean_pos_abs; fig_mean_neg_abs; fig_mean_slope
+fig_mean_beta_seen; fig_mean_beta_abs_seen; fig_sd_prob_seen;
+fig_mean_pos_abs_seen; fig_mean_neg_abs_seen; fig_mean_slope_seen
 ```
 
 ### Frequency spectrum analyses
@@ -929,9 +928,12 @@ dt_pred_rest_lsp_mean_rel_seen = dt_pred_rest_lsp_seen %>%
   verify(all(num_subs == 32))
 ```
 
+We determine in which frequency range the peak in difference between pre- and post-task rest is:
+
 ```{r}
-increase_slow = dt_pred_rest_lsp_mean_rel$freq_bins_smooth[which.max(dt_pred_rest_lsp_mean_rel$mean_spec)]
-increase_fast = dt_pred_rest_lsp_mean_rel$freq_bins_smooth[dt_pred_rest_lsp_mean_rel$freq_bins_smooth > 0.07][which.max(dt_pred_rest_lsp_mean_rel[dt_pred_rest_lsp_mean_rel$freq_bins_smooth > 0.07]$mean_spec)]
+increase_slow = round(dt_pred_rest_lsp_mean_rel$freq_bins_smooth[which.max(dt_pred_rest_lsp_mean_rel$mean_spec)], 2)
+increase_fast = round(dt_pred_rest_lsp_mean_rel$freq_bins_smooth[dt_pred_rest_lsp_mean_rel$freq_bins_smooth > 0.07][which.max(dt_pred_rest_lsp_mean_rel[dt_pred_rest_lsp_mean_rel$freq_bins_smooth > 0.07]$mean_spec)], 2)
+increase_slow; increase_fast;
 ```
 
 ```{r, echo=FALSE}
@@ -999,7 +1001,7 @@ dt_pred_rest_lsp_mean_seen = dt_pred_rest_lsp_seen %>%
 
 ```{r, echo=FALSE}
 colors = c(hcl.colors(5, "Cividis")[c(1)], "gold", grays(1), "black")
-fig_freq_lsp = ggplot(data = dt_pred_rest_lsp_mean_seen, aes(
+fig_freq_lsp_seen = ggplot(data = dt_pred_rest_lsp_mean_seen, aes(
   color = tITI, y = as.numeric(mean_spec), x = as.numeric(freq_bins_smooth))) +
   facet_wrap(~ seen) +
   geom_vline(data = frequency_expectation, aes(xintercept = xintercept),
@@ -1027,7 +1029,7 @@ fig_freq_lsp = ggplot(data = dt_pred_rest_lsp_mean_seen, aes(
         panel.grid.minor = element_blank(),
         panel.border = element_blank(),
         panel.background = element_blank()) 
-fig_freq_lsp
+fig_freq_lsp_seen
 ```
 
 #### Relative frequency spectra (fixed order)
@@ -1154,7 +1156,7 @@ dt_pred_rest_lsp_exp_seen = dt_pred_rest_lsp_seen %>%
 
 ```{r}
 colors = c(hcl.colors(5, "Cividis")[c(1)], "gold", "gray", "black")
-fig_freq_exp = ggplot(data = dt_pred_rest_lsp_exp_seen, aes(
+fig_freq_exp_seen = ggplot(data = dt_pred_rest_lsp_exp_seen, aes(
   y = power, x = fct_rev(label), fill = tITI)) + 
   geom_bar(stat = "summary", fun = "mean", position = position_dodge(0.9),
            width = 0.8) +
@@ -1178,18 +1180,20 @@ fig_freq_exp = ggplot(data = dt_pred_rest_lsp_exp_seen, aes(
         panel.grid.minor = element_blank(),
         panel.border = element_blank(),
         panel.background = element_blank()) 
-fig_freq_exp
+fig_freq_exp_seen
 ```
 
+We examine the effect of resting-state session (pre- vs. post-task rest) and sequence frequency (less frequent vs. more frequent) on the power in the high frequency range (predicted by our model) indicative of fast sequential reactivation:
+
 ```{r, results=hold}
 lme_power <- lmerTest::lmer(
-  power ~ tITI + seen  + (tITI + seen | id),
+  power ~ tITI * seen  + (tITI + seen | id),
   data = subset(dt_pred_rest_lsp_exp_seen, index == "power_index_fast" &
                   stringr::str_detect(tITI, "Rest")),
   control = lcctrl)
 summary(lme_power)
 anova(lme_power)
-emmeans_results = emmeans(lme_power, list(pairwise ~ seen | tITI))
+emmeans_results = emmeans(lme_power, list(pairwise ~ tITI | seen))
 emmeans_results
 ```
 
@@ -1205,6 +1209,18 @@ emmeans_results = emmeans(lme_power, list(pairwise ~ tITI))
 emmeans_results
 ```
 
+```{r, echo=TRUE, results=hold}
+lme_power <- lmerTest::lmer(
+  power ~ seen + (tITI | id),
+  data = subset(dt_pred_rest_lsp_exp_seen, index == "power_index_fast" &
+                  stringr::str_detect(tITI, "Rest")),
+  control = lcctrl)
+summary(lme_power)
+anova(lme_power)
+emmeans_results = emmeans(lme_power, list(pairwise ~ seen))
+emmeans_results
+```
+
 We compare the power in the fast frequency spectrum between pre- and post-task resting-state data:
 
 ```{r}
@@ -1227,7 +1243,7 @@ plot_data <- dt_pred_rest_lsp_exp_seen %>%
   filter(tITI %in% c("Rest Pre S1", "Rest Post S1")) %>%
   filter(index == "power_index_fast")
 colors = c(brewer.pal(n = 8, name = "RdBu")[6], hcl.colors(5, "Cividis")[c(1)])
-fig_freq_exp = ggplot(data = plot_data, aes(
+fig_freq_exp_post = ggplot(data = plot_data, aes(
   y = power, x = tITI, fill = seen)) + 
   geom_bar(stat = "summary", fun = "mean", position = position_dodge(0.9),
            width = 0.8) +
@@ -1255,31 +1271,12 @@ fig_freq_exp = ggplot(data = plot_data, aes(
         panel.background = element_blank())
   #theme(legend.title = element_text(size = 10), 
   #      legend.text = element_text(size = 10))
-fig_freq_exp
-```
-
-```{r}
-# get the power spectrum of the expected fast frequency in fast data:
-power_fast = subset(dt_pred_rest_lsp_exp, index == "power_index_fast" & tITI == "32 ms")$power
-# get the power spectrum of the expected fast frequency in slow data:
-power_slow = subset(dt_pred_rest_lsp_exp, index == "power_index_fast" & tITI == "2048 ms")$power
-# get the power spectrum of the expected fast frequency in rest data:
-power_rest_pre = subset(dt_pred_rest_lsp_exp, index == "power_index_fast" & tITI == "Rest Pre S1")$power
-power_rest_post = subset(dt_pred_rest_lsp_exp, index == "power_index_fast" & tITI == "Rest Post S1")$power
-# compare fast vs. slow and fast vs. rest:
-ttest_power_fastvsslow = t.test(power_fast, power_slow, paired = TRUE)
-ttest_power_fastvsrestpre = t.test(power_fast, power_rest_pre, paired = TRUE)
-ttest_power_fastvsrestpost = t.test(power_fast, power_rest_post, paired = TRUE)
-ttest_power_restprevsrestpost = t.test(power_rest_pre, power_rest_post, paired = TRUE)
-round_pvalues(p.adjust(c(ttest_power_fastvsslow$p.value,
-           ttest_power_fastvsrestpre$p.value,
-           ttest_power_fastvsrestpost$p.value,
-           ttest_power_restprevsrestpost$p.value), method = "fdr"))
+fig_freq_exp_post
 ```
 ### Figure 6
 
 ```{r}
-plot_grid(fig_freq_post, fig_freq_post_rel, fig_freq_exp, nrow = 1, ncol = 3,
+plot_grid(fig_freq_post, fig_freq_post_rel, fig_freq_exp_post, nrow = 1, ncol = 3,
           labels = c("a", "b", "c"), rel_widths = c(3, 3, 3))
 ```
 
@@ -1292,10 +1289,9 @@ ggsave(filename = "wittkuhn_schuck_figure_6.pdf",
        dpi = "retina", width = 9, height = 3)
 ```
 
+### Inserting sequence trials into rest
 
-
-
-Try to calculate frequency spectrum per trial:
+We create a function to sample sequence trials:
 
 ```{r}
 subseqsample = function(sequence, seq_size = 12, seq_num = 15) {
@@ -1338,16 +1334,18 @@ fast and slow sequence trials.
 
 ```{r}
 dt_pred_rest_freq = dt_pred_conc_slope %>%
-  filter(!(tITI == "rest_run-post_ses-01")) %>%
+  # we deselect post-task resting state data and assume on fixed ordering:
+  filter(!(tITI == "Rest Post S1") & sequence == 1) %>%
   # filter for TRs in the forward and backward period only in sequence trials:
-  filter(!(tITI %in% c("32 ms", "2048 ms") & !(seq_tr %in% seq(2, 13)))) %>% setDT(.) %>%
+  filter(!(tITI %in% c("32 ms", "2048 ms") & !(seq_tr %in% seq(2, 13)))) %>%
+  setDT(.) %>%
   # select random chunks of TRs in the resting state data
-  .[tITI == "rest_run-pre_ses-01", by = .(classification, id), ":=" (trial_tITI = subseqsample(seq_tr))] %>%
+  .[tITI == "Rest Pre S1", by = .(classification, id), ":=" (trial_tITI = subseqsample(seq_tr))] %>%
   # filter out all NA trials on resting state data
-  filter(!(is.na(trial_tITI) & tITI == "rest_run-pre_ses-01")) %>%
+  filter(!(is.na(trial_tITI) & tITI == "Rest Pre S1")) %>%
   setDT(.) %>%
   # assert that all the three conditions (two sequence trials and rest data) are present:
-  assert(in_set("32 ms", "2048 ms", "rest_run-pre_ses-01"), tITI) %>%
+  assert(in_set("32 ms", "2048 ms", "Rest Pre S1"), tITI) %>%
   # calculate the frequency spectrum for every 
   .[, by = .(classification, id, tITI, trial_tITI), {
     frequency_spectrum = stats::spectrum(
@@ -1375,32 +1373,6 @@ dt_pred_rest_freq = dt_pred_conc_slope %>%
   )] %>% verify(all(num_subs == 32))
 ```
 
-```{r}
-colors = c(hcl.colors(5, "Cividis")[c(1,5)], "gray")
-ggplot(data = dt_pred_rest_freq, aes(
-  color = tITI, y = as.numeric(mean_spec), x = as.numeric(freq_bins))) +
-  geom_ribbon(aes(fill = tITI, ymin = sem_lower, ymax = sem_upper),
-              alpha = 0.3, color = NA) +
-  geom_line() +
-  geom_point() +
-  xlab("Frequency (Hz)") + ylab("Power") +
-  scale_color_manual(name = "Condition", values = colors) +
-  scale_fill_manual(name = "Condition", values = colors) +
-  theme(legend.position = "top", legend.direction = "horizontal",
-        legend.justification = "center", legend.margin = margin(0, 0, 0, 0),
-        legend.box.margin = margin(t = 0, r = 0, b = -5, l = 0)) +
-  coord_capped_cart(left = "both", bottom = "both", expand = TRUE,
-                    xlim = c(0, 0.5), ylim = c(0.1, 0.25)) +
-  scale_x_continuous(labels = label_fill(seq(0, 0.5, 0.05), mod = 2),
-                     breaks = seq(0, 0.5, 0.05)) +
-  theme(panel.border = element_blank(), axis.line = element_line()) +
-  theme(axis.line = element_line(colour = "black"),
-        panel.grid.major = element_blank(),
-        panel.grid.minor = element_blank(),
-        panel.background = element_blank()) +
-  guides(color = guide_legend(nrow = 1))
-```
-
 We insert a number of events with probabilities scaled at different SNR levels:
 
 ```{r}
@@ -1675,7 +1647,7 @@ insert_stat_func = function(dt, variable) {
         num_subs = .N,
         mean_variable_diff = mean(get(variable)),
         pvalue = ttest_results$p.value,
-        tvalue = ttest_results$statistic,
+        tvalue = round(ttest_results$statistic, 2),
         df = ttest_results$parameter,
         sem_upper = mean(get(variable)) + (sd(get(variable))/sqrt(.N)),
         sem_lower = mean(get(variable)) - (sd(get(variable))/sqrt(.N))
@@ -1857,7 +1829,7 @@ fig_freq_lsp_insert = ggplot(data = plot_data, aes(
         panel.grid.minor = element_blank(),
         panel.border = element_blank(),
         panel.background = element_blank()) 
-fig_freq_lsp_insert
+
 ```
 
 ```{r}
@@ -1967,16 +1939,26 @@ panel_3 = plot_grid(fig_freq_lsp, fig_freq_exp, ncol = 2, labels = c("d", "e"))
 panel_4 = plot_grid(fig_snr_data_sd, fig_snr_pmat_sd, labels = c("f", "g"))
 panel_5 = plot_grid(fig_freq_lsp_insert, fig_freq_exp_insert, labels = c("h", "i"))
 plot_grid(plot_grid(panel_1, panel_2, ncol = 2), panel_3, panel_4, panel_5, ncol = 1)
+```
+
+```{r}
 ggsave(filename = "highspeed_plot_decoding_rest.pdf",
        plot = last_plot(), device = cairo_pdf, path = path_figures, scale = 1,
        dpi = "retina", width = 10, height = 12)
+ggsave(filename = "wittkuhn_schuck_figure_5.pdf",
+       plot = last_plot(), device = cairo_pdf, path = path_figures, scale = 1,
+       dpi = "retina", width = 10, height = 12)
 ```
 
+
 Supplement
 
 ```{r}
 plot_grid(fig_prob_time_seq, fig_prob_diff_snr, fig_inserts, fig_inserts_slopes,
           fig_snr_pmat_slope, fig_snr_data_slope, labels = "auto", ncol = 2, nrow = 3)
+```
+
+```{r}
 ggsave(filename = "highspeed_plot_decoding_rest_supplement.pdf",
        plot = last_plot(), device = cairo_pdf, path = path_figures, scale = 1,
        dpi = "retina", width = 10, height = 10)
@@ -1994,6 +1976,7 @@ ggsave(filename = "highspeed_plot_decoding_rest_supplement.pdf",
 
 
 
+
 We average the data across participants:
 
 ```{r}