figure_4_S1.Rmd 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. ---
  2. title: "Spacek et al., 2021, Figure 4-Supplement 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_4_S1a, include=FALSE}
  13. tib = get_data("../csv/grtFMI.csv")
  14. ```
  15. ```{r tidy_for_4_S1, include = FALSE}
  16. tb <- tib %>% filter(st8 == "none") %>% select(mid, sid, eid, uid, mseu, meanrate, meanburstratio)
  17. ```
  18. # Figure 4-Supplement 1a
  19. ## Relation between firing rate FMI and burst ratio FMI
  20. ```{r fit_model_4_S1a}
  21. # Random intercept for neurons,
  22. # random intercept for experiments, nested in series, nested in mice
  23. lmer.4_S1a = lmer(meanburstratio ~ meanrate + (1 | uid) + (1 | mid/sid/eid),
  24. data = tb %>% drop_na(meanburstratio, meanrate))
  25. display(lmer.4_S1a)
  26. anova(lmer.4_S1a)
  27. ```
  28. ```{r, save_coefficients_4_S1a, include=FALSE}
  29. coef_df = data.frame("intercept" = fixef(lmer.4_S1a)[1], "slope" = fixef(lmer.4_S1a)[2], row.names = "")
  30. write_csv(coef_df, "_stats/figure_4_S1a_coefs.csv")
  31. ```
  32. Slope of `r format(fixef(lmer.4_S1a)[2], digits=2, nsmall=2)` $\pm$ `r format(2 * se.fixef(lmer.4_S1a)[2], digits=2, nsmall=2)` (95\%-confidence interval) \newline
  33. n = `r nrow(tb %>% drop_na(meanburstratio, meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(meanburstratio, meanrate) %>% count(mid))` mice
  34. \newpage
  35. # Figure 4-Supplement 1b
  36. ## Relation between firing rates in response to movies vs gratings
  37. ```{r read_data_4_S1b, include=FALSE}
  38. tib = get_data("../csv/fig4S1b.csv")
  39. ```
  40. ```{r tidy_for_4_S1b, include = FALSE}
  41. # Turn stimulus type into binary predictor
  42. tb <- tib %>% mutate(mvi = ifelse(stimtype == "mvi", 1, 0)) %>% select(mid, sid, uid, msu, mvi, meanrate)
  43. ```
  44. ```{r fit_model_4_S1b}
  45. # Random intercept for neurons,
  46. # random intercept for series, nested in mice
  47. lmer.4_S1b = lmer(meanrate ~ mvi + (1 | uid) + (1 | mid/sid),
  48. data = tb %>% drop_na(meanrate))
  49. display(lmer.4_S1b)
  50. anova(lmer.4_S1b)
  51. ```
  52. ```{r get_predicted_average_effect_4_S1b, include=F}
  53. m_grt = fixef(lmer.4_S1b)[1]
  54. diffMeans = fixef(lmer.4_S1b)[2]
  55. m_mvi = fixef(lmer.4_S1b)[1] + diffMeans
  56. ```
  57. Movies: `r format(m_mvi, digits=2, nsmall=2)` spikes/s \newline
  58. Gratings: `r format(m_grt, digits=2, nsmall=2)` spikes/s \newline
  59. n = `r nrow(tb %>% drop_na(meanrate) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(meanrate) %>% count(mid))` mice
  60. \newpage
  61. # Figure 4-Supplement 1c,d
  62. ## Relation between firing rates during feedback vs suppression for separate epochs of the movie
  63. ```{r read_data_4_S1cd, include=FALSE}
  64. tib = get_data("../csv/fig1.csv")
  65. ```
  66. ```{r tidy_4_S1cd, include=FALSE}
  67. # Get relevant variables, rename rate* columns, such that they have a common prefix, followed by a simple number
  68. tmp1 = tib %>% select(mid, sid, eid, uid, mseu, trialis, opto, rate02s, rate35s) %>% drop_na(trialis, rate02s, rate35s) %>% rename(rate2 = rate02s, rate35 = rate35s)
  69. # Turn rate* columns into long format
  70. tmp2 = tmp1 %>% pivot_longer(cols = starts_with("rate"), names_to = "window", names_prefix = "rate", values_to = "trialrate")
  71. # Turn booleans for 'optogenetic manipulation' and 'time window' into binary, numeric predictors
  72. tmp2 = tmp2 %>% mutate(feedback = ifelse(opto == TRUE, 0, 1)) %>% mutate(earlywin = ifelse(window == '2', 1, 0))
  73. ```
  74. ```{r fit_model_4_S1cd}
  75. lmer.4_S1cd = lmer(trialrate ~ feedback*earlywin + (1 + feedback*earlywin | uid) + (1 | mid/sid/eid),
  76. data = tmp2 %>% drop_na(trialrate))
  77. display(lmer.4_S1cd)
  78. anova(lmer.4_S1cd)
  79. ```
  80. n = `r nrow(tmp2 %>% drop_na(trialrate) %>% count(uid))` neurons from `r nrow(tmp2 %>% drop_na(trialrate) %>% count(mid))` mice
  81. ```{r post_hocs_4_S1cd, include=FALSE}
  82. # Post-hoc: fit model to early window (0-2s)
  83. foo = tmp2 %>% filter(earlywin == 1)
  84. lmer.4_S1cd = lmer(trialrate ~ feedback + (1 + feedback | uid) + (1 | sid/eid),
  85. data = foo %>% drop_na(trialrate))
  86. display(lmer.4_S1cd)
  87. anova(lmer.4_S1cd)
  88. m_suppr = fixef(lmer.4_S1cd)[1]
  89. diffMeans = fixef(lmer.4_S1cd)[2]
  90. m_feedb = fixef(lmer.4_S1cd)[1] + diffMeans
  91. # Post-hoc: fit model to late window (3-5s)
  92. foo = tmp2 %>% filter(earlywin == 0)
  93. lmer.4_S1cd = lmer(trialrate ~ feedback + (1 + feedback | uid) + (1 | sid/eid),
  94. data = foo %>% drop_na(trialrate))
  95. display(lmer.4_S1cd)
  96. anova(lmer.4_S1cd)
  97. m_suppr = fixef(lmer.4_S1cd)[1]
  98. diffMeans = fixef(lmer.4_S1cd)[2]
  99. m_feedb = fixef(lmer.4_S1cd)[1] + diffMeans
  100. ```
  101. \newpage
  102. # Figure 4-Supplement 1e
  103. ## Burst ratio FMIs separately for grating versus movie presentations
  104. ```{r read_data_4_S1ef, include=FALSE}
  105. tib = get_data("../csv/fig4.csv")
  106. ```
  107. ```{r tidy_for_4_S1e, include=FALSE}
  108. t4S1e <- tib %>% filter(blank == "False" & meanburstratio != "NA")
  109. # Turn stimulus type into binary predictor
  110. t4S1e = t4S1e %>% mutate(mvi = ifelse(stimtype == "mvi", 1, 0))
  111. ```
  112. ```{r fit_model_4_S1e}
  113. # Random intercept for neurons,
  114. # random intercept for mice
  115. lmer.4_S1e = lmer(meanburstratio ~ mvi + (1 | uid) + (1 | mid),
  116. data = t4S1e %>% drop_na(meanburstratio))
  117. display(lmer.4_S1e)
  118. anova(lmer.4_S1e)
  119. ```
  120. ```{r predicted_average_effect_4_S1e, include=F}
  121. m_grt = fixef(lmer.4_S1e)[1]
  122. diffMeans = fixef(lmer.4_S1e)[2]
  123. m_mvi = fixef(lmer.4_S1e)[1] + diffMeans
  124. ```
  125. ```{r save_coefficients_4_S1e, include=FALSE}
  126. pred_means_df = data.frame("mvi" = m_mvi, "grt" = m_grt, row.names = "")
  127. write_csv(pred_means_df, "_stats/figure_4_S1e_pred_means.csv")
  128. ```
  129. FMI movies: `r format(m_mvi, digits=2, nsmall=2)` \newline
  130. FMI gratings: `r format(m_grt, digits=2, nsmall=2)` \newline
  131. n = `r nrow(t4S1e %>% drop_na(meanburstratio) %>% count(uid))` neurons from `r nrow(t4S1e %>% drop_na(meanburstratio) %>% count(mid))` mice
  132. \newpage
  133. # Figure 4-Supplement 1f
  134. ## Burst ratio FMIs across blank screen conditions
  135. ```{r tidy_for_4_S1f, include=FALSE}
  136. # Code the 'blank condition' as integers 1, 2, 3
  137. t3f = tib %>% mutate(blank_condition = case_when(
  138. stimtype == 'mvi' & blank == 'prestim' ~ "mvi",
  139. stimtype == 'grt' & blank == 'prestim' ~ "grt",
  140. stimtype == 'grt' & blank == 'cond' ~ "grt0c"
  141. ))
  142. # Remove NAs
  143. t3f = t3f %>% filter(meanburstratio != "Na" & blank_condition != "Na")
  144. # And turn them into a factor for dummy coding
  145. t3f$blank_condition = as.factor(t3f$blank_condition)
  146. ```
  147. ```{r fit_model_4_S1f}
  148. # Random intercept for neurons,
  149. # random intercept for series
  150. lmer.4_S1f = lmer(meanburstratio ~ blank_condition + (1 | uid) + (1 | sid),
  151. data = t3f %>% drop_na(meanburstratio))
  152. display(lmer.4_S1f)
  153. anova(lmer.4_S1f)
  154. ```
  155. ```{r get_predicted_average_effect_4_S1f, include=FALSE}
  156. m_grt = fixef(lmer.4_S1f)[1]
  157. m_grt0c = fixef(lmer.4_S1f)[1] + fixef(lmer.4_S1f)[2]
  158. m_mvi = fixef(lmer.4_S1f)[1]+ fixef(lmer.4_S1f)[3]
  159. ```
  160. ```{r save_coefficients_4_S1f, include=FALSE}
  161. pred_means_df = data.frame("grt" = m_grt, "grt0c" = m_grt0c, "mvi" = m_mvi, row.names = "")
  162. write_csv(pred_means_df, "_stats/figure_4_S1f_pred_means.csv")
  163. ```
  164. FMI pre-movie:`r format(m_mvi, digits=2, nsmall=2)` \newline
  165. FMI pre-grating: `r format(m_grt, digits=2, nsmall=2)` \newline
  166. FMI blank grating: `r format(m_grt0c, digits=2, nsmall=2)` \newline
  167. n = `r nrow(t3f %>% drop_na(meanburstratio) %>% count(uid))` neurons from `r nrow(t3f %>% drop_na(meanburstratio) %>% count(mid))` mice
  168. \newpage
  169. ## Post-hoc analysis, comparing mean across blank conditions against stimulus condition
  170. ```{r tidy_for_post_hoc_4_S1ef, include = F}
  171. t4S1ef = tib %>% filter(meanburstratio != "Na")
  172. t4S1ef = t4S1ef %>% mutate(stim_condition = case_when(
  173. stimtype == 'mvi' & blank == 'False' ~ 1,
  174. stimtype == 'grt' & blank == 'False' ~ 2,
  175. (stimtype == 'mvi' | stimtype == 'grt') & blank != 'False' ~ 3
  176. ))
  177. t4S1ef$stim_condition = as.factor(t4S1ef$stim_condition)
  178. ```
  179. ```{r fit_model_4_S1ef, echo=F}
  180. # Random intercept for neuron,
  181. # random intercept for series
  182. lmer.4_S1ef = lmer(meanburstratio ~ stim_condition + (1 | uid) + (1 | sid),
  183. data = t4S1ef %>% drop_na(meanburstratio))
  184. display(lmer.4_S1ef)
  185. anova(lmer.4_S1ef)
  186. ```
  187. ```{r predicted_average_effect_4_S1ef, include=FALSE}
  188. m_mvi = fixef(lmer.4_S1ef)[1]
  189. m_grt = fixef(lmer.4_S1ef)[1] + fixef(lmer.4_S1ef)[2]
  190. m_blank = fixef(lmer.4_S1ef)[1]+ fixef(lmer.4_S1ef)[3]
  191. ```
  192. \newpage
  193. # Figure 4-Supplement 1g
  194. ## Feedback effect on firing rate during blank periods preceding movies
  195. ```{r read_data_4_S1gj, include=FALSE}
  196. tib = get_data("../csv/fig1.csv")
  197. ```
  198. ```{r tidy_for_4_S1gj, include = FALSE}
  199. # Turn stimulus type into binary predictor, get relevant columns
  200. tb <- tib %>% mutate(feedback = ifelse(opto == "TRUE", 0, 1)) %>% select(mid, sid, eid, uid, mseu, feedback, everything(), -opto)
  201. ```
  202. ```{r fit_model_4_S1g}
  203. # Random intercept, random slope for neurons,
  204. # random intercept for experiments, nested in series, nested in mice
  205. lmer.4_S1g = lmer(blankrates ~ feedback + (1 + feedback | uid) + (1 | mid/sid/eid),
  206. data = tb %>% drop_na(blankrates))
  207. display(lmer.4_S1g)
  208. anova(lmer.4_S1g)
  209. ```
  210. ```{r predicted_average_effect_4_S1g, include=F}
  211. m_suppress = fixef(lmer.4_S1g)[1]
  212. diffMeans = fixef(lmer.4_S1g)[2]
  213. m_feedback = fixef(lmer.4_S1g)[1] + diffMeans
  214. ```
  215. Feedback: `r format(m_feedback, digits=2, nsmall=2)` spikes/s. \newline
  216. Suppression: `r format(m_suppress, digits=2, nsmall=2)` spikes/s \newline
  217. n = `r nrow(tb %>% drop_na(blankrates) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankrates) %>% count(mid))` mice
  218. \newpage
  219. # Figure 4-Supplement 1j
  220. ## Feedback effect on burst ratio during blank periods preceding movies
  221. ```{r fit_model_4_S1j}
  222. # Random intercept, random slope for neurons,
  223. # random intercept for experiments
  224. lmer.4_S1j = lmer(blankburstratios ~ feedback + (1 + feedback | uid) + (1 | eid),
  225. data = tb %>% drop_na(blankburstratios))
  226. display(lmer.4_S1j)
  227. anova(lmer.4_S1j)
  228. ```
  229. ```{r predicted_average_effect_4_S1j, include=F}
  230. m_suppress = fixef(lmer.4_S1j)[1]
  231. diffMeans = fixef(lmer.4_S1j)[2]
  232. m_feedback = fixef(lmer.4_S1j)[1] + diffMeans
  233. ```
  234. Feedback: burst ratio of `r format(m_feedback, digits=2, nsmall=2)` \newline
  235. Suppression: burst ratio of `r format(m_suppress, digits=2, nsmall=2)` \newline
  236. n = `r nrow(tb %>% drop_na(blankburstratios) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankburstratios) %>% count(mid))` mice
  237. \newpage
  238. ```{r read_data_4_S1hkil, include=FALSE}
  239. tib = get_data("../csv/fig3.csv")
  240. ```
  241. ```{r tidy_for_$_S1hkil, include = FALSE}
  242. # Turn stimulus type into binary predictor, get relevant columns
  243. tb <- tib %>% mutate(feedback = ifelse(opto == "TRUE", 0, 1)) %>% select(mid, sid, eid, uid, mseu, feedback, everything(), -opto)
  244. ```
  245. \newpage
  246. # Figure 4-Supplement 1h
  247. ## Feedback effect on firing rate during blank periods preceding gratings
  248. ```{r fit_model_4_S1h}
  249. # Random intercept for neurons,
  250. # random intercept for experiments, nested in series, nested in mice
  251. lmer.4_S1h = lmer(blankrates ~ feedback + (1 + feedback | uid) + (1 | mid/sid/eid),
  252. data = tb %>% drop_na(blankrates))
  253. display(lmer.4_S1h)
  254. anova(lmer.4_S1h)
  255. ```
  256. ```{r predicted_average_effect_4_S1h, include=F}
  257. m_suppress = fixef(lmer.4_S1h)[1]
  258. diffMeans = fixef(lmer.4_S1h)[2]
  259. m_feedback = fixef(lmer.4_S1h)[1] + diffMeans
  260. ```
  261. Feedback: `r format(m_feedback, digits=2, nsmall=2)` spikes/s \newline
  262. Suppression: `r format(m_suppress, digits=2, nsmall=2)` spikes/s \newline
  263. n = `r nrow(tb %>% drop_na(blankrates) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankrates) %>% count(mid))` mice
  264. \newpage
  265. # Figure 4-Supplement 1k
  266. ## Feedback effect on burst ratio during blank periods preceding gratings
  267. ```{r fit_model_4_S1k}
  268. # Random intercept, random slope for neurons,
  269. # random intercept for series, nested in mice
  270. lmer.4_S1k = lmer(blankburstratios ~ feedback + (1 + feedback | uid) + (1 | mid/sid),
  271. data = tb %>% drop_na(blankburstratios))
  272. display(lmer.4_S1k)
  273. anova(lmer.4_S1k)
  274. ```
  275. ```{r predicted_average_effect_4_S1k, include=F}
  276. m_suppress = fixef(lmer.4_S1k)[1]
  277. diffMeans = fixef(lmer.4_S1k)[2]
  278. m_feedback = fixef(lmer.4_S1k)[1] + diffMeans
  279. ```
  280. Feedback: burst ratio of `r format(m_feedback, digits=2, nsmall=2)` \newline
  281. Suppression: burst ratio of `r format(m_suppress, digits=2, nsmall=2)` \newline
  282. n = `r nrow(tb %>% drop_na(blankburstratios) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankburstratios) %>% count(mid))` mice
  283. \newpage
  284. # Figure 4-Supplement 1i
  285. ## Feedback effect on firing rate during zero-contrast gratings
  286. ```{r fit_model_4_S1i}
  287. # Random intercept, random slope for neurons,
  288. # random intercept for experiments, nested in mice
  289. lmer.4_S1i = lmer(blankcondrates ~ feedback + (1 + feedback | uid) + (1 | sid/eid),
  290. data = tb %>% drop_na(blankcondrates))
  291. display(lmer.4_S1i)
  292. anova(lmer.4_S1i)
  293. ```
  294. ```{r predicted_average_effect_4_S1i, include=F}
  295. m_suppress = fixef(lmer.4_S1i)[1]
  296. diffMeans = fixef(lmer.4_S1i)[2]
  297. m_feedback = fixef(lmer.4_S1i)[1] + diffMeans
  298. ```
  299. Feedback: `r format(m_feedback, digits=2, nsmall=2)` spikes/s \newline
  300. Suppression: `r format(m_suppress, digits=2, nsmall=2)` spikes/s \newline
  301. n = `r nrow(tb %>% drop_na(blankcondrates) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankcondrates) %>% count(mid))` mice
  302. \newpage
  303. # Figure 4-Supplement 1l
  304. ## Feedback effect on burst ratio during zero-contrast gratings
  305. ```{r fit_model_4_S1l}
  306. # Random intercept for neurons,
  307. # random intercept for series, nested in mice
  308. lmer.4_S1l = lmer(blankcondburstratios ~ feedback + (1 | uid) + (1 | mid/sid),
  309. data = tb %>% drop_na(blankcondburstratios))
  310. display(lmer.4_S1l)
  311. anova(lmer.4_S1l)
  312. ```
  313. ```{r predicted_average_effect_4_S1l, include=F}
  314. m_suppress = fixef(lmer.4_S1l)[1]
  315. diffMeans = fixef(lmer.4_S1l)[2]
  316. m_feedback = fixef(lmer.4_S1l)[1] + diffMeans
  317. ```
  318. Feedback: burst ratio of `r format(m_feedback, digits=2, nsmall=2)` \newline
  319. Suppression: burst ratio of `r format(m_suppress, digits=2, nsmall=2)` \newline
  320. n = `r nrow(tb %>% drop_na(blankcondburstratios) %>% count(uid))` neurons from `r nrow(tb %>% drop_na(blankcondburstratios) %>% count(mid))` mice