figure_1_S2.Rmd 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. ---
  2. title: "Spacek et al., 2021, Figure 1-Supplement 2"
  3. output: pdf_document
  4. ---
  5. ```{r setup, include=FALSE}
  6. knitr::opts_chunk$set(echo = TRUE)
  7. library(arm)
  8. library(lmerTest)
  9. library(tidyverse)
  10. source('get_data.R')
  11. ```
  12. ```{r read_data, include=FALSE}
  13. tib = get_data("../csv/fig1.csv")
  14. ```
  15. ```{r tidy_for_1_S2ab, include = FALSE}
  16. # Turn booleans for 'optogenetic manipulation' into a binary predictor
  17. tb <- tib %>% mutate(feedback = ifelse(opto == TRUE, 0, 1))
  18. # Signal-to-noise ratio and mean peak-width are not computed on a trial-by-trial basis. In the csv-file,
  19. # these measures are therefore identical across trials, so we simply pull out the first trial of each neuron
  20. tb = tb %>% select(mid, sid, eid, uid, mseu, feedback, snr, meanpkw) %>% distinct(mseu, feedback, .keep_all = TRUE)
  21. ```
  22. # Figure 1-Supplement 2a
  23. ## Average effect of feedback on signal-to-noise ratio (SNR)
  24. ```{r, fit_model_1_S2a}
  25. # We fit a random-intercept model with two random effects:
  26. # (1) Neurons (uid) can have different baseline firing rates
  27. # (2) Mean firing rates are allowed to differ across recording sessions (sid)
  28. # More complex models with random slopes for neurons (or with experiments nested in
  29. # sessions, nested in mice) give singular fits.
  30. lmer.1_S2a = lmer(snr ~ feedback + (1 | uid) + (1 | sid),
  31. data = tb %>% drop_na(snr))
  32. display(lmer.1_S2a)
  33. anova(lmer.1_S2a)
  34. ```
  35. ```{r get_predicted_average_effect1_S2a, include=F}
  36. mSuppr = fixef(lmer.1_S2a)[1]
  37. diffMeans = fixef(lmer.1_S2a)[2]
  38. mActive = fixef(lmer.1_S2a)[1] + diffMeans
  39. ```
  40. Feedback SNR: `r format(mActive, digits=2, nsmall=2)` \newline
  41. Suppression SNR: `r format(mSuppr, digits=2, nsmall=2)` \newline
  42. n = `r nrow(tb %>% drop_na(snr) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(snr) %>% count(mid))` mice
  43. \newpage
  44. # Figure 1-Supplement 2b
  45. ## Average effect of feedback on PSTH mean peak width
  46. ```{r, fit_model_1_S2b}
  47. # Random-intercept for single neurons,
  48. # random intercept for experiments, nested in series
  49. lmer.1_S2b = lmer(meanpkw ~ feedback + (1 | uid) + (1 | sid/eid),
  50. data = tb %>% drop_na(meanpkw))
  51. display(lmer.1_S2b)
  52. anova(lmer.1_S2b)
  53. ```
  54. ```{r get_predicted_average_effect_1_S2b, include=F}
  55. mSuppr = fixef(lmer.1_S2b)[1]
  56. diffMeans = fixef(lmer.1_S2b)[2]
  57. mActive = fixef(lmer.1_S2b)[1] + diffMeans
  58. ```
  59. Feedback mean peak width: `r format(mActive, digits=2, nsmall=2)` \newline
  60. Suppression mean peak width: `r format(mSuppr, digits=2, nsmall=2)` \newline
  61. n = `r nrow(tb %>% drop_na(meanpkw) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(meanpkw) %>% count(mid))` mice
  62. \newpage
  63. # Figure 1-Supplement 2c
  64. ## Relation between firing rate FMI and burst ratio FMI
  65. ```{r read_data_1_S2c-g, include=FALSE}
  66. tib = get_data("../csv/mviFMI.csv")
  67. # filter based on 'state'
  68. tb <- tib %>% filter(st8 == 'none')
  69. ```
  70. ```{r fit_model_1_S2c}
  71. # Random-intercept for single neurons,
  72. # random intercept for experiments, nested in series
  73. lmer.1_S2c = lmer(meanburstratio ~ meanrate + (1 | uid) + (1 | sid/eid),
  74. data = tb %>% drop_na(meanburstratio, meanrate))
  75. display(lmer.1_S2c)
  76. anova(lmer.1_S2c)
  77. ```
  78. ```{r store_coefficients_1_S2c, include=FALSE}
  79. coef_df = data.frame("intercept" = fixef(lmer.1_S2c)[1], "slope" = fixef(lmer.1_S2c)[2], row.names = "")
  80. write_csv(coef_df, "_stats/figure_1_S2c_coefs.csv")
  81. ```
  82. Slope of `r format(fixef(lmer.1_S2c)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2c)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  83. n = `r nrow(tb %>% drop_na(meanburstratio, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(meanburstratio, meanrate) %>% count(mid))` mice
  84. \newpage
  85. # Figure 1-Supplement 2d
  86. ## Relation between firing rate FMI and sparseness FMI
  87. ```{r fit_model_1_S2d}
  88. # Random-intercept for single neurons,
  89. # random intercept for experiments, nested in series
  90. lmer.1_S2d = lmer(spars ~ meanrate + (1 | uid) + (1 | sid/eid),
  91. data = tb %>% drop_na(spars, meanrate))
  92. display(lmer.1_S2d)
  93. anova(lmer.1_S2d)
  94. ```
  95. ```{r store_coefficients_1_S2d, include=FALSE}
  96. coef_df = data.frame("intercept" = fixef(lmer.1_S2d)[1], "slope" = fixef(lmer.1_S2d)[2], row.names = "")
  97. write_csv(coef_df, "_stats/figure_1_S2d_coefs.csv")
  98. ```
  99. Slope of `r format(fixef(lmer.1_S2d)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2d)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  100. n = `r nrow(tb %>% drop_na(spars, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(spars, meanrate) %>% count(mid))` mice
  101. \newpage
  102. # Figure 1-Supplement 2e
  103. ## Relation between firing rate FMI and reliability FMI
  104. ```{r fit_model_1_S2e}
  105. # Random-intercept for single neurons,
  106. # random intercept for series, nested in mice
  107. lmer.1_S2e = lmer(rel ~ meanrate + (1 | uid) + (1 | mid/sid),
  108. data = tb %>% drop_na(rel, meanrate))
  109. display(lmer.1_S2e)
  110. anova(lmer.1_S2e)
  111. ```
  112. ```{r store_coefficients_1_S2e, include=FALSE}
  113. coef_df = data.frame("intercept" = fixef(lmer.1_S2e)[1], "slope" = fixef(lmer.1_S2e)[2], row.names = "")
  114. write_csv(coef_df, "_stats/figure_1_S2e_coefs.csv")
  115. ```
  116. Slope of `r format(fixef(lmer.1_S2e)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2e)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  117. n = `r nrow(tb %>% drop_na(rel, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(rel, meanrate) %>% count(mid))` mice
  118. \newpage
  119. # Figure 1-Supplement 2f
  120. ## Relation between firing rate FMI and SNR FMI
  121. ```{r fit_model_1_S2f}
  122. # Random intercept for neurons,
  123. # random intercept for series
  124. lmer.1_S2f = lmer(snr ~ meanrate + (1 | uid) + (1 | sid),
  125. data = tb %>% drop_na(snr, meanrate))
  126. display(lmer.1_S2f)
  127. anova(lmer.1_S2f)
  128. ```
  129. ```{r store_coefficients_1_S2f, include=FALSE}
  130. coef_df = data.frame("intercept" = fixef(lmer.1_S2f)[1], "slope" = fixef(lmer.1_S2f)[2], row.names = "")
  131. write_csv(coef_df, "_stats/figure_1_S2f_coefs.csv")
  132. ```
  133. Slope of `r format(fixef(lmer.1_S2f)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2f)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  134. n = `r nrow(tb %>% drop_na(snr, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(snr, meanrate) %>% count(mid))` mice
  135. \newpage
  136. # Figure 1-Supplement 2g
  137. ## Relation between firing rate FMI and mean peak witdth FMI
  138. ```{r fit_model_1_S2g}
  139. # Random intercept for neurons,
  140. # random intercept for experiments, nested in series
  141. lmer.1_S2g = lmer(meanpkw ~ meanrate + (1 | uid) + (1 | sid/eid),
  142. data = tb %>% drop_na(meanpkw, meanrate))
  143. display(lmer.1_S2g)
  144. anova(lmer.1_S2g)
  145. ```
  146. ```{r store_coefficients_1_S2g, include=FALSE}
  147. coef_df = data.frame("intercept" = fixef(lmer.1_S2g)[1], "slope" = fixef(lmer.1_S2g)[2], row.names = "")
  148. write_csv(coef_df, "_stats/figure_1_S2g_coefs.csv")
  149. ```
  150. Slope of `r format(fixef(lmer.1_S2g)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2g)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  151. n = `r nrow(tb %>% drop_na(meanpkw, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(meanpkw, meanrate) %>% count(mid))` mice
  152. \newpage
  153. # Figure 1-Supplement 2h
  154. ## Effect of feedback on eye position variability
  155. ```{r read_data_1_S2h, include=FALSE}
  156. tib = get_data("../csv/ipos_opto.csv")
  157. # Turn feedback into a binary variable
  158. tb = tib %>% mutate(feedback = ifelse(opto == "FALSE", 1, 0))
  159. # The standard deviation of eye position is not computed on a trial-by-trial basis. In the csv-file,
  160. # std is therefore identical across trials, so we simply pull out the first trial of each neuron
  161. tb = tb %>% select(mid, sid, eid, mse, feedback, std_xpos_cross) %>% distinct(mse, feedback, .keep_all = TRUE)
  162. ```
  163. ```{r fit_model_1_S2h}
  164. # Random intercept for experiments, nested in series, nested in mice
  165. lmer.8 = lmer(std_xpos_cross ~ feedback + (1 | mid/sid/eid),
  166. data = tb %>% drop_na(std_xpos_cross))
  167. display(lmer.8)
  168. anova(lmer.8)
  169. ```
  170. ```{r get_predicted_average_effect_1_S2h, include=F}
  171. mSuppr = fixef(lmer.8)[1]
  172. diffMeans = fixef(lmer.8)[2]
  173. mFeedback = fixef(lmer.8)[1] + diffMeans
  174. ```
  175. Mean eye position standard deviation with feedback: `r format(mFeedback, digits=2, nsmall=2)`$^{\circ}$ \newline
  176. Mean eye position standard deviation with suppression: `r format(mSuppr, digits=2, nsmall=2)`$^{\circ}$ \newline
  177. n = `r nrow(tb %>% drop_na(std_xpos_cross) %>% count(eid))` experiments from `r nrow(tb %>% drop_na(std_xpos_cross) %>% count(mid))` mice
  178. \newpage
  179. # Figure 1-Supplement 2i
  180. ## Relation between feedback effects on eye position and feedback effects on reliability
  181. ```{r read_data_1_S2i, include=FALSE}
  182. tib = get_data("../csv/iposmi.csv")
  183. ```
  184. ```{r fit_model_1S2i}
  185. # Random intercept for neurons,
  186. # random intercept for experiments nested in series
  187. lmer.1_S2i = lmer(relfmi ~ iposfmi + (1 | uid) + (1 | sid/eid),
  188. data = tib %>% drop_na(relfmi, iposfmi))
  189. display(lmer.1_S2i)
  190. anova(lmer.1_S2i)
  191. ```
  192. ```{r store_coefficients, include=FALSE}
  193. coef_df = data.frame("intercept" = fixef(lmer.1_S2i)[1], "slope" = fixef(lmer.1_S2i)[2], row.names = "")
  194. write_csv(coef_df, "_stats/figure_1_S2i_coefs.csv")
  195. ```
  196. Slope of `r format(fixef(lmer.1_S2i)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.1_S2i)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  197. n = `r nrow(tib %>% drop_na(relfmi, iposfmi) %>% count(uid))` neurons from `r nrow(tib %>% drop_na(relfmi, iposfmi) %>% count(mid))` mice