figure_1.Rmd 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ---
  2. title: "Spacek et al., 2021, Figure 1"
  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. # Read data
  14. tib = get_data("../csv/fig1.csv")
  15. ```
  16. ```{r tidy, include = FALSE}
  17. # Turn booleans for 'optogenetic manipulation' into a binary predictor
  18. tb <- tib %>% mutate(feedback = ifelse(opto == TRUE, 0, 1))
  19. ```
  20. # Figure 1f
  21. ## Feedback effects on firing rate
  22. ```{r, fit_model_1f}
  23. # We fit a random-intercept, random-slope model with two random effects:
  24. # (1) Neurons (uid) can have different baseline firing rates,
  25. # and the effect of feedback can vary across neurons.
  26. # (2) Mean firing rates are allowed to differ across experiments (eid),
  27. # which are nested within recording sessions (sid),
  28. # which are nested within animals (mid).
  29. lmer.1f = lmer(rates ~ feedback + (1 + feedback | uid) + (1 | mid/sid/eid),
  30. data = tb %>% drop_na(rates))
  31. display(lmer.1f)
  32. anova(lmer.1f)
  33. ```
  34. ```{r get_predicted_average_effect_1f, include=F}
  35. mSuppr = fixef(lmer.1f)[1]
  36. diffMeans = fixef(lmer.1f)[2]
  37. mFeedbk = fixef(lmer.1f)[1] + diffMeans
  38. ```
  39. Feedback: mean firing rate of `r format(mFeedbk, digits=2, nsmall=1)` spikes/s \newline
  40. Suppression: mean firing rate of `r format(mSuppr, digits=2, nsmall=1)` spikes/s \newline
  41. n = `r nrow(tb %>% drop_na(rates) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(rates) %>% count(mid))` mice
  42. \newpage
  43. # Figure 1g
  44. ## Feedback effects on burst ratio
  45. ```{r fit_model_1g}
  46. # Random-intercept, random-slope for single neurons,
  47. # random intercept for experiments.
  48. # Variability across series and mice is close to zero,
  49. # including random intercepts for those gives singular fits.
  50. lmer.1g = lmer(burstratios ~ feedback + (1 + feedback | uid) + (1 | eid),
  51. data = tb %>% drop_na(burstratios))
  52. display(lmer.1g)
  53. anova(lmer.1g)
  54. ```
  55. ```{r get_predicted_average_effect_1g, include=F}
  56. mSuppr = fixef(lmer.1g)[1]
  57. diffMeans = fixef(lmer.1g)[2]
  58. mFeedbk = fixef(lmer.1g)[1] + diffMeans
  59. ```
  60. Feedback: mean burst ratio of `r format(mFeedbk, digits=1, nsmall=1)` \newline
  61. Suppression: mean burst ratio of `r format(mSuppr, digits=1, nsmall=1)` \newline
  62. n = `r nrow(tb %>% drop_na(burstratios) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(burstratios) %>% count(mid))` mice
  63. \newpage
  64. # Figure 1h
  65. ## Feedback effects on sparseness
  66. ```{r tidy_for_1hi, include=FALSE}
  67. # 'Sparseness', and 'reliability' are not computed on a trial-by-trial basis. In the csv-file,
  68. # these two measures are therefore identical across trials, so we simply pull out the first trial of each neuron
  69. tbhi = tb %>% select(mid, sid, eid, uid, mseu, feedback, spars, rel) %>% distinct(mseu, feedback, .keep_all = TRUE)
  70. ```
  71. ```{r fit_model_1h}
  72. # Random-intercept, random-slope for single neurons,
  73. # random intercept for experiments, nested within series
  74. lmer.1h = lmer(spars ~ feedback + (1 + feedback | uid) + (1 | sid/eid),
  75. data = tbhi %>% drop_na(spars))
  76. display(lmer.1h)
  77. anova(lmer.1h)
  78. ```
  79. ```{r get_predicted_average_effect_1h, include=F}
  80. mSuppr = fixef(lmer.1h)[1]
  81. diffMeans = fixef(lmer.1h)[2]
  82. mFeedbk = fixef(lmer.1h)[1] + diffMeans
  83. ```
  84. Feedback: `r format(mFeedbk, digits=2, nsmall=2)` \newline
  85. Suppression: `r format(mSuppr, digits=2, nsmall=2)` \newline
  86. n = `r nrow(tbhi %>% drop_na(spars) %>% count(uid))` neurons from `r nrow(tbhi %>% drop_na(spars) %>% count(mid))` mice
  87. \newpage
  88. # Figure 1i
  89. ## Feedback effects on reliability
  90. ```{r fit_model_1i}
  91. # Random-intercept, random-slope for single neurons,
  92. # random intercept for experiments, nested within series
  93. lmer.1i = lmer(rel ~ feedback + (1 + feedback | uid) + (1 | sid/eid),
  94. data = tbhi %>% drop_na(rel))
  95. display(lmer.1i)
  96. anova(lmer.1i)
  97. ```
  98. ```{r get_predicted_average_effect_1i, include=F}
  99. mSuppr = fixef(lmer.1i)[1]
  100. diffMeans = fixef(lmer.1i)[2]
  101. mFeedbk = fixef(lmer.1i)[1] + diffMeans
  102. ```
  103. Feedback: `r format(mFeedbk, digits=2, nsmall=2)` \newline
  104. Suppression: `r format(mSuppr, digits=2, nsmall=2)` \newline
  105. n = `r nrow(tbhi %>% drop_na(rel) %>% count(uid))` neurons from `r nrow(tbhi %>% drop_na(rel) %>% count(mid))` mice