[{"content":" 关于此处 # 很久之前就想找一个地方把自己的废话写下来。一是方便自己回头感叹当初有多幼稚；二是我的记忆真的不是很好，过段时间遇到了同样的问题，根本想不起来当初是怎么处理的，写下来方便自己记忆和查阅；三是有些东西也是做事时走过的弯路，写下来如果能帮到遇到同样问题的人，也是一件好事。\n在我看来，让世界上本来不存在的东西存在的过程叫做创作。创作可大可小。拍一张照片是创作，写一段文字是创作，做一个视频是创作，想到一个新颖的说法也是创作。希望这里能成为一个包裹我\u0026quot;创作\u0026quot;的空间。\n关于我 # TODO\n","date":"2026年05月29日","externalUrl":null,"permalink":"/about/","section":"桑峰","summary":"关于此处 # 很久之前就想找一个地方把自己的废话写下来。一是方便自己回头感叹当初有多幼稚；二是我的记忆真的不是很好，过段时间遇到了同样的问题，根本想不起来当初是怎么处理的，写下来方便自己记忆和查阅；三是有些东西也是做事时走过的弯路，写下来如果能帮到遇到同样问题的人，也是一件好事。\n","title":"关于","type":"page"},{"content":"","date":"2026年05月29日","externalUrl":null,"permalink":"/","section":"桑峰","summary":"","title":"桑峰","type":"page"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/","section":"标签","summary":"","title":"标签","type":"tags"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/posts/","section":"博客","summary":"","title":"博客","type":"posts"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/categories/","section":"分类","summary":"","title":"分类","type":"categories"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/%E6%90%9E%E6%80%AA/","section":"标签","summary":"","title":"搞怪","type":"tags"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/%E6%97%A5%E5%B8%B8/","section":"标签","summary":"","title":"日常","type":"tags"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/%E6%95%A3%E6%AD%A5/","section":"标签","summary":"","title":"散步","type":"tags"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/categories/%E9%9A%8F%E7%AC%94/","section":"分类","summary":"","title":"随笔","type":"categories"},{"content":" 天阴阴的，白鞋显得更加白了。草地虽然乱糟糟的，但因为表面是潮湿的，所以也挺有质感的。\n前两天看到一博主拍的这种风格的照片，觉得挺有趣的。今天拍照时突然想起来了。于是也试试。\n看多了会有点头晕……\n按下快门的同时调整变焦环。\n这张旋转的还算比较完美。\n仿佛是从一个树洞往外看。\n绿色的草地，潮湿的马路，以及它们之间的泾渭分明。\n很特别的一棵树。虽然是夏天，但它的叶子都变黄落下去了。这混乱的四季。\n不像真实的银杏叶子。\n","date":"2026年05月14日","externalUrl":null,"permalink":"/posts/2026/2026-05-14_takeawalk/","section":"博客","summary":" 天阴阴的，白鞋显得更加白了。草地虽然乱糟糟的，但因为表面是潮湿的，所以也挺有质感的。\n","title":"午后散步","type":"posts"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/%E5%B0%8F%E9%9B%A8/","section":"标签","summary":"","title":"小雨","type":"tags"},{"content":"","date":"2026年05月14日","externalUrl":null,"permalink":"/tags/%E6%97%8B%E8%BD%AC%E9%95%9C%E5%A4%B4/","section":"标签","summary":"","title":"旋转镜头","type":"tags"},{"content":"","date":"2024年04月08日","externalUrl":null,"permalink":"/tags/r/","section":"标签","summary":"","title":"R","type":"tags"},{"content":"因为需要在循环里面记录警告和报错对应的循环项。一开始的思路是用warnings()获取警告信息，在获取后再用warning('')清空警告信息。但在循环结束后，获取警告信息回返回包含多个元素的list，似乎清空警告信息没有生效。另外，这种方法没办法处理报错。第二种尝试是使用tryCatch()，虽然详细的原理还没弄明白，但目前也能实现一开始的需要了。因此记录一下。\ntryCatch # # create a function maybe raise warning or error. func \u0026lt;- function(x) { if (x %% 2 == 0) { warning(\u0026#39;a\u0026#39;) } else if (x %% 3 == 0) { stop(\u0026#39;b\u0026#39;) } } # the loop for (i in 1:10) { res \u0026lt;- tryCatch({ func(i) print(\u0026#39;Normal\u0026#39;) \u0026#39;Normal\u0026#39; }, warning = function(w){ priint(\u0026#39;Warning\u0026#39;) \u0026#39;Warning\u0026#39; }, error = function(e){ print(\u0026#39;Error\u0026#39;) \u0026#39;Error\u0026#39; }, finally = { print(\u0026#39;Finally\u0026#39;) }) print(sprintf(\u0026#39;x: %d, res: %s\u0026#39;, i, res)) } ## [1] \u0026#34;Normal\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 1, res: Normal\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 2, res: Error\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 3, res: Error\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 4, res: Error\u0026#34; ## [1] \u0026#34;Normal\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 5, res: Normal\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 6, res: Error\u0026#34; ## [1] \u0026#34;Normal\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 7, res: Normal\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 8, res: Error\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 9, res: Error\u0026#34; ## [1] \u0026#34;Error\u0026#34; ## [1] \u0026#34;Finally\u0026#34; ## [1] \u0026#34;x: 10, res: Error\u0026#34; 观察输出，可以推测，先执行func(i)，如果没有异常和报错，执行之后的代码。并在tryCatch()结束前执行finally；如果有异常或者报错，则直接执行对应的代码，并在tryCatch()结束前执行finally。\n","date":"2024年04月08日","externalUrl":null,"permalink":"/posts/2024/2024-04-08_trycatchinr/","section":"博客","summary":"TryCatch in R","title":"R语言中的异常处理：TryCatch","type":"posts"},{"content":"","date":"2024年04月08日","externalUrl":null,"permalink":"/tags/trycatch/","section":"标签","summary":"","title":"TryCatch","type":"tags"},{"content":"","date":"2024年04月08日","externalUrl":null,"permalink":"/categories/%E7%BC%96%E7%A8%8B/","section":"分类","summary":"","title":"编程","type":"categories"},{"content":"","date":"2023年09月25日","externalUrl":null,"permalink":"/tags/statistics/","section":"标签","summary":"","title":"Statistics","type":"tags"},{"content":"","date":"2023年09月25日","externalUrl":null,"permalink":"/categories/%E7%A7%91%E7%A0%94/","section":"分类","summary":"","title":"科研","type":"categories"},{"content":"","date":"2023年09月25日","externalUrl":null,"permalink":"/tags/%E5%BF%83%E7%90%86%E7%BB%9F%E8%AE%A1%E5%AD%A6/","section":"标签","summary":"","title":"心理统计学","type":"tags"},{"content":" 单样本设计 # 单样本的z检验 # 统计量计算公式：\\(z_{obt}=\\frac{\\overline{X}_{obt}-\\mu}{\\sigma/\\sqrt{N}}\\).\n判断标准：如果\\(|z_{obt}| \\geq |z_{crit}|\\)，拒绝\\(H_0\\).\n单样本的t检验 # 统计量计算公式：\\(t_{obt}=\\frac{\\overline{X}_{obt}-\\mu}{s/\\sqrt{N}}\\)或\\(t_{obt}=\\frac{\\overline{X}_{obt}-\\mu}{\\sqrt{\\frac{SS}{N(N-1)}}}\\).\n判断标准：如果\\(|t_{obt}| \\geq |t_{crit}|\\)，拒绝\\(H_0\\).\n皮尔逊相关系数的显著性(t)检验 # 统计量计算公式：\\(r_{obt}\\)，对应的\\(t\\)统计量为\\(t_{obt}=\\frac{r_{obt}-\\rho}{\\sqrt{\\frac{1-r^2_{obt}}{N-2}}}\\).\n判断标准：如果\\(|r_{obt}| \\geq |r_{crit}|\\)，拒绝\\(H_0\\).\n相关样本设计：两个样本 # 相关样本的t检验 # 统计量计算公式：\\(t_{obt}=\\frac{\\overline{D}_{obt}-\\mu_D}{\\sqrt{\\frac{SS_D}{N(N-1)}}}\\).\n判断标准：如果\\(|t_{obt}| \\geq |t_{crit}|\\)，拒绝\\(H_0\\).\n效应量\\(Cohen\\;d = \\frac{|平均差|}{总体标准差}\\)，此为效应量的一般公式。对于相关样本t检验而言，其定义公式为\\(d=\\frac{|\\overline{D}_{obt}|}{\\sigma_D}\\)，其计算公式为\\(\\hat{d}=\\frac{|\\overline{D}_{obt}|}{s_D}\\)，式中\\(\\hat{d}\\)是d的估计；\\(|\\overline{D}_{obt}|\\)是差数样本平均数的绝对值；\\(s_D\\)是差数样本的标准差。\n维尔克松配对符号秩次检验 # 统计量计算公式：\\(T_{obt}\\).\n判断标准：如果\\(|T_{obt}| \\leq |T_{crit}|\\)，拒绝\\(H_0\\).\n符号检验 # 统计量：样本量为N的样本中事件P的次数。\n判断标准：如果单尾或双尾\\(p（事件P的次数）\\leq \\alpha\\)，拒绝\\(H_0\\)。\n独立样本设计: 两个样本 # 独立样本t检验 # 统计量：\\(t_{obt}=\\frac{(\\overline{X}_1-\\overline{X}_2)-\\mu_{\\overline{X}_1-\\overline{X}_2}}{\\sqrt{(\\frac{SS_1+SS_2}{n_1+n_2-2})(\\frac{1}{n_1}+\\frac{1}{n_2})}}\\). 当\\(n_1=n_2\\)，\\(t_{obt}=\\frac{(\\overline{X}_1-\\overline{X}_2)-\\mu_{\\overline{X}_1-\\overline{X}_2}}{\\sqrt{(\\frac{SS_1+SS_2}{n(n-1)})}}\\).\n判断标准：如果\\(|t_{obt}| \\geq |t_{crit}|\\)，拒绝\\(H_0\\).\n效应量\\(Cohen\\;d = \\frac{|\\overline{X}_1-\\overline{X}_2|}{\\sigma}\\)，其计算公式为\\(\\hat{d}=\\frac{|\\overline{X}_1-\\overline{X}_2|}{\\sqrt{s_W^2}}\\)，式中\\(\\hat{d}\\)是\\(d\\)的估计；\\(|\\overline{X}_1-\\overline{X}_2|\\)是两个样本平均数差数的绝对值；\\(\\sqrt{s_W^2}\\)是\\(\\sigma\\)的加权估计。\n曼-惠特尼U检验 # 统计量：\\(U_{obt}\\)和\\(U^\\prime_{obt}\\)，其中\\(U_{obt}=n_1n_2+\\frac{n_1(n_1+1)}{2}-R_1\\)，\\(U_{obt}=n_1n_2+\\frac{n_2(n_2+1)}{2}-R_2\\)\n判断标准：如果单尾或双尾\\(U_{obt} \\leq U_{crit}\\)，拒绝\\(H_0\\)。\n多组实验 # 单因素方差分析，F检验 # 统计量：\\(F_{obt}=\\frac{MS_{组间}}{MS_{组内}}\\).\n判断标准：如果\\(F_{obt} \\geq F_{crit}\\)，拒绝\\(H_0\\).\n效应量\\(\\hat{\\omega}^2\\)定义公式为\\(\\hat{\\omega}^2=\\frac{\\sigma_{组间}^2}{\\sigma_{组间}^2+\\sigma_{组内}^2}\\)。因为总体方差未知，可由样本估计。计算公式为\\(\\hat{\\omega}^2=\\frac{SS_{组间}-(k-1)MS_{组内}}{SS_总+MS_{组内}}\\)。\n效应量\\(\\eta^2\\)定义和计算公式为\\(\\eta^2=\\frac{SS_{组间}}{SS_{总}}\\)。\n多重比较 # Tukey HSD检验 # 统计量：\\(Q_{obt}=\\frac{\\overline{X}_1-\\overline{X}_2}{\\sqrt{MS_{组内}/n}}\\).\n判断标准：如果\\(Q_{obt} \\geq Q_{crit}\\)，拒绝\\(H_0\\).\nScheffe检验 # 统计量：\\(F_{Scheffe}=\\frac{MS_{组间(组i和组j)}}{MS_{组内(组i和组j)}}\\).\n判断标准：如果\\(F_{Scheffe} \\geq F_{crit}\\)，拒绝\\(H_0\\).\n单因素方差分析，克拉斯科-沃利斯检验 # 统计量：\\(H_{obt}=[\\frac{12}{N(N+1)}][\\sum_{i=1}^k\\frac{(R_i)^2}{n_i}]-3(N+1)\\)，其中\\(\\sum_{i=1}^k\\frac{(R_i)^2}{n_i}\\)表示每个样本秩和的平方除以样本分数的个数，并对其求和。\n判断标准：如果\\(H_{obt} \\geq H_{crit}\\)，拒绝\\(H_0\\).\n双因素方差分析，F检验 # 统计量：\\(F_{obt}=\\frac{MS_行}{MS_{单元格内}}\\)，\\(F_{obt}=\\frac{MS_列}{MS_{单元格内}}\\)和\\(F_{obt}=\\frac{MS_{交互}}{MS_{单元格内}}\\).\n判断标准：如果\\(F_{obt} \\geq F_{crit}\\)，拒绝\\(H_0\\).\n称名数据分析 # 卡方检验 # 统计量：\\(\\chi^2_{obt}=\\sum{\\frac{(f_o-f_e)^2}{f_e}}\\).\n判断标准：如果\\(\\chi^2_{obt} \\geq \\chi^2_{crit}\\)，拒绝\\(H_0\\).\n小结 # 参考 # 《心理统计导论》.罗伯特 R. 帕加诺著，方平，姜媛等译.\n","date":"2023年09月25日","externalUrl":null,"permalink":"/posts/2023/09/20230925_weeklynotes/","section":"博客","summary":"单样本设计 # 单样本的z检验 # 统计量计算公式：\\(z_{obt}=\\frac{\\overline{X}_{obt}-\\mu}{\\sigma/\\sqrt{N}}\\).\n","title":"周总结-心理统计学笔记","type":"posts"},{"content":"","date":"2023年09月20日","externalUrl":null,"permalink":"/tags/tibble/","section":"标签","summary":"","title":"Tibble","type":"tags"},{"content":" Add a new row into a empty tibble in R # There is a simple example below.\nlibrary(tidyverse) a \u0026lt;- tibble() a \u0026lt;- a %\u0026gt;% bind_rows(list(A = 1, B = 2)) This is the results:\nA simple example ","date":"2023年09月20日","externalUrl":null,"permalink":"/posts/2023/09/20230920_weeklynotes/","section":"博客","summary":"Add a new row into a empty tibble in R # There is a simple example below.\n","title":"周总结-tibble中添加行","type":"posts"},{"content":"","date":"2023年09月14日","externalUrl":null,"permalink":"/tags/ad/","section":"标签","summary":"","title":"AD","type":"tags"},{"content":"阿尔茨海默（AD）是一种高度异质性的疾病，即在临床表现和神经生物标记上表现为显著的个体差异。这些差异包括遗传基础、症状表现、发病年龄、发病轨迹和严重程度、生物标记物、合并症和脑萎缩模式。然而传统的统计分析聚焦于组水平的平均情况。其背后基本的统计假设是AD以相同的方式影响不同的患者。然而，为了实现AD的精准医疗，我们需要超越平均的视角，并且设计统计方法来反应个体水平上的异质性。神经解剖标准化建模可以依据一个期望的正态分布/随时间变化的轨迹提供个体水平上的统计推断。在本研究中，研究者利用一个最近实现的规范化建模框架，层级贝叶斯回归，分析了1）不同个体患者在离群值分布上的神经解剖变异性；2）定量地分析了被试间不相似性的组间差异；3）建立了神经解剖离群值和认知表现和AD生物标记物之间的关系；4）并且探究了离群值的数量是否与随后从MCI到AD的转化有关。\n为了实现以上研究目的。研究者首先利用来自UKBiobank的33000名被试的皮层厚度训练了模型，并且利用迁移学习的方法，进一步利用ADNI中70%的认知正常被试优化规范化模型。用ADNI中剩下的30%和MCI/AD被试评估神经解剖特征（皮层厚度）的异质性。\n","date":"2023年09月14日","externalUrl":null,"permalink":"/posts/2023/09/20230914_papernotes/","section":"博客","summary":"阿尔茨海默（AD）是一种高度异质性的疾病，即在临床表现和神经生物标记上表现为显著的个体差异。这些差异包括遗传基础、症状表现、发病年龄、发病轨迹和严重程度、生物标记物、合并症和脑萎缩模式。然而传统的统计分析聚焦于组水平的平均情况。其背后基本的统计假设是AD以相同的方式影响不同的患者。然而，为了实现AD的精准医疗，我们需要超越平均的视角，并且设计统计方法来反应个体水平上的异质性。神经解剖标准化建模可以依据一个期望的正态分布/随时间变化的轨迹提供个体水平上的统计推断。在本研究中，研究者利用一个最近实现的规范化建模框架，层级贝叶斯回归，分析了1）不同个体患者在离群值分布上的神经解剖变异性；2）定量地分析了被试间不相似性的组间差异；3）建立了神经解剖离群值和认知表现和AD生物标记物之间的关系；4）并且探究了离群值的数量是否与随后从MCI到AD的转化有关。\n","title":"Neurology | 利用神经解剖规范化建模揭示AD个体水平的神经解剖异质性","type":"posts"},{"content":"","date":"2023年09月14日","externalUrl":null,"permalink":"/categories/%E8%AF%BB%E6%96%87%E7%8C%AE/","section":"分类","summary":"","title":"读文献","type":"categories"},{"content":"","date":"2023年09月14日","externalUrl":null,"permalink":"/tags/%E8%A7%84%E8%8C%83%E5%8C%96%E5%BB%BA%E6%A8%A1/","section":"标签","summary":"","title":"规范化建模","type":"tags"},{"content":"","date":"2023年09月14日","externalUrl":null,"permalink":"/tags/%E7%A5%9E%E7%BB%8F%E8%A7%A3%E5%89%96/","section":"标签","summary":"","title":"神经解剖","type":"tags"},{"content":" 拒绝零假设不意味着我们了解总体均数之间的差异大小，因为即使一个很小的差异，在足够大的样本量下，依旧可以得到显著的结果。总体均数间的差异大小可以通过构建均数的置信区间或者计算效应量来评估。\n双盲设计需要被试和参与现场试验的主试均不了解实验分组的情况。\n方差相等时，两独立样本均值的差异可以用汇合方差t检验。公式如下：\n$$ t = \\frac{(\\overline{x_1}-\\overline{x_2})-(\\mu_1-\\mu_2)}{\\sqrt{s^2_p(\\frac{1}{n_1}+\\frac{1}{n_2})}},$$$$ s^2_p = \\frac{(n_1-1)s^2_1+(n_2-1)s^2_1}{n_1+n_2-2}$$样本量大时可以用z分布，样本量较少时用t分布代替。\n以下情况不需要考虑方差齐性：\n两个样本数量很大； 两个样本数量相等； 方差接近，约定俗成，只要一个方差不超过另一个的2倍； 当因变量的数据不具有普遍意义时，针对差异的置信区间就没什么帮助，反而此时需要效应大小或联系强度。例如，两组人群的身高差异是相对有意义的，但某个实验条件下的反应就不具有普遍意义。\n","date":"2023年08月10日","externalUrl":null,"permalink":"/posts/2023/08/20230810_statisnotes/","section":"博客","summary":"拒绝零假设不意味着我们了解总体均数之间的差异大小，因为即使一个很小的差异，在足够大的样本量下，依旧可以得到显著的结果。总体均数间的差异大小可以通过构建均数的置信区间或者计算效应量来评估。\n","title":"《心理统计学》笔记","type":"posts"},{"content":"","date":"2023年08月10日","externalUrl":null,"permalink":"/tags/%E7%BB%9F%E8%AE%A1/","section":"标签","summary":"","title":"统计","type":"tags"},{"content":"","date":"2023年07月27日","externalUrl":null,"permalink":"/tags/ggplot2/","section":"标签","summary":"","title":"Ggplot2","type":"tags"},{"content":"","date":"2023年07月27日","externalUrl":null,"permalink":"/tags/python/","section":"标签","summary":"","title":"Python","type":"tags"},{"content":"","date":"2023年07月27日","externalUrl":null,"permalink":"/categories/%E5%8F%AF%E8%A7%86%E5%8C%96/","section":"分类","summary":"","title":"可视化","type":"categories"},{"content":" 用ggplot2做饼图（Pie plot） # library(tidyverse) ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ✔ dplyr 1.2.1 ✔ readr 2.2.0 ✔ forcats 1.0.1 ✔ stringr 1.6.0 ✔ ggplot2 4.0.3 ✔ tibble 3.3.1 ✔ lubridate 1.9.5 ✔ tidyr 1.3.2 ✔ purrr 1.2.2 ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ✖ dplyr::filter() masks stats::filter() ✖ dplyr::lag() masks stats::lag() ℹ Use the conflicted package (\u0026lt;http://conflicted.r-lib.org/\u0026gt;) to force all conflicts to become errors dat \u0026lt;- tibble(y = c(1, 2, 3, 4), x = c(\u0026#39;A\u0026#39;, \u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;D\u0026#39;), color = c(\u0026#34;#A6C9D5\u0026#34;, \u0026#34;#B3DF7F\u0026#34;, \u0026#34;#B76ED5\u0026#34;, \u0026#34;#DA9083\u0026#34;)) dat # A tibble: 4 × 3 y x color \u0026lt;dbl\u0026gt; \u0026lt;chr\u0026gt; \u0026lt;chr\u0026gt; 1 1 A #A6C9D5 2 2 B #B3DF7F 3 3 C #B76ED5 4 4 D #DA9083 dat %\u0026gt;% # 让四种类型堆叠在一起，用不同的颜色填充 ggplot(aes(x = \u0026#39;\u0026#39;, y = y, fill = x)) + geom_bar(width = 1, stat = \u0026#39;identity\u0026#39;) + coord_polar(\u0026#34;y\u0026#34;, start = 0) + labs(fill = \u0026#39;X\u0026#39;, title = \u0026#39;Title\u0026#39;) + scale_fill_manual(values = dat$color) + theme_minimal(base_size = 20) + theme( axis.title.x = element_blank(), axis.title.y = element_blank(), panel.border = element_blank(), panel.grid = element_blank(), axis.ticks = element_blank(), plot.title = element_text(size = 14, face = \u0026#39;bold\u0026#39;), axis.text.x = element_blank(), legend.position = \u0026#39;right\u0026#39; ) # 输出图片的大小 # ggsave(\u0026#39;filepath.pdf\u0026#39;, width = 14, height = 8) 修改.label.gii文件的颜色 # import nibabel as nib import matplotlib as mpl lhGiiPath = \u0026#39;xxx.label.gii\u0026#39; lhGii = nib.load(lhGiiPath) lhGii.labeltable.labels[0].rgba = mpl.colors.to_rgba(\u0026#39;#ABCD11FF\u0026#39;) nib.save(lhGii, \u0026#39;new_xxx.label.gii\u0026#39;) 其中label.gii文件中的颜色信息可以通过lhGii.labeltable.labels返回；通过对其赋值可以修改对应的颜色；\n","date":"2023年07月27日","externalUrl":null,"permalink":"/posts/2023/07/20230727_weeklynotes/","section":"博客","summary":"用ggplot2做饼图（Pie plot） # library(tidyverse) ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── ✔ dplyr 1.2.1 ✔ readr 2.2.0 ✔ forcats 1.0.1 ✔ stringr 1.6.0 ✔ ggplot2 4.0.3 ✔ tibble 3.3.1 ✔ lubridate 1.9.5 ✔ tidyr 1.3.2 ✔ purrr 1.2.2 ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── ✖ dplyr::filter() masks stats::filter() ✖ dplyr::lag() masks stats::lag() ℹ Use the conflicted package (\u003chttp://conflicted.r-lib.org/\u003e) to force all conflicts to become errors dat \u003c- tibble(y = c(1, 2, 3, 4), x = c('A', 'B', 'C', 'D'), color = c(\"#A6C9D5\", \"#B3DF7F\", \"#B76ED5\", \"#DA9083\")) dat # A tibble: 4 × 3 y x color \u003cdbl\u003e \u003cchr\u003e \u003cchr\u003e 1 1 A #A6C9D5 2 2 B #B3DF7F 3 3 C #B76ED5 4 4 D #DA9083 dat %\u003e% # 让四种类型堆叠在一起，用不同的颜色填充 ggplot(aes(x = '', y = y, fill = x)) + geom_bar(width = 1, stat = 'identity') + coord_polar(\"y\", start = 0) + labs(fill = 'X', title = 'Title') + scale_fill_manual(values = dat$color) + theme_minimal(base_size = 20) + theme( axis.title.x = element_blank(), axis.title.y = element_blank(), panel.border = element_blank(), panel.grid = element_blank(), axis.ticks = element_blank(), plot.title = element_text(size = 14, face = 'bold'), axis.text.x = element_blank(), legend.position = 'right' ) # 输出图片的大小 # ggsave('filepath.pdf', width = 14, height = 8) 修改.label.gii文件的颜色 # import nibabel as nib import matplotlib as mpl lhGiiPath = 'xxx.label.gii' lhGii = nib.load(lhGiiPath) lhGii.labeltable.labels[0].rgba = mpl.colors.to_rgba('#ABCD11FF') nib.save(lhGii, 'new_xxx.label.gii') 其中label.gii文件中的颜色信息可以通过lhGii.labeltable.labels返回；通过对其赋值可以修改对应的颜色；\n","title":"周总结-ggplot2作图","type":"posts"},{"content":"","date":"2023年06月13日","externalUrl":null,"permalink":"/tags/dice/","section":"标签","summary":"","title":"Dice","type":"tags"},{"content":" 两个集合计算DICE分数并评估显著性 # 假设有两个集合X和Y，它们的DICE分数是X和Y交集的元素个数与X和Y并集元素个数比值再乘2. 它的显著性可以通过将X和Y的元素放在一起后，再随机抽取出与X和Y集合相同元素的集合，并计算DICE分数。通过多次抽取，构建DICE的零分布，并计算真实的DICE分数在分布中的位置，来得到显著性。\n","date":"2023年06月13日","externalUrl":null,"permalink":"/posts/2023/06/notes_202206/","section":"博客","summary":"两个集合计算DICE分数并评估显著性 # 假设有两个集合X和Y，它们的DICE分数是X和Y交集的元素个数与X和Y并集元素个数比值再乘2. 它的显著性可以通过将X和Y的元素放在一起后，再随机抽取出与X和Y集合相同元素的集合，并计算DICE分数。通过多次抽取，构建DICE的零分布，并计算真实的DICE分数在分布中的位置，来得到显著性。\n","title":"周总结-DICE分数","type":"posts"},{"content":"","date":"2023年05月25日","externalUrl":null,"permalink":"/tags/matlab/","section":"标签","summary":"","title":"Matlab","type":"tags"},{"content":"","date":"2023年05月25日","externalUrl":null,"permalink":"/tags/%E6%A2%AF%E5%BD%A2%E6%B3%95/","section":"标签","summary":"","title":"梯形法","type":"tags"},{"content":" 转换数据 # 问题：假设有两组数据X和Y，要求转换Y，使得转换后的Y曲线下面积与X的曲线下面积相同。\n解：首先曲线下面积可以通过将一系列梯形面积求和后得到。假设X和Y分别有三个数据点。如图1所示。通过梯形法计算X和Y对应的曲线下面积分别为Sx和Sy。要使得Sx和Sy相等，简单地，可以对Y中每一个数值都乘以X和Y的曲线下面积的比值得到转换后的Y。matlab代码如下：\n梯形法栗子 X = randn([100, 1]); Y = randn([150, 1]) * 20; # 梯形法计算面积 Sx = trapz(X); Sy = trapz(Y); newY = Y * Sx / Sy; Syn = trapz(newY); ","date":"2023年05月25日","externalUrl":null,"permalink":"/posts/2023/05/weeklynotes21/","section":"博客","summary":"转换数据 # 问题：假设有两组数据X和Y，要求转换Y，使得转换后的Y曲线下面积与X的曲线下面积相同。\n","title":"周总结-数据转换","type":"posts"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/tags/gretna/","section":"标签","summary":"","title":"GRETNA","type":"tags"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/tags/linux/","section":"标签","summary":"","title":"Linux","type":"tags"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/tags/rsync/","section":"标签","summary":"","title":"Rsync","type":"tags"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/tags/scp/","section":"标签","summary":"","title":"Scp","type":"tags"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/tags/slurm/","section":"标签","summary":"","title":"Slurm","type":"tags"},{"content":"","date":"2023年05月13日","externalUrl":null,"permalink":"/categories/%E7%B3%BB%E7%BB%9F/%E5%B7%A5%E5%85%B7/","section":"分类","summary":"","title":"系统/工具","type":"categories"},{"content":" slumr作业调度系统 # 当因作业名太长，而无法用squeue命令看到对应作业的name时，可采用以下方法：\n用更短的且更容易区分的名字给作业命名（PS. 这不是废话嘛）；\n用命令squeue --yaml | grep \u0026lt;作业名的部分字符串\u0026gt;查询；\n图片分辨率和尺寸 # 图片的DPI表示单位英寸上的像素数，DPI越高图像显示越细腻。在给定像素数和DPI的情况下可以用像素数除以DPI得到英寸数，再乘以2.54厘米得到厘米单位下的图片某一边的长度。\nGRETNA中AUC指标计算 # GRETNA中当设置了多个threshold后，会自动输出一个对应指标的AUC值。计算方法是将指标作为y轴，threshold作为x轴作折线图。然后计算每一个梯形的面积后求和得到AUC值。但是当threshold设置过小是，部分网络指标计算会出现Inf，而对应的AUC中会出现缺失值。这里提供一种解决方法，即去掉Inf对应阈值下的指标，再去计算AUC。代码如下：\nimport os from os.path import join as opj from glob import glob import numpy as np import logging logging.basicConfig(level=logging.INFO, format=\u0026#34;%(asctime)s %(message)s\u0026#34;) der = \u0026#34;results/NodalShortestPath\u0026#34; nodalPaths = [f\u0026#34;{der}/NLp_Thres{i+1:03d}.txt\u0026#34; for i in range(36)] nodalData = [] for i in nodalPaths: nodalData.append(np.loadtxt(i)) nodalData = np.array(nodalData) # each sub tmpRes = [] for i in range(nodalData.shape[1]): # each region tmpSub = [] for j in range(nodalData.shape[2]): tmpSubData = nodalData[:, i, j] tmpSubData = tmpSubData[~np.isnan(tmpSubData)] tmpSubData = tmpSubData[~np.isinf(tmpSubData)] tmpSubAuc = np.trapz(tmpSubData, dx=0.01) tmpSub.append(tmpSubAuc) tmpRes.append(tmpSub) tmpRes = np.array(tmpRes) # logging.info(tmpRes.shape) np.savetxt(opj(der, \u0026#34;NLp_AUC.txt\u0026#34;), tmpRes, fmt=\u0026#34;%.16e\u0026#34;, delimiter=\u0026#34;\\t\u0026#34;) logging.info(\u0026#34;Done.\u0026#34;) Linux系统的机器间互传数据 # scp和rsync命令可以实现在不同机器（linux/unix系统）之间的文件传输。假设当前要把A机器的a用户的文件/a/src，传输到B机器的b用户的/b/dst/文件夹下，具体用法如下：scp /a/src b@B:/b/dst/\n如果是用B机器上b用户登陆的，则需要将命令的源文件中添加用户名和机器IP地址，例如：scp a@A:/a/src /b/dst/\n如果/a/src是文件夹，则需要给scp命令加上参数-r；如果B机器ssh的端口号不是默认的22，则需要给scp用-P参数指定目标机器的ssh服务端口号。例如：scp -P \u0026lt;目标机器（B机器）的ssh服务的端口号\u0026gt; -r /a/src b@B:/b/dst/\n详细的参数说明请参考：https://www.runoob.com/linux/linux-comm-scp.html\nrsync命令也可以实现在不同机器之间文件的同步传输。用法如下：rsync \u0026lt;src\u0026gt; \u0026lt;dst\u0026gt;\n但通常都会使用-av参数来递归地进行同步（同步文件夹）和文件的元信息（-a参数的效果，-v则是显示当前正在同步的文件，方便监视进度）。另外可以使用-e 'ssh -P xxx'来指定目标机器ssh服务的端口号。更详细的说明请参考：https://www.ruanyifeng.com/blog/2020/08/rsync.html\n","date":"2023年05月13日","externalUrl":null,"permalink":"/posts/2023/05/weeklynotes/","section":"博客","summary":"slumr作业调度系统 # 当因作业名太长，而无法用squeue命令看到对应作业的name时，可采用以下方法：\n","title":"周总结-slumr作业系统/AUC计算/传输数据","type":"posts"},{"content":"","date":"2023年05月10日","externalUrl":null,"permalink":"/tags/cca/","section":"标签","summary":"","title":"Cca","type":"tags"},{"content":" 典型相关分析（Canonical Correlation Analysis, CCA）可以计算两组变量（每组变量包含多个变量）之间的相关。参考Pearson相关，它只能计算两个变量之间的相关。本文主要介绍笔者在使用CCA的过程中的理解，可能存在不准确的地方。详细的原理，请参考：https://www.cnblogs.com/pinard/p/6288716.html。\n以下为笔者个人的理解，请批判性地阅读！\n对于两组变量X和Y，其中每组中包含多个变量（(X_1, X_2, \u0026hellip;, X_n))和((Y_1, Y_2, \u0026hellip;, Y_m)）。CCA的任务是为每组变量找到一些新的变量（U和V），使得两组新的变量之间的相关值最大。其中新产生的变量叫做canonical variabel，它的个数取决于两组原始变量中变量数较少的那组变量的个数，即(min(n, m))。另外，新的变量U和V分别是X和Y中各个变量的线性组合，其中的系数叫做canoncial coefficient（A和B）。\nMATALB中可以用canoncorr函数来做CCA。它输入参数为X和Y，输出是A，B，r，U，V和stats。其中A，B，U，V代表的含义如上所述。r表示canonical variable之间（U和V）的相关系数，它的个数与U和V中的变量个数（列数）相同，也等于(min(n, m))。stats中是一些统计量和显著性。\nCCA中还有一个概念叫loading，它是U和A之间（或者V和B）的相关（U中的每一个变量分别和X中的每一个变量计算相关）。初步尝试后发现，A中较大值对应在X中的特征和U的相关会更大。因为A中越大的值对应的X中的变量，实际对U的影响也会越大。\n参考 # https://www.cnblogs.com/pinard/p/6288716.html\nhttps://ww2.mathworks.cn/help/stats/canoncorr.html\nhttps://blog.csdn.net/NoBuggie/article/details/102830981\n","date":"2023年05月10日","externalUrl":null,"permalink":"/posts/2023/05/practiceaboutcca/","section":"博客","summary":"典型相关分析（Canonical Correlation Analysis, CCA）可以计算两组变量（每组变量包含多个变量）之间的相关。参考Pearson相关，它只能计算两个变量之间的相关。本文主要介绍笔者在使用CCA的过程中的理解，可能存在不准确的地方。详细的原理，请参考：https://www.cnblogs.com/pinard/p/6288716.html。\n","title":"典型相关分析CCA","type":"posts"},{"content":"","date":"2023年04月13日","externalUrl":null,"permalink":"/tags/%E8%AE%BA%E6%96%87/","section":"标签","summary":"","title":"论文","type":"tags"},{"content":"本文摘选自《心理学最佳入门》（【美】桑德拉·切卡莱丽 诺兰·怀特著 周仁来等译）。\n不管是短论文还是长论文，写论文包括很多步骤。你应该在截至日期前很久就开始下列步骤（而不是在前一晚才开始）：\n1. 选择话题 # 第一步就是为自己的论文选择一个话题。有些情况下，教师会给出一列备选话题，这能让你的工作简单些。如果没有给出，不要害怕在办公室开放时间内去找教师讨论几个可能的话题。尽量选一个你感兴趣、愿意从中学到东西的话题。学生常犯的错误就是所选话题过于宽泛。比如，\u0026ldquo;精神发育迟滞\u0026quot;这个话题可以写满一本书。具体一些的话题可以是详细讨论的精神发育迟滞中的一种。再次说明，你的老师可以帮你缩小话题范围。\n2. 做研究 # 根据你的话题，尽可能多找资料。不要局限于教科书或百科全书。去学校图书馆，请管理员指引你阅读与这个话题有关的一些优秀的科学杂志。\n3. 做笔记 # 阅读话题相关内容时，写好笔记卡。在笔记卡片的背面写下你读的这些内容的参考文献。在卡片正面写下你的阅读笔记。有些人喜欢两张笔记卡，一张用来写笔记，另一张写参考文献，这样可以单独分类。\n4. 决定主题 # 主题是你的论文的中心信息，是你想与你的读者交流的信息，根据作业性质的差异，可能是与教师或/和同学交流。有些论文很有煽动性，它们试图用某个观点说服读者，比如\u0026quot;精神发育迟滞并不是由免疫导致的\u0026rdquo;。有些论文是说明性的，向不具备背景知识的读者介绍一个话题，比如\u0026quot;有很多原因可能导致精神发育迟滞\u0026quot;。\n5. 写出提纲 # 使用你所有的阅读笔记写出你论文的提纲\u0026mdash;\u0026mdash;一种有关论文如何行进的\u0026quot;地图\u0026quot;。开始的部分是介绍（如对自闭症的简要定义和讨论），然后决定论文的正文部分应该是什么。假设你的论文是关于精神发育迟滞的一种类型的，你的提纲就应该涵盖那种类型的发育迟滞的不同因素。提纲的最后一节应该是总结。比如，你或许会向发育迟滞儿童的家长给出有关如何让孩子尽可能充分发展的建议。\n6. 写出初稿 # 根据提纲和笔记的引导写出你的论文。如果使用APA格式，为你所有的陈述和主张填上注解，很多人常犯的错误就是没有注明参考文献（指向特定信息来源的某篇参考文献）。记住，不要抄袭，抄袭是指从某个资料中复制信息但不注明出处，让文章看起来像是你自己写的一样。你在使用某一资料时，需要用自己的语言来解释这一信息并注明出处，就像下面这个例子：\n在一个比较同卵和异卵双胞胎的研究中，研究者发现，SRRS中列出的生活压力事件时抑郁症开始时间的非常好的预测因子（Kendler \u0026amp; Prescott, 1999）。\n参考文献部分需要写清这样的引用：kendler, K. S., \u0026amp; Prescott, C. A. (1999). A population-based twin study of lifetime major depression in men and women. Archives of General Psychology, 56(1), 39-44.\n7. 放一边 # 把它扔在一边放几天（如果你提前写好了论文），不去读。然后再回头浏览一下，标出不太准确，需要更多解释、引用或其他修改的地方。把论文放置几天后，再做这项工作就比较简单了，因为你的错误会变得显而易见。\n8. 写出修正版 # 有些人会写很多稿，有的人只会写初稿和最终稿。不管怎样，认真修改草稿，同时检查参考文献。\n","date":"2023年04月13日","externalUrl":null,"permalink":"/posts/2023/04/writeapaper/","section":"博客","summary":"本文摘选自《心理学最佳入门》（【美】桑德拉·切卡莱丽 诺兰·怀特著 周仁来等译）。\n","title":"论文写作：完美诞生自计划","type":"posts"},{"content":"","date":"2023年04月13日","externalUrl":null,"permalink":"/tags/%E5%86%99%E4%BD%9C/","section":"标签","summary":"","title":"写作","type":"tags"},{"content":"","date":"2022年09月09日","externalUrl":null,"permalink":"/tags/cxx/","section":"标签","summary":"","title":"Cxx","type":"tags"},{"content":" Error: C++14 standard requested but CXX14 is not defined # 参考：https://www.zxzyl.com/archives/1283/\n升级gcc，并设置r包编译使用的gcc路径。\n设置方法：\n首先在～/.R目录下新建文件Makevars；\n将\n","date":"2022年09月09日","externalUrl":null,"permalink":"/posts/2022/2022-09-09-installrpackageerror/","section":"博客","summary":"Error: C++14 standard requested but CXX14 is not defined # 参考：https://www.zxzyl.com/archives/1283/\n","title":"R包安装报错","type":"posts"},{"content":"","date":"2022年07月10日","externalUrl":null,"permalink":"/tags/rmarkdown/","section":"标签","summary":"","title":"Rmarkdown","type":"tags"},{"content":" R Markdown图表交叉引用 # 在R Markdown中给图表添加引用是首先需要在文件的输出格式设置为以下三种之一。\noutput: # bookdown::word_document2: default bookdown::html_document2: default # bookdown::pdf_document2: default 其次在绘制图表时需要添加标签，如下图所示：\n这是一个示例。 其中fig-demo为图片的标签。在文中引用时，输入**\\@ref(fig:fig-demo)**即可自动添加图片引用。\nggplot2添加标签 # 修改坐标轴端点样式 # 坐标轴端点样式可以通过如下命令修改，下图分别是三种端点样式的是示例图。\ntheme(axis.line = element_line(lineend=\u0026#39;round\u0026#39;)) 这是round。 这是butt。 这是square。 给柱状图添加标签 # 给柱状图每个柱子添加相应的数字标签可以通过geom_text函数完成，显示效果如下图所示。\ntmpData %\u0026gt;% count(MRIAGE_group, Sex) %\u0026gt;% ggplot(aes(x = MRIAGE_group, y = n, fill = Sex, label = n)) + geom_bar(stat = \u0026#39;identity\u0026#39;, position = position_dodge()) + geom_text(position = position_dodge(width = 0.9), vjust = -0.1) + labs(x = \u0026#39;Age\u0026#39;, y = \u0026#39;Number\u0026#39;) + theme_classic(base_size = 20) + theme( axis.line = element_line(lineend=\u0026#39;round\u0026#39;), axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 0.6)) 柱状图标签。 ","date":"2022年07月10日","externalUrl":null,"permalink":"/posts/2022/2022-07-10-notes/","section":"博客","summary":"R Markdown图表交叉引用 # 在R Markdown中给图表添加引用是首先需要在文件的输出格式设置为以下三种之一。\n","title":"RMarkdown和ggplot2","type":"posts"},{"content":"","date":"2022年07月07日","externalUrl":null,"permalink":"/tags/ants/","section":"标签","summary":"","title":"Ants","type":"tags"},{"content":"","date":"2022年07月07日","externalUrl":null,"permalink":"/tags/fsl/","section":"标签","summary":"","title":"Fsl","type":"tags"},{"content":"","date":"2022年07月07日","externalUrl":null,"permalink":"/tags/register/","section":"标签","summary":"","title":"Register","type":"tags"},{"content":"配准可以把不同空间中的脑影像进行对齐。典型地，在下面场景中就需要用到配准。\n我们有一个在b空间中（例如，MNI152）的感兴趣区，可我们想的到a空间（例如，个体空间）上感兴趣区中的脑指标。大致的思路是，将b空间中的脑图像和a空间中的脑图像进行配准并保存配准的转换参数。之后将转换参数应用到b空间的感兴趣区图像上就能得到a空间中的感兴趣区图像了。\n下面尝试用几种方法实现上述步骤。说明，b.nii.gz和roi.nii.gz都是在b空间中的图像，后者是感兴趣区。目的是的到a空间中的感兴趣区。\nANTs # antsRegistrationSyNQuick.sh \\ -d 3 \\ -f a.nii.gz \\ -m b.nii.gz \\ -o b_space-a antsApplyTransforms -d 3 \\ -i roi.nii.gz \\ -r a.nii.gz \\ -t b_space-a0GenericAffine.mat \\ -t b_space-a1Warp.nii.gz \\ -o roi_space-a.nii.gz fsl # fsl在配准的时候通常要经过线性和非线性配准，用到的命令分别是flirt和fnirt。\nflirt -ref a.nii.gz \\ -in b.nii.gz \\ -omat b2a_linWarp.mat \\ -v # 很慢 fnirt --ref=a.nii.gz \\ --in=b.nii.gz \\ --aff=b2a_linWarp.mat \\ --cout=b2a_nlinWarp \\ --verbose applywarp --ref=a.nii.gz \\ --in=roi.nii.gz \\ --warp=b2a_nlinWarp.nii.gz \\ --out=roi_space-a.nii.gz \\ -v 其他一些有用的命令：\n将多个线性配准的变换参数文件合并为一个文件： convert_xfm -omat AtoC.mat -concat BtoC.mat AtoB.mat 求解逆转换参数 convert_xfm -omat refvol2invol.mat -inverse invol2refvol.mat 应用线性变换参数生成配准后的图像 flirt -in newvol -ref refvol -out outvol -init invol2refvol.mat -applyxfm ","date":"2022年07月07日","externalUrl":null,"permalink":"/posts/2022/2022-07-07-register/","section":"博客","summary":"配准可以把不同空间中的脑影像进行对齐。典型地，在下面场景中就需要用到配准。\n","title":"配准方法示例","type":"posts"},{"content":"","date":"2022年03月24日","externalUrl":null,"permalink":"/tags/fdg/","section":"标签","summary":"","title":"Fdg","type":"tags"},{"content":"","date":"2022年03月24日","externalUrl":null,"permalink":"/tags/pet/","section":"标签","summary":"","title":"Pet","type":"tags"},{"content":"本段代码参考自：https://github.com/DlutMedimgGroup/Chinese-Brain-PET-Template/blob/master/Matlab%20Scripts/Reset_Origin.m\n%对图像进行归中心的处理 function [] = Reset_Origin(ROOT) niftiRootPath = fullfile(ROOT, \u0026#39;*.nii\u0026#39;); niftiSubs = dir(niftiRootPath); %归中心处理 for i = 1:numel(niftiSubs) disp(fullfile(ROOT, niftiSubs(i).name))%显示当前处理图像名称 st.vol = spm_vol(fullfile(ROOT, niftiSubs(i).name)); vs = st.vol.mat\\eye(4); vs(1:3,4) = (st.vol.dim+1)/2; spm_get_space(st.vol.fname,inv(vs)); end end ","date":"2022年03月24日","externalUrl":null,"permalink":"/posts/2022/2022-03-24-resetorigin/","section":"博客","summary":"本段代码参考自：https://github.com/DlutMedimgGroup/Chinese-Brain-PET-Template/blob/master/Matlab%20Scripts/Reset_Origin.m\n","title":"对PET图像进行归中心处理","type":"posts"},{"content":"","date":"2022年03月15日","externalUrl":null,"permalink":"/tags/curvature/","section":"标签","summary":"","title":"Curvature","type":"tags"},{"content":"","date":"2022年03月15日","externalUrl":null,"permalink":"/tags/freesurfer/","section":"标签","summary":"","title":"Freesurfer","type":"tags"},{"content":" The measures about curvatures # mris_curvature_stats # ?h.smoothwm.xxx.crv is the the binary-curvature files where xxx is the different measures. Detailed descriptation is as follows:\nk1 maximum curvature\nk2 minimum curvature\nK Gaussian = k1*k2\nH Mean = 0.5*(k1+k2)\nC Curvedness = sqrt(0.5*(k1*k1+k2*k2))\nS Sharpness = (k1 - k2)^2\nBE Bending Energy = k1k1 + k2k2\nSI Shape Index = atan((k1+k2)/(k2-k1))\nFI Folding Index = |k1|*(|k1| - |k2|)\nIn each file, the corresponding measures for each vertex were saved. And you may read it by read.fs.curv() in R package \u0026ldquo;freesurferformats\u0026rdquo;.\nExample: mris_curvature_stats -F pial/smoothwm/white -G -o xxx sub-2455 rh\nxxx is the file to save descriptation statistical results. -F is flag of surface name, the default is smoothwm in FreeSurfer Version 7.2.0. -G is calculated a series of derived curvature values from current surface file.\nmris_curvature # It calculated the mean curvature and Gaussian curvature for a surface.\nExample: mris_curvature -w lh.white\nThis command will output the lh.white.H and lh.white.K.\nExample: mris_curvature -w -a 10 lh.white\nThis command smooth 10 for the original outputs.\nThe Integrated Rectified Mean/Gaussian Curvature # The descriptation is MeanCurv is the integral of the absolute value of H and GausCurv is the integral of the absolute value of K.\nIt seem is taking the absolute vaule for each vertex and multi with the area, and sum for all vertex on the region. (https://www.mail-archive.com/freesurfer@nmr.mgh.harvard.edu/msg55168.html, and https://www.mail-archive.com/freesurfer@nmr.mgh.harvard.edu/msg45618.html).\nOther measures # The area of a the pial/white is ?h.area.pial/?h.area. The ?h.volume and ?h.thickness is the volume and thickness of cortical.\n","date":"2022年03月15日","externalUrl":null,"permalink":"/posts/2022/2022-03-15-curvatureoffreesurfer/","section":"博客","summary":"The measures about curvatures # mris_curvature_stats # ?h.smoothwm.xxx.crv is the the binary-curvature files where xxx is the different measures. Detailed descriptation is as follows:\n","title":"FreeSurfer笔记[2]","type":"posts"},{"content":"","date":"2022年03月15日","externalUrl":null,"permalink":"/tags/surface/","section":"标签","summary":"","title":"Surface","type":"tags"},{"content":"","date":"2022年03月15日","externalUrl":null,"permalink":"/tags/vertex/","section":"标签","summary":"","title":"Vertex","type":"tags"},{"content":" Outputs # FreeSurfer首先去除颅骨（stripped skull），生成brainmask.mgz文件，并进一步分出灰质、白质和皮下结构，保存在aseg.mgz文件中。与此同时，得到白质/灰质的初步估计（?h.orig），随后对分界面进行进一步的调整得到?j.white。在?h.white的基础上，分界面继续向外膨胀得到?h.pial，并进一步膨胀得到?h.inflated。?h.sphere为?h.inflated膨胀形成的球面。可以用来与其他空间图像进行配准（例如fsaverage）。\nrecon-all命令中的-qcache可以生成fsaverage空间中的且经过平滑后的数据。\nlabel文件夹 # .ctab文件为颜色表（color table），存储不同atlas定义脑区的颜色。.annot文件为分区信息，其中包含每个vertex所属的脑区等信息。.label文件保存所有vertex所属脑区编号和坐标。\nsurf文件夹 # ?h.area为midthickness表面的面积，?h.area.pial为灰质（软脑膜）表面的面积。?h.sulc为沟回宽度。\nstats文件夹 # 保存不同分区下的灰质指标。\n命令 # mris_preproc # 将个体皮层空间中的指标文件投射到fsavergae等标准皮层空间。\nExample-1 # Resample abcXX-anat/surf/lh.thickness onto fsaverage:\nmris_preproc --s abc01-anat \\ --s abc02-anat \\ --s abc03-anat \\ --s abc04-anat \\ --target fsaverage \\ --hemi lh \\ --meas thickness \\ --out abc-lh-thickness.mgh Example-2 # Same as #1 but smooths by 5mm fwhm:\nmris_preproc --s abc01-anat \\ --s abc02-anat \\ --s abc03-anat \\ --s abc04-anat \\ --target fsaverage \\ --hemi lh \\ --meas thickness \\ --fwhm 5 \\ --out abc-lh-thickness.sm5.mgh mri_glmfit # GLM建模统计。\nmri_glmfit-sim # 多重比较校正。\nmri_vol2vol / mri_vol2surf / mri_surf2surf # 体素/皮层空间到体素/皮层空间的投射。\nExample-1 # 将fsaverage空间中的prcellation文件（aaa.annot）转换到个体皮层空间（bbb.annot）。\nmri_surf2surf --hemi lh \\ --srcsubject fsaverage \\ --sval-annot aaa.annot \\ --trgsubject sub-xxx \\ --trgsurfval bbb.annot mris_calc # 类似fslmath，对图像进行计算。\nfs皮层空间到MNI体素空间 # 首先需要对一个标准空间中的图像进行recon-all处理，这里以ch2.nii.gz为例。（参考B站up@七彩神经）\nrecon-all -s ch2 -i ch2.nii.gz -all # 将fsaverage空间中的label文件转换到个体的皮层空间 mri_label2label --srclabel xxx \\ --srcsubject fsaverage \\ --trgsubject ch2 \\ --trglabel xxx \\ --regmethod surface \\ --hemi xxx # 生成个体体素空间到皮层空间的映射关系 tkregister2 --mov xxx/ch2/mri/orig.mgz \\ --noedit \\ --s ch2 \\ --regheader \\ --reg register.dat # 将个体皮层空间中的label转换为体素空间中的.nii文件 mri_label2vol --label xxx \\ --temp xxx/ch2/mri/orig.mgz \\ --subject ch2 \\ --hemi xxx \\ --o xxx \\ --proj frac 0.1 0.1 \\ --fillthresh 0.5 \\ --reg register.dat 参考 # [1]: FreeSurferWiki\n[2]: Andy\u0026rsquo;s Brain Book\n","date":"2022年03月11日","externalUrl":null,"permalink":"/posts/2022/2022-03-11-freesurfer/","section":"博客","summary":"Outputs # FreeSurfer首先去除颅骨（stripped skull），生成brainmask.mgz文件，并进一步分出灰质、白质和皮下结构，保存在aseg.mgz文件中。与此同时，得到白质/灰质的初步估计（?h.orig），随后对分界面进行进一步的调整得到?j.white。在?h.white的基础上，分界面继续向外膨胀得到?h.pial，并进一步膨胀得到?h.inflated。?h.sphere为?h.inflated膨胀形成的球面。可以用来与其他空间图像进行配准（例如fsaverage）。\n","title":"FreeSurfer笔记[1]","type":"posts"},{"content":"","date":"2022年03月11日","externalUrl":null,"permalink":"/tags/t1w/","section":"标签","summary":"","title":"T1w","type":"tags"},{"content":"","date":"2022年02月22日","externalUrl":null,"permalink":"/tags/cifti/","section":"标签","summary":"","title":"Cifti","type":"tags"},{"content":"CIFTI (Connectivity Informatics Technology Initiative) 是HCP项目中开发的神经影像存储格式。具体可参考2016年Glasser等人发表的文章(Glasser et al., Nature neuroscience, 2015)。开发者在GitHub上提供了读写的MATLAB工具包，可在此处下载：https://github.com/Washington-University/cifti-matlab。\n","date":"2022年02月22日","externalUrl":null,"permalink":"/posts/2022/2022-02-22-readcifti/","section":"博客","summary":"CIFTI (Connectivity Informatics Technology Initiative) 是HCP项目中开发的神经影像存储格式。具体可参考2016年Glasser等人发表的文章(Glasser et al., Nature neuroscience, 2015)。开发者在GitHub上提供了读写的MATLAB工具包，可在此处下载：https://github.com/Washington-University/cifti-matlab。\n","title":"CIFTI文件的读取和可视化","type":"posts"},{"content":"","date":"2022年02月22日","externalUrl":null,"permalink":"/tags/visualization/","section":"标签","summary":"","title":"Visualization","type":"tags"},{"content":"","date":"2022年02月21日","externalUrl":null,"permalink":"/tags/fmriprep/","section":"标签","summary":"","title":"Fmriprep","type":"tags"},{"content":"","date":"2022年02月21日","externalUrl":null,"permalink":"/tags/singularity/","section":"标签","summary":"","title":"Singularity","type":"tags"},{"content":" 运行MATLAB # 使用matlab镜像运行matlab可使用如下命令：\nsingularity exec matlab-r2020a.img matlab -batch xxx 其中matlab-r2020a.img为镜像名称，xxx为matlab脚本，不包含.m。\n运行fmriprep # 脑院高性能平台最高支持fmriprep版本为20.1.3，版本再高会报告I/O异常的错误。\n在镜像中运行fmriprep的命令（不同版本的命令有些许差异，这里以20.1.3为例）如下：\nsingularity exec fmriprep-20.1.3.simg fmriprep data-test/ fres_data-test/ participant \\ --skip_bids_validation \\ --participant_label 12002 \\ -w fwk_data-test/ \\ --verbose \\ --fs-license-file license_lin.txt 其中fmriprep-20.1.3.simg为镜像名称。data-test为存放所有被试的文件夹。\n运行smriprep的命令如下：\nsingularity exec fmriprep-20.1.3.simg smriprep data-test/ sres_data-test/ participant \\ --pariticipant_label 12002 \\ -w fwk_data-test/ \\ --fs-license-file license_lin.txt ","date":"2022年02月21日","externalUrl":null,"permalink":"/posts/2022/2022-02-21-singularity5/","section":"博客","summary":"运行MATLAB # 使用matlab镜像运行matlab可使用如下命令：\n","title":"Singularity-05-Matlab\u0026fmriprep","type":"posts"},{"content":"","date":"2022年02月18日","externalUrl":null,"permalink":"/tags/templateflow/","section":"标签","summary":"","title":"Templateflow","type":"tags"},{"content":"templateflow中包含了一些典型的神经影像脑模版，可在fmriprep等工具中使用。本文主要介绍如何下载templateflow。\n准备 # GitHub上有它的仓库，但是那只是DataLab的索引，因此直接下载是不能下载到模版文件的。需要通过DataLab下载。\n首先，安装DataLab（以Ubuntu 21.10为例）。\nconda install -c conda-forge datalad # OR sudo apt-get install datalab 下载 # 下载索引文件，并使用DataLab下载模版。\ngit clone https://github.com/templateflow/templateflow.git cd templateflow # tpl-* 下载所有模版 datalad get -r tpl-fsLR 通过python下载 # 笔者在使用datalad下载过程中，会经常遇到进度条长时间不动的情况。而且印象当中，笔者以前用python下载成功过，速度也不是很慢。因此这里将python下载templateflow的方法也追加进来。\n首先设置环境变量。\nexport TEMPLATEFLOW_HOME=$HOME/.templateflow 使用pip安装templateflow包。\npython -m pip install -U templateflow 下载templateflow。\npython -c \u0026#34;from templateflow.api import get; get([\u0026#39;MNI152NLin2009cAsym\u0026#39;, \u0026#39;MNI152NLin6Asym\u0026#39;, \u0026#39;OASIS30ANTs\u0026#39;, \u0026#39;MNIPediatricAsym\u0026#39;, \u0026#39;MNIInfant\u0026#39;])\u0026#34; 这里可以根据需要下载相应的模版文件。\n相关链接 # templateflow项目地址：https://github.com/templateflow/\nDataLab网址：https://www.datalad.org/\npython下载参考网址：https://fmriprep.org/en/1.5.9/spaces.html\n","date":"2022年02月18日","externalUrl":null,"permalink":"/posts/2022/2022-02-18-templateflow/","section":"博客","summary":"templateflow中包含了一些典型的神经影像脑模版，可在fmriprep等工具中使用。本文主要介绍如何下载templateflow。\n","title":"下载templateflow","type":"posts"},{"content":"","date":"2022年02月17日","externalUrl":null,"permalink":"/tags/centos/","section":"标签","summary":"","title":"Centos","type":"tags"},{"content":"以下是记录本人在使用学院高性能计算平台运行singularity中遇到的问题以及相应的解决方法，不一定适用于其他场景。\n建立基础镜像 # sudo singularity build --sandbox tmp/ docker://centos:7 尝试过ubuntu:20.04和18.04，在服务器上均会报告\u0026quot;FATAL: kernel too old\u0026ldquo;的错误。Centos6.10和7可以，但是6.10的yum源已经不再支持。因此使用Centos7作为基础镜像。\n安装MATLAB # 这里参考：https://zhuanlan.zhihu.com/p/394298249\n需要注意的是，安装之前，需要在系统里面安装一些库文件和编译器，命令如下：\nyum install libX11 libXmu yum install gcc java-11-openjdk-devel libXmu中包含libXt.so.6。\n后处理 # 安装好MATLAB后，发现无法通过singularity exec去调用。在**/environment**文件中将MATLAB的安装路径添加进PATH环境变量里面也无法直接运行（可能是写入的命令格式有问题，不确定）。之后查到可以定义一个recipe文件（append.def），通过已经生成的镜像重新构建镜像。recipe文件内容如下：\nBootstrap: localimage From: tmp/ %environment export PATH=/usr/local/matlab/R2020a/bin:$PATH 然后重新构建镜像：\nsudo singularity build --sandbox senv-matlab/ append.def 构建完成后，需要将镜像打包为可读写的格式（.img文件）。\nsudo singularity build --writable senv-matlab.img senv-matlab/ 这里生成的senv-matlab.img就可在服务器上使用了，也可在服务器上将其转换为压缩格式（.sif/.sqsh/.simg文件等）。不知道为什么直接在本地（Ubuntu 21.10）压缩后，在本地无运行镜像，会报告如下错误。\nERROR : Failed to mount squashfs image in (read only): Invalid argument ABORT : Retval = 255 参考 # https://zhuanlan.zhihu.com/p/394298249\nhttp://tigeroses.com/2021/05/30/singularity-container/\n","date":"2022年02月17日","externalUrl":null,"permalink":"/posts/2022/2022-02-17-singularity4/","section":"博客","summary":"以下是记录本人在使用学院高性能计算平台运行singularity中遇到的问题以及相应的解决方法，不一定适用于其他场景。\n","title":"Singularity-04-安装MATLAB","type":"posts"},{"content":"","date":"2022年02月17日","externalUrl":null,"permalink":"/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/","section":"标签","summary":"","title":"服务器","type":"tags"},{"content":"","date":"2022年01月19日","externalUrl":null,"permalink":"/tags/neuroimage/","section":"标签","summary":"","title":"Neuroimage","type":"tags"},{"content":"","date":"2022年01月19日","externalUrl":null,"permalink":"/tags/nipype/","section":"标签","summary":"","title":"Nipype","type":"tags"},{"content":"","date":"2022年01月19日","externalUrl":null,"permalink":"/tags/scipy/","section":"标签","summary":"","title":"Scipy","type":"tags"},{"content":" 问题 # 我们在对神经影像数据做完统计后（例如ICA），会得到相应的mask二值文件。但是有些情况下，我们还需要进一步对mask中每一个cluster进行分析（例如计算mask中每个cluster之间的功能连接）。所以我们需要从mask文件中得到每一个cluster。由于没有想到有哪个现成的工具包可以解决上述的问题。因此，本文试图用自己的方式去解决上述的问题。\n方法 # 思路一 # 看到这个问题的时候，最朴素的想法就是用MRIcron/GL或者ITK-SNAP手动将mask中的每一个cluster标记出来。\n思路二 # 虽然上述手动标记的方法能解决这个问题，但是显得没那么优雅（bushi。就想换用代码解决这个问题。而且写完代码下次再碰到类似的问题，就能直接使用了（还能水一篇推送。\n首先我想着先找出mask中所有非零元素的下标，然后选一个非零元素，再去判断这个元素的邻域是否是0（如果是0就意味着已经到了这个cluster的边缘）。但是在三维图像里面，要判断邻域是否到达边缘，需要写8个条件判断，这也很不优雅（主要还是找到了一个现成的轮子。\n之后在找\u0026quot;轮子\u0026quot;的时候，看到了scipy包里面的一个函数可以实现上面的过程。因此通过调用它近乎完美地解决了最开始的问题（bushi。下面是相应的代码。\nimport nibabel as nib from scipy.ndimage import measurements import logging logging.basicConfig(level=logging.INFO) img = nib.load(\u0026#39;test-binary.nii\u0026#39;) data = img.get_fdata() labels, num_labels = measurements.label(data) logging.info(f\u0026#39;The number of cluster is {num_labels}\u0026#39;) nib.save(nib.Nifti1Image(labels, img.affine), f\u0026#39;test_cluster-mix.nii\u0026#39;) for i in range(num_labels): tmp_data = np.zeros(data.shape) tmp_data[labels == i + 1] = 1 nib.save(nib.Nifti1Image(tmp_data, img.affine), f\u0026#39;test_cluster-{i+1}.nii\u0026#39;) test-binary.nii是从Neurosynth上随便找的一个功能连接图谱，并以±0.2作为阈值得到的mask文件（Figure 1）。\ntest-binary.nii可视化结果。 上述代码运行后，对于mask中的每一个cluster会得到一个.nii文件，同时也会得到一个混合了所有cluster的.nii文件。结果如Figure 2所示。\n混合了所有cluster的结果，其中每个cluster用一个整数标记。 参考 # https://neurosynth.org/locations/-4_24_46_6\nhttps://stackoverflow.com/questions/52087533/how-to-find-number-of-clusters-in-a-image/52088840\n","date":"2022年01月19日","externalUrl":null,"permalink":"/posts/2022/2022-01-19-findcluster/","section":"博客","summary":"问题 # 我们在对神经影像数据做完统计后（例如ICA），会得到相应的mask二值文件。但是有些情况下，我们还需要进一步对mask中每一个cluster进行分析（例如计算mask中每个cluster之间的功能连接）。所以我们需要从mask文件中得到每一个cluster。由于没有想到有哪个现成的工具包可以解决上述的问题。因此，本文试图用自己的方式去解决上述的问题。\n","title":"确定图像中的cluster","type":"posts"},{"content":"","date":"2021年11月20日","externalUrl":null,"permalink":"/tags/nibabel/","section":"标签","summary":"","title":"Nibabel","type":"tags"},{"content":"","date":"2021年11月20日","externalUrl":null,"permalink":"/tags/nilearn/","section":"标签","summary":"","title":"Nilearn","type":"tags"},{"content":"","date":"2021年11月20日","externalUrl":null,"permalink":"/tags/pydicom/","section":"标签","summary":"","title":"Pydicom","type":"tags"},{"content":" DICOM文件 # DICOM格式是医学成像设备输出的统一的文件格式，它包含数据头信息和数据信息两部分。其中头信息包含扫描设备的信息以及被试的信息等，另外还包括其他关于数据的元信息。数据部分是扫描设备采集到扫描物体的信号值。\n利用Pydicom包可以使用Python操作DICOM文件，包括对DICOM文件的读写、头信息的增删改等。\n安装 # pip install pydicom # 或 conda install -c conda-forge pydicom 示例数据 # from pydicom.data import get_testdata_file fpath = get_testdata_file(\u0026#34;CT_small.dcm\u0026#34;) fpath Out: \u0026lsquo;/Applications/miniconda3/lib/python3.9/site-packages/pydicom/data/test_files/CT_small.dcm\u0026rsquo;\n读入文件 # from pydicom import dcmread ds = dcmread(fpath) ds 输出：\nDataset.file_meta ------------------------------- (0002, 0000) File Meta Information Group Length UL: 192 (0002, 0001) File Meta Information Version OB: b\u0026#39;\\x00\\x01\u0026#39; (0002, 0002) Media Storage SOP Class UID UI: CT Image Storage (0002, 0003) Media Storage SOP Instance UID UI: 1.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 (0002, 0010) Transfer Syntax UID UI: Explicit VR Little Endian (0002, 0012) Implementation Class UID UI: 1.3.6.1.4.1.5962.2 (0002, 0013) Implementation Version Name SH: \u0026#39;DCTOOL100\u0026#39; (0002, 0016) Source Application Entity Title AE: \u0026#39;CLUNIE1\u0026#39; ... 访问数据的子元素 # 可以通过两种方式访问ds中的元素，其一是利用元素的位置，即每个元素中最前面的两个两位十六进制数，如(0x0043, 0x104e)；其二是利用元素的名称访问。下面对三种方式分别进行演示。\n按位置访问 # elem = ds[0x0008, 0x0008] elem Out: (0008, 0008) Image Type CS: [\u0026lsquo;ORIGINAL\u0026rsquo;, \u0026lsquo;PRIMARY\u0026rsquo;, \u0026lsquo;AXIAL\u0026rsquo;]\n按名称访问 # elem = ds[\u0026#39;ImageType\u0026#39;] elem Out: (0008, 0008) Image Type CS: [\u0026lsquo;ORIGINAL\u0026rsquo;, \u0026lsquo;PRIMARY\u0026rsquo;, \u0026lsquo;AXIAL\u0026rsquo;]\n访问元素的值 # val = ds.ImageType val val = ds[\u0026#39;ImageType\u0026#39;].value val Out: [\u0026lsquo;ORIGINAL\u0026rsquo;, \u0026lsquo;PRIMARY\u0026rsquo;, \u0026lsquo;AXIAL\u0026rsquo;]\n嵌套元素 # 头信息中包含部分嵌套的元素，这些元素的子元素不能通过位置和名称直接访问，得先获取到嵌套元素后，再按照类似数组的方式访问它里面的元素。\nnelem = ds[\u0026#39;OtherPatientIDsSequence\u0026#39;] nelem Out: \u0026lt;Sequence, length 2\u0026gt;\nnelem[0] Out: (0010, 0020) Patient ID LO: \u0026lsquo;ABCD1234\u0026rsquo;\n(0010, 0022) Type of Patient ID CS: \u0026lsquo;TEXT\u0026rsquo;\n修改元素 # nelem[0][\u0026#39;PatientID\u0026#39;].value = \u0026#39;TestDemo\u0026#39; # 或 nelem[0].PatientID = \u0026#39;TestDemo\u0026#39; 删除元素 # del ds[0x0028, 0x1050] # 或 del ds[\u0026#39;PatientID\u0026#39;] 增加元素 # ds.add_new([0x0028, 0x1050], \u0026#39;DS\u0026#39;, \u0026#34;100.0\u0026#34;) # 或 ds.WindowWidth = 500 保存文件 # ds.save_as(\u0026#39;Test.dcm\u0026#39;) NIFTI文件 # 安装 # pip install nibabel 数据获取 # 以下代码会自动下载示例数据到nibabel的目录下。\nimport os import numpy as np from nibabel.testing import data_path example_file = os.path.join(data_path, \u0026#39;example4d.nii.gz\u0026#39;) example_file Out: \u0026lsquo;/Applications/miniconda3/lib/python3.9/site-packages/nibabel/tests/data/example4d.nii.gz\u0026rsquo;\n数据读取 # import nibabel as nib img = nib.load(example_file) img Out: \u0026lt;nibabel.nifti1.Nifti1Image at 0x7fd908af12b0\u0026gt;\n这里的img就是Nifti文件本身，通过它可以访问到文件的头信息和数据矩阵。\n数据头信息 # header = img.header header print(header) Out: \u0026lt;nibabel.nifti1.Nifti1Header at 0x7fd908af1460\u0026gt;\n\u0026lt;class \u0026#39;nibabel.nifti1.Nifti1Header\u0026#39;\u0026gt; object, endian=\u0026#39;\u0026lt;\u0026#39; sizeof_hdr : 348 data_type : b\u0026#39;\u0026#39; db_name : b\u0026#39;\u0026#39; extents : 0 session_error : 0 regular : b\u0026#39;r\u0026#39; dim_info : 57 dim : [ 4 128 96 24 2 1 1 1] intent_p1 : 0.0 intent_p2 : 0.0 intent_p3 : 0.0 intent_code : none datatype : int16 bitpix : 16 slice_start : 0 pixdim : [-1.000000e+00 2.000000e+00 2.000000e+00 2.199999e+00 2.000000e+03 1.000000e+00 1.000000e+00 1.000000e+00] vox_offset : 0.0 ... 数据矩阵 # data = img.get_fdata() data.shape Out: (128, 96, 24, 2)\n数据矩阵可以执行矩阵的运算等操作，可通过numpy包进行执行相关操作。\nimg对象的slicer方法可以选择特定层的数据，并返回一个img对象。\nimg_slice = img.slicer[32:-32, ...] img_slice.shape Out: (64, 96, 24, 2)\nimg包含一个标识矩阵方向与实际空间中方向的矩阵，较affine矩阵，可通过img.affine访问。\n通过函数nib.orientations.aff2axcodes(img.affine)可返回affine对应的实际空间中的方向。具体的信息请参考：https://sangfengchn.github.io/home/post/2021/06/02/blog/\n上面函数的返回信息为：(\u0026lsquo;L\u0026rsquo;, \u0026lsquo;A\u0026rsquo;, \u0026lsquo;S\u0026rsquo;)，表示矩阵x轴的正方向为被试的左边，矩阵y轴的正方向为被试的前面，z轴正方向表示被试的下面。详细描述：https://nipy.org/nibabel/coordinate_systems.html#nibabel-always-uses-an-ras-output-space\n保存 # img_slice.to_filename(\u0026#39;TestNifti.nii.gz\u0026#39;) # 或 img_save = nib.Nifti1Image(data, img.affine) nib.save(img_save, \u0026#39;TestNifti2.nii.gz\u0026#39;) 可视化 # nilearn提供了较为完备的可视化功能，同时也提供了统计功能。这里只介绍它的可视化功能。\n加载数据 # from nilearn import datasets # one motor contrast map from NeuroVault motor_images = datasets.fetch_neurovault_motor_task() stat_img = motor_images.images[0] stat_img Out: \u0026lsquo;/Users/xxxx/nilearn_data/neurovault/collection_658/image_10426.nii.gz\u0026rsquo;\n演示一：激活图 # from nilearn import plotting plotting.plot_stat_map(stat_img, threshold=3, title=\u0026#34;plot_stat_map\u0026#34;, cut_coords=[36, -27, 66]) 演示二：交互激活图 # plotting.view_img(stat_img, threshold=3) 演示三：玻璃脑 # plotting.plot_glass_brain(stat_img, title=\u0026#39;plot_glass_brain\u0026#39;, threshold=3) 演示四：结构像 # plotting.plot_anat(\u0026#39;sub-1000199_ses-1_proc-facemask_T1w.nii.gz\u0026#39;, title=\u0026#34;plot_anat\u0026#34;) 数据分析 # nipype提供了常用神经影像分析工具包的接口，包括FSL、FreeSurfer、ANTs等。\n这里以ANTs去除非脑组织为例。ANTs去非脑组织的过程是通过配准来实现的，需要事先提供带颅骨的模版和只包含脑组织的模版。\nimport os from nipype.interfaces.ants.segmentation import BrainExtraction anatomical_image = \u0026#39;sub-1000199_ses-1_proc-facemask_T1w.nii.gz\u0026#39; template = \u0026#39;MICCAI2012-Multi-Atlas-Challenge-Data/T_template0.nii.gz\u0026#39; brainmask = \u0026#39;MICCAI2012-Multi-Atlas-Challenge-Data/T_template0_BrainCerebellumMask.nii.gz\u0026#39; out_prefix = \u0026#39;sub-1000199_ses-1_T1w_seg-brain\u0026#39; brain_extraction = BrainExtraction( dimension=3, anatomical_image=anatomical_image, brain_template=template, brain_probability_mask=brainmask, out_prefix = out_prefix, num_threads=32) brain_extraction.run() 原始图像：\n结果图像：\n另外，nipype还提供了处理流程图（workflow engine），可以方便地将不同处理工具整合进一个处理流程里面。官方文档提供了DTI、fMRI和sMRI部分处理的例子。\n参考 # pydicom: https://pydicom.github.io\nnibabel: https://nipy.org/nibabel/\nnilearn: https://nilearn.github.io/stable/index.html\nnipype: https://nilearn.github.io/stable/index.html\n","date":"2021年11月20日","externalUrl":null,"permalink":"/posts/2021/2021-11-20-pythonforneuroimage/","section":"博客","summary":"DICOM文件 # DICOM格式是医学成像设备输出的统一的文件格式，它包含数据头信息和数据信息两部分。其中头信息包含扫描设备的信息以及被试的信息等，另外还包括其他关于数据的元信息。数据部分是扫描设备采集到扫描物体的信号值。\n","title":"Python for Neuroimage data","type":"posts"},{"content":"","date":"2021年11月19日","externalUrl":null,"permalink":"/tags/bar-plot/","section":"标签","summary":"","title":"Bar Plot","type":"tags"},{"content":"","date":"2021年11月19日","externalUrl":null,"permalink":"/tags/colormap/","section":"标签","summary":"","title":"Colormap","type":"tags"},{"content":" 自定义Colormap # 在一些场景下，我们需要自己构造数字与颜色的对应关系。比如，我们在探究每个ROI随龄变化的趋势时，我们需要将回归方程中年龄的系数展示在脑图上。朴素的想法是，我构造一个关于系数与颜色的映射关系，给定某一系数，就返回相应的颜色。实现方法如下：\nlibrary(tidyverse) library(RColorBrewer) data \u0026lt;- data.frame(Val = rnorm(100)) %\u0026gt;% as_tibble() # 选择合适的颜色 colors \u0026lt;- brewer.pal(11, \u0026#39;RdBu\u0026#39;) # 考虑到数字的正负号，我们这里用差异较明显的颜色区分正负 pos.color \u0026lt;- colorRampPalette(colors[6:1])(1000 * round(max(data$Val), 3) + 1) neg.color \u0026lt;- colorRampPalette(colors[6:11])(-1000 * round(min(data$Val), 3) + 1) res \u0026lt;- rep(\u0026#39;\u0026#39;, length(data$Val)) for (i in 1:length(data$Val)) { if (round(data$Val[i], 3) \u0026lt; 0) { res[i] \u0026lt;- neg.color[1000 * round(-data$Val[i], 3)] } else if (round(data$Val[i], 3) \u0026gt; 0) { res[i] \u0026lt;- pos.color[1000 * round(data$Val[i], 3)] } else { res[i] \u0026lt;- pos.color[1] } } data[\u0026#39;Color\u0026#39;] \u0026lt;- res data[, c(\u0026#39;Red\u0026#39;, \u0026#39;Green\u0026#39;, \u0026#39;Blue\u0026#39;)] \u0026lt;- t(col2rgb(res)) / 255 # 演示颜色 ggplot(data = data, aes(x = Val, y = Val)) + geom_point(color = data$Color, size = 10) 其中，data中同一行表示数字与对应的颜色。\n效果如下所示：\n带误差线的柱状图 # library(tidyverse) data \u0026lt;- data.frame( val = rnorm(10) + 5, error = rnorm(10), name = letters[1:10] ) data %\u0026gt;% ggplot(aes(x = name, y = val)) + geom_bar(stat = \u0026#39;identity\u0026#39;) + # 添加误差线 geom_errorbar(aes(ymin = val - error, ymax = val + error, width = 0.2)) + labs(y = \u0026#39;Val\u0026#39;, x = \u0026#39;\u0026#39;) + theme_bw() + theme(legend.position = \u0026#39;None\u0026#39;, axis.title = element_text(size = 20), axis.text = element_text(size = 16, colour = \u0026#39;black\u0026#39;), panel.border = element_rect(size = 1.5), # 将x轴标签旋转一定角度 axis.text.x = element_text(size = 30, angle = 45, vjust = 1, hjust = 1)) 效果如下所示：\n","date":"2021年11月19日","externalUrl":null,"permalink":"/posts/2021/2021-11-19-weeklysummary/","section":"博客","summary":"自定义Colormap # 在一些场景下，我们需要自己构造数字与颜色的对应关系。比如，我们在探究每个ROI随龄变化的趋势时，我们需要将回归方程中年龄的系数展示在脑图上。朴素的想法是，我构造一个关于系数与颜色的映射关系，给定某一系数，就返回相应的颜色。实现方法如下：\n","title":"周总结-自定义Colormap/误差棒柱状图","type":"posts"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/bianca/","section":"标签","summary":"","title":"BIANCA","type":"tags"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/lst/","section":"标签","summary":"","title":"LST","type":"tags"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/sls/","section":"标签","summary":"","title":"SLS","type":"tags"},{"content":" 介绍 # 白质高信号（white matter hyperintensity, WMH）是一种因脑白质病变导致的、在T2 Flari像上表现为高灰质值的现象。在相关研究中，确定白质高信号区域是一个基本的问题。一般认为，由专业的影像科医生或受过培训的人员手动分割的结果是金标准。然而，手动分割费时费力。因而，研究者提出了许多自动半自动的分割工具。本文将对几种常用的白质高信号自动分割工具的用法进行简单介绍。\nLST # LST (https://www.applied-statistics.de/lst.html) 是基于SPM的白质高信号分割工具，它包含两个分割算法：LPA和LGA。其中，LPA不需要T1数据，而LGA需要T1和Flari数据。\n代码入下：\nLPA # 尽管LPA在分割WMH的时候不需要T1数据，然而在输入里面还是可以将T1数据输入，用来作为配准的参考图像。\n% WMH segment by LPA in LST. close all; clear; clc; % Set SPM12 into Path. SPM_PATH = \u0026#39;~/Tools/spm12\u0026#39;; addpath(SPM_PATH); % Set root path. ROOT = \u0026#39;Work\u0026#39;; subs = dir(ROOT); subs = subs(3:end); for i = 1:numel(subs) % for single subject. disp(subs(i).name); sub_path = fullfile(ROOT, subs(i).name); t1_path = fullfile(sub_path, \u0026#39;t1.nii\u0026#39;); if ~exist(t1_path, \u0026#39;file\u0026#39;) % gunzip the .gz file. gunzip(fullfile(sub_path, \u0026#39;t1.nii.gz\u0026#39;)); end flair_path = fullfile(sub_path, \u0026#39;flair.nii\u0026#39;); if ~exist(flair_path, \u0026#39;file\u0026#39;) gunzip(fullfile(sub_path, \u0026#39;flair.nii.gz\u0026#39;)); end pause(10); spm_jobman(\u0026#39;initcfg\u0026#39;); matlabbatch{1}.spm.tools.LST.lpa.data_F2 = {strcat(flair_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.LST.lpa.data_coreg = {strcat(t1_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.LST.lpa.html_report = 1; spm(\u0026#39;defaults\u0026#39;, \u0026#39;pet\u0026#39;); spm_jobman(\u0026#39;run\u0026#39;, matlabbatch); clear matlabbatch; end LGA # % WMH segment by LGA in LST. close all; clear; clc; % Set SPM12 into Path. SPM_PATH = \u0026#39;/home/babri3/Tools/spm12\u0026#39;; addpath(SPM_PATH) % Set root path. ROOT = \u0026#39;Work\u0026#39;; subs = dir(ROOT); subs = subs(3:end); for i = 1:numel(subs) % for single subject. disp(subs(i).name); sub_path = fullfile(ROOT, subs(i).name); t1_path = fullfile(sub_path, \u0026#39;t1.nii\u0026#39;); if ~exist(t1_path, \u0026#39;file\u0026#39;) % gunzip the .gz gunzip(fullfile(sub_path, \u0026#39;t1.nii.gz\u0026#39;)); end flair_path = fullfile(sub_path, \u0026#39;flair.nii\u0026#39;); if ~exist(flair_path, \u0026#39;file\u0026#39;) gunzip(fullfile(sub_path, \u0026#39;flair.nii.gz\u0026#39;)); end pause(10); disp(t1_path); disp(flair_path); spm_jobman(\u0026#39;initcfg\u0026#39;); %----------------------------------------------------------------------- % Job saved on 29-Sep-2020 18:30:58 by cfg_util (rev $Rev: 6942 $) % spm SPM - SPM12 (7219) % cfg_basicio BasicIO - Unknown %----------------------------------------------------------------------- matlabbatch{1}.spm.tools.LST.lga.data_T1 = {strcat(t1_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.LST.lga.data_F2 = {strcat(flair_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.LST.lga.opts_lga.initial = 0.3; matlabbatch{1}.spm.tools.LST.lga.opts_lga.mrf = 1; matlabbatch{1}.spm.tools.LST.lga.opts_lga.maxiter = 50; matlabbatch{1}.spm.tools.LST.lga.html_report = 1; spm(\u0026#39;defaults\u0026#39;,\u0026#39;pet\u0026#39;); spm_jobman(\u0026#39;run\u0026#39;, matlabbatch); clear matlabbatch; end BIANCA # BIANCA (https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/BIANCA) 是一种基于监督学习的WMH分割工具，是FSL的一个子模块。在使用它之前，需要先得到一部分被试的分割结果作为训练数据。可用其他的自动化分割方法的结果作为训练数据。\nBIANCA需要一个master文件用于指定训练数据的路径。生成master文件的代码如下：\nsrc = \u0026#39;Work-BIANAC\u0026#39; res = \u0026#39;\u0026#39; for i in os.listdir(src): sub_path = os.path.join(src, i) res += \u0026#39;{}\\t{}\\t{}\\t{}\\n\u0026#39;.format( os.path.join(sub_path, \u0026#39;t1_brain.nii.gz\u0026#39;), os.path.join(sub_path, \u0026#39;flair_to_t1.nii.gz\u0026#39;), os.path.join(sub_path, \u0026#39;t1_brain_to_mni.mat\u0026#39;), os.path.join(sub_path, \u0026#39;lesion_lpa.nii\u0026#39;) ) with open(\u0026#39;masterfile_lpa.txt\u0026#39;, \u0026#39;w\u0026#39;) as f: f.writelines(res) logging.info(\u0026#39;Finished.\u0026#39;) 另外，BIANCA需要标准空间下的脑组织图像（对T1图像进行bet和配准操作），代码如下：\nimport os import shutil from nipype.interfaces import fsl import logging src = \u0026#39;Work-BIANAC\u0026#39; for i in os.listdir(src): logging.info(f\u0026#39;{i}...\u0026#39;) sub_path = os.path.join(src, i) if not os.path.exists(os.path.join(sub_path, \u0026#39;lesion_lga.nii\u0026#39;)): shutil.copy(os.path.join(\u0026#39;Work-LST\u0026#39;, i, \u0026#39;ples_lga_0.3_rmflair.nii\u0026#39;), os.path.join(sub_path, \u0026#39;lesion_lga.nii\u0026#39;)) shutil.copy(os.path.join(\u0026#39;Work-LST\u0026#39;, i, \u0026#39;ples_lpa_mrflair.nii\u0026#39;), os.path.join(sub_path, \u0026#39;lesion_lpa.nii\u0026#39;)) # flair to t1 flt_flair_to_t1 = fsl.FLIRT(bins=256, cost_func=\u0026#39;corratio\u0026#39;) flt_flair_to_t1.inputs.in_file = os.path.join(sub_path, \u0026#39;flair.nii.gz\u0026#39;) flt_flair_to_t1.inputs.reference = os.path.join(sub_path, \u0026#39;t1.nii.gz\u0026#39;) flt_flair_to_t1.inputs.output_type = \u0026#39;NIFTI_GZ\u0026#39; flt_flair_to_t1.inputs.out_file = os.path.join(sub_path, \u0026#39;flair_to_t1.nii.gz\u0026#39;) flt_flair_to_t1.inputs.out_matrix_file = os.path.join(sub_path, \u0026#39;flair_to_t1.mat\u0026#39;) logging.info(flt_flair_to_t1.cmdline) res_flt_flair_to_t1 = flt_flair_to_t1.run() logging.info(\u0026#39;Finish...\u0026#39;) # betting t1 btr_t1 = fsl.BET() btr_t1.inputs.in_file = os.path.join(sub_path, \u0026#39;t1.nii.gz\u0026#39;) btr_t1.inputs.frac = 0.5 btr_t1.inputs.out_file = os.path.join(sub_path, \u0026#39;t1_brain.nii.gz\u0026#39;) btr_t1.inputs.output_type = \u0026#39;NIFTI_GZ\u0026#39; btr_t1.inputs.mask = True btr_t1.inputs.robust = True logging.info(btr_t1.cmdline) res_btr_t1 = btr_t1.run() logging.info(\u0026#39;Finish...\u0026#39;) # t1 to mni flt_t1_to_mni = fsl.FLIRT(bins=256, cost_func=\u0026#39;corratio\u0026#39;) flt_t1_to_mni.inputs.in_file = os.path.join(sub_path, \u0026#39;t1_brain.nii.gz\u0026#39;) flt_t1_to_mni.inputs.reference = \u0026#39;/usr/local/fsl/data/standard/MNI152_T1_2mm_brain.nii.gz\u0026#39; flt_t1_to_mni.inputs.output_type = \u0026#39;NIFTI_GZ\u0026#39; flt_t1_to_mni.inputs.out_file = os.path.join(sub_path, \u0026#39;t1_brain_to_mni.nii.gz\u0026#39;) flt_t1_to_mni.inputs.out_matrix_file = os.path.join(sub_path, \u0026#39;t1_brain_to_mni.mat\u0026#39;) logging.info(flt_t1_to_mni.cmdline) res_flt_t1_to_mni = flt_t1_to_mni.run() logging.info(\u0026#39;Finish...\u0026#39;) 运行BIANCA，代码如下：\nimport os import logging src = \u0026#39;Work-BIANCA\u0026#39; subs = os.listdir(src) for i in range(len(subs)): sub_path = os.path.join(src, subs[i]) cmdline = \u0026#39;bianca \u0026#39;\\ + \u0026#39;--singlefile=masterfile_lga.txt \u0026#39;\\ + \u0026#39;--labelfeaturenum=4 \u0026#39;\\ + \u0026#39;--brainmaskfeaturenum=1 \u0026#39;\\ + \u0026#39;--querysubjectnum=#1 \u0026#39;\\ + \u0026#39;--trainingnums=1,2,3,4,5,6,7,8,9,10 \u0026#39;\\ + \u0026#39;--featuresubset=1,2 \u0026#39;\\ + \u0026#39;--matfeaturenum=3 \u0026#39;\\ + \u0026#39;--trainingpts=2000 \u0026#39;\\ + \u0026#39;--nonlespts=10000 \u0026#39;\\ + \u0026#39;--selectpts=noborder \u0026#39;\\ + \u0026#39;-o #2 -v\u0026#39; cmdline = cmdline.replace(\u0026#39;#1\u0026#39;, str(i+1)) cmdline = cmdline.replace(\u0026#39;#2\u0026#39;, os.path.join(sub_path, \u0026#39;bianca_output_lga\u0026#39;)) logging.info(cmdline) os.system(cmdline) logging.info(\u0026#39;Finished lga.\u0026#39;) cmdline = \u0026#39;bianca \u0026#39;\\ + \u0026#39;--singlefile=masterfile_lpa.txt \u0026#39;\\ + \u0026#39;--labelfeaturenum=4 \u0026#39;\\ + \u0026#39;--brainmaskfeaturenum=1 \u0026#39;\\ + \u0026#39;--querysubjectnum=#1 \u0026#39;\\ + \u0026#39;--trainingnums=1,2,3,4,5,6,7,8,9,10 \u0026#39;\\ + \u0026#39;--featuresubset=1,2 \u0026#39;\\ + \u0026#39;--matfeaturenum=3 \u0026#39;\\ + \u0026#39;--trainingpts=2000 \u0026#39;\\ + \u0026#39;--nonlespts=10000 \u0026#39;\\ + \u0026#39;--selectpts=noborder \u0026#39;\\ + \u0026#39;-o #2 -v\u0026#39; cmdline = cmdline.replace(\u0026#39;#1\u0026#39;, str(i+1)) cmdline = cmdline.replace(\u0026#39;#2\u0026#39;, os.path.join(sub_path, \u0026#39;bianca_output_lpa\u0026#39;)) logging.info(cmdline) os.system(cmdline) logging.info(\u0026#39;Finished lga.\u0026#39;) SLS # SLS (http://atc.udg.edu/salem/slsToolbox/docs.html) 也是基于SPM的一种WMH分割工具包，需要将其安装文件夹放置于SPM的toolbox文件夹下。运行代码如下：\n% WMH segment by SLS. clear all; clc; close all; % Set SPM12 into Path. SPM_PATH = \u0026#39;~/Tools/spm8\u0026#39;; addpath(SPM_PATH); SLS_PATH = fullfile(SPM_PATH, \u0026#39;toolbox\u0026#39;, \u0026#39;SLSToolBox\u0026#39;); addpath(genpath(SLS_PATH)); % Set root path. ROOT = \u0026#39;Work-SLS\u0026#39;; subs = dir(ROOT); subs = subs(3:end); for i = 1:numel(subs) % for single subject. disp(subs(i).name); sub_path = fullfile(ROOT, subs(i).name); t1_path = fullfile(sub_path, \u0026#39;t1.nii\u0026#39;); flair_path = fullfile(sub_path, \u0026#39;flair.nii\u0026#39;); spm_jobman(\u0026#39;initcfg\u0026#39;); matlabbatch{1}.spm.tools.SLS.lesionSegment.data_T1 = {strcat(t1_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.SLS.lesionSegment.data_FLAIR = {strcat(flair_path, \u0026#39;,1\u0026#39;)}; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.stIter.alpha = 2.5; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.stIter.omegaT = 0.6; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.stIter.omegaN = 0.55; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.stIter.lesionSize = 30; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.ndIter.alpha2 = 2; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.ndIter.omegaT2 = 0.75; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.ndIter.omegaN2 = 0.7; matlabbatch{1}.spm.tools.SLS.lesionSegment.params.ndIter.lesionSize2 = 20; matlabbatch{1}.spm.tools.SLS.lesionSegment.exclusion.ventricles = 0; matlabbatch{1}.spm.tools.SLS.lesionSegment.outputs.lesionMaskst = 0; matlabbatch{1}.spm.tools.SLS.lesionSegment.outputs.lesionMasknd = 0; matlabbatch{1}.spm.tools.SLS.lesionSegment.outputs.thrst = 0; matlabbatch{1}.spm.tools.SLS.lesionSegment.outputs.thrnd = 0; matlabbatch{1}.spm.tools.SLS.lesionSegment.outputs.cleanup = 0; spm(\u0026#39;defaults\u0026#39;, \u0026#39;pet\u0026#39;); spm_jobman(\u0026#39;run\u0026#39;, matlabbatch); clear matlabbatch; end W2MHS # W2MHS (https://www.nitrc.org/projects/w2mhs/) 是基于MATLAB的一种WMH分割工具，运行前需要将安装文件夹添加进MATLAB的搜索路径中。其运行脚本如下：\n% WMH segment by W2MHS. clear all; clc; close all; output_path = {\u0026#39;Work-W2MHS/Output\u0026#39;}; output_name = {\u0026#39;W2MHS\u0026#39;}; output_ids = {\u0026#39;sub-1\u0026#39;, \u0026#39;sub-1\u0026#39;; \u0026#39;sub-2\u0026#39;, \u0026#39;sub-2\u0026#39;; \u0026#39;sub-3\u0026#39;, \u0026#39;sub-3\u0026#39;; \u0026#39;sub-4\u0026#39;, \u0026#39;sub-4\u0026#39;; \u0026#39;sub-5\u0026#39;, \u0026#39;sub-5\u0026#39;;... \u0026#39;sub-6\u0026#39;, \u0026#39;sub-6\u0026#39;; \u0026#39;sub-7\u0026#39;, \u0026#39;sub-7\u0026#39;; \u0026#39;sub-8\u0026#39;, \u0026#39;sub-8\u0026#39;; \u0026#39;sub-9\u0026#39;, \u0026#39;sub-9\u0026#39;; \u0026#39;sub-10\u0026#39;, \u0026#39;sub-10\u0026#39;}; input_images = {\u0026#39;Work-W2MHS/T1/sub-01_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-01_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-02_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-02_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-03_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-03_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-04_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-04_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-05_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-05_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-06_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-06_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-07_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-07_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-08_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-08_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-09_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-09_flair.nii\u0026#39;;... \u0026#39;Work-W2MHS/T1/sub-10_t1.nii\u0026#39;, \u0026#39;Work-W2MHS/FLAIR/sub-10_flair.nii\u0026#39;}; input_meth = {\u0026#39;rf_regress\u0026#39;}; w2mhstoolbox_path = \u0026#39;./Work-W2MHS/W2MHS\u0026#39;; spmtoolbox_path = \u0026#39;/home/babri3/Tools/spm12\u0026#39;; do_train = \u0026#39;no\u0026#39;; do_preproc = \u0026#39;no\u0026#39;; do_quantify = \u0026#39;yes\u0026#39;; param(.6, 2.5, \u0026#39;yes\u0026#39;); WhyD_setup(output_name, output_path, input_images, output_ids, w2mhstoolbox_path,... spmtoolbox_path, do_train, do_preproc, do_quantify); UBO # 另外，还有一种基于MATLAB和SPM的分割工具包UBO，它的使用手册：https://cheba.unsw.edu.au/sites/cheba2/files/_local_upload/pdf/groups/neuroimaging-group-pipeline-quick-start-manual.pdf.\n部分分割结果 # 相关链接 # LST: https://www.applied-statistics.de/lst.html\nBIANCA: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/BIANCA\nSLS: http://atc.udg.edu/salem/slsToolbox/docs.html\nW2MHS: https://www.nitrc.org/projects/w2mhs/\nUBO: https://cheba.unsw.edu.au/research-groups/neuroimaging/pipeline\n","date":"2021年11月07日","externalUrl":null,"permalink":"/posts/2021/2021-11-07-wmh/","section":"博客","summary":"介绍 # 白质高信号（white matter hyperintensity, WMH）是一种因脑白质病变导致的、在T2 Flari像上表现为高灰质值的现象。在相关研究中，确定白质高信号区域是一个基本的问题。一般认为，由专业的影像科医生或受过培训的人员手动分割的结果是金标准。然而，手动分割费时费力。因而，研究者提出了许多自动半自动的分割工具。本文将对几种常用的白质高信号自动分割工具的用法进行简单介绍。\n","title":"Toolbox for WMH","type":"posts"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/ubo/","section":"标签","summary":"","title":"UBO","type":"tags"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/w2mhs/","section":"标签","summary":"","title":"W2MHS","type":"tags"},{"content":"","date":"2021年11月07日","externalUrl":null,"permalink":"/tags/wmh/","section":"标签","summary":"","title":"WMH","type":"tags"},{"content":"","date":"2021年09月19日","externalUrl":null,"permalink":"/tags/charticulator/","section":"标签","summary":"","title":"Charticulator","type":"tags"},{"content":"","date":"2021年09月19日","externalUrl":null,"permalink":"/tags/%E5%92%8C%E5%BC%A6%E5%9B%BE/","section":"标签","summary":"","title":"和弦图","type":"tags"},{"content":"和弦图用于展示不同实体之间的关系，在脑网络研究中也经常使用。本文将介绍一个绘制和弦图的网站并演示其用法。\n网址：https://charticulator.com\n数据准备 # 首先准备两个表格，内容分为为和弦图中的节点信息和连边的信息，对应示例中的node.csv和link.csv。\nnode.csv中必须包含id列，用于唯一标识和弦图中的节点。示例中的节点为Schaefer等人在2018年发布的100个脑区的脑图谱。其他列为可选列，可以用来指定和弦图中节点的大小等。\nlink.csv中必须包含source_id和target_id列，其值为node.csv中id的值。link.csv中每一行表示和弦图中一条连边。同样，其他列为可选列，可以指定和弦图中连边的宽度等。\n步骤 # 加载数据 # 打开网站后，将node.csv和link.csv分别拖动到Node和Links，然后点击Done即可完成数据的加载。之后网页会跳转到绘图页面。\n添加节点 # 第一步，点击顶栏的矩形块，并在绘图区插入选中的矩形块，会自动添加与node.csv文件中指定的节点个数相等的矩形块。 第二步，将id拖动到矩形块的color属性上，用不同的颜色来区分节点。 第三步，将矩形块按照x轴堆叠的方式排列，并设置为极坐标显示。 第四步，调整矩形块的内外环半径。\n添加连边 # 第一步，点击顶栏的边按钮，添加连边。 第二步，将target_id的颜色设置为连边的颜色。 第三步，将连边权重值设置为边的宽度。\n添加文本 # 第一步，点击顶栏文本按钮。 第二步，将id拖动到添加的文本元素上。 第三步，调整文本的方向和大小。\n导出图片 # 点击保存按钮，并调整dpi后，得到最终的图片。\n参考文献 # 脑图谱文章：Schaefer, Alexander, Ru Kong, Evan M. Gordon, Timothy O. Laumann, Xi-Nian Zuo, Avram J. Holmes, Simon B. Eickhoff, and B. T. Thomas Yeo. 2018. “Local-Global Parcellation of the Human Cerebral Cortex from Intrinsic Functional Connectivity MRI.” Cerebral Cortex 28(9):3095–3114. doi: 10.1093/cercor/bhx179.\n","date":"2021年09月19日","externalUrl":null,"permalink":"/posts/2021/2021-09-19-deomcharticulator/","section":"博客","summary":"和弦图用于展示不同实体之间的关系，在脑网络研究中也经常使用。本文将介绍一个绘制和弦图的网站并演示其用法。\n","title":"数据可视化：和弦图","type":"posts"},{"content":"","date":"2021年09月12日","externalUrl":null,"permalink":"/tags/development/","section":"标签","summary":"","title":"Development","type":"tags"},{"content":"","date":"2021年09月12日","externalUrl":null,"permalink":"/tags/gam/","section":"标签","summary":"","title":"Gam","type":"tags"},{"content":"","date":"2021年09月12日","externalUrl":null,"permalink":"/tags/scn/","section":"标签","summary":"","title":"Scn","type":"tags"},{"content":"期刊：Scientific Reports, (2021)11:9415\n摘要 # 结构共变（SCN）是指在群体水平上不同大脑区域形态学指标之间的相关。它可以为发育期功能性网络模块的形成提供皮层结构的信息。本研究探究了从儿童期到青少年期大脑结构共变网络的变化模式，而这一时期会发生明显的大脑结构性的重组。本研究的被试在他们8.5岁到14.5岁之间进行了核磁扫描。研究者使用滑动时间窗方法选择一组被试作为“age-bin”，在每个“age-bin”上建模得到结构共变网络。之后，研究者使用广义加性模型（GAM）检查网络属性的随龄变化模式。结果显示了平均连接强度和网络密度的非线性变化轨迹。这表明在青少年早期阶段存在一段皮层结构属性趋同的时期，对应于前人研究中的脑区特异化现象。在儿童后期，感觉运动区域出现了一些“Hub”脑区。然而，到了青少年中期，联合皮层中的“Hub”节点范围和强度都出现了增加。此外，这些脑区水平的改变与发育期皮层变薄的速率相关。在对典型功能性网络连接的研究中发现，额顶、默认和注意网络均表现出了网络内部和网络之间共变性的随龄增加。本研究发现的脑区和脑网络层面上的发育模式，与青少年早期社会情绪和其他通过高级认知网络支持的复杂执行功能，在这一时期发生的一系列改变是一致的。\n背景 # 许多纵向研究验证了儿童期到青少年期大脑皮层变薄的发育模式，反映了突触修剪、髓鞘化或皮层形态发育特征。然而，这种发育模式在不同皮层区域不是同时发生的。重要的是，这种变异性表明结构皮层网络也可能在这一时期成熟。理解皮层区域之间不断变化的关系可能提供灰质发育单变量研究之外的独特信息，因为结构特性的协变性被认为是由经验依赖的可塑性和相互营养的过程产生的，例如，共同激发的区域连接在一起。特别是，儿童和青少年之间的过渡以及相关的青春期过程，带来了第二波结构“重组”，仅次于婴儿。然而，在这一时期缺乏对结构皮层网络发展的有针对性的研究。\n结构共变是一种多元分析技术，它概念化了不同大脑区域的形态特征在群体水平上如何相互关联。为此，对一组受试者的每个大脑区域测量皮质厚度等属性，并对整个组的每对区域计算这些区域估计值之间的相关性。虽然大多数研究都描述了某一个生命周期内结构共变的拓扑特性（如婴儿、儿童/青少年、老年），但一小部分研究表明，这些特性也会随着时间而变化。对儿童早期到青春期晚期的研究发现，网络的整合（即促进分布式大脑区域信息组合的能力）不断增加，分离（即促进区域组内专业化处理的能力）不断减少，然后是青春期的反向变化或达到平台期。一些关注青年期及青春期后期的研究表明，在14岁到20岁之间，大脑皮层整体相关性的强度在趋于稳定之前，存在降低的现象。这可能反映了不同大脑区域成熟时间的个体间差异。综上所述，这些研究提供了越来越多的证据，表明儿童和青少年之间的过渡可能以不断演变的结构网络特性为特征，并且这些整体变化在模式上可能是非线性的。 还有新出现的证据表明共变模式存在区域差异。例如，研究发现，从幼儿期到青年期，联系皮质的连接强度和效率持续增加，而边缘皮质和感觉运动皮质的连接强度和连接效率分别增加和减少。其他研究表明，神经认知系统（即功能团体内的区域）在青春期后期和青年期具有不同的发育模式，额叶顶网络的共变下降幅度最大。使用毕生发展方法的研究人员还发现，高阶认知系统表现出结构共变模式可以将年轻成年人与儿童/青少年和老年人区分开来。因此，以前的文献在使用广泛的年龄范围或寿命方法时确定了协方差模式的区域变异性。然而，将这些分析扩展到特别关注从儿童期到青春期的过渡期，可能会对神经发育的突出模型提供新的见解。\n青春期早期的生物学发育也具有显著的性别差异，这通常被认为是这一时期出现的精神病理学发病率显著性别差异的基础。虽然研究在很大程度上未能确定新生儿、青年和老年人在结构共变模式方面的差异，但针对儿童向青少年过渡的有针对性的研究可能为性别差异提供新的见解。由于支持身体成熟的青春期激素变化也作用于大脑的受体，同时女性青春期较早的成熟，因此一些人认为她们可能比男性经历更早的皮质和白质成熟。尽管许多研究未能确定皮层变薄的性别差异，但一些使用多变量方法的研究也支持了皮层变薄存在显著的性别差异。因此，对网络特性变化的研究可能为青春期早期男女大脑皮层成熟的潜在差异模式提供新的见解。\n目前的研究扩展了从儿童到青春期过渡期间大脑结构网络特性的相关研究。正如Váša和同事所强调的，以前的研究通常通过将参与者分为离散（和广泛）年龄组来提供结构网络发展的粗粒度解决方案。对年龄组的任意定义也可能导致文献中的不一致。因此，我们利用滑动窗口方法来精确描述该过渡期内结构共变网络的变化（即，区域结构属性之间的关系如何随时间变化）。我们的年龄定义结构共变网络基于较大参与者数量的滑动窗口和较窄的年龄范围从而提高了我们的相关性估计的稳健性。我们假设在从儿童晚期到青春期早期的过渡期间，整体连接密度增加，然后在青春期中期达到平稳或减少。我们还研究了共变网络拓扑特性的区域性变化，并在神经认知网络的背景下描述了这些变化。我们假设，在此期间，联合皮质，特别是额叶顶网络，可能表现出最大的共变模式变化。接下来，我们研究了皮质变薄和共变模式之间的关系，推测在青春期早期表现出最大变薄的区域也可能与大脑其他部分具有最大的共变性。最后，我们探讨了网络整体属性和神经认知网络中的性别差异。\n研究方法 # 参与者信息 # 参与者来自澳大利亚墨尔本的社区，并被纳入两个纵向项目之一：1）儿童注意力项目（NICAP）的神经成像，以及2）儿童到青少年过渡研究（iCATS）的大脑发育成像。NICAP参与者作为典型的发展对照被招募到一项以社区为基础的患有和不患有ADHD的儿童队列研究中。排除标准包括MRI禁忌症、发育障碍、神经或严重疾病史（如糖尿病、肾病）和精神药物。对于这两个队列，均从所有参与者的父母/监护人处获得书面知情同意。伦理批准由墨尔本皇家儿童医院人类研究伦理委员会批准。iCATS协议还被墨尔本大学胡德胡德研究所批准，NICAP协议得到迪肯大学人类研究伦理办公室的批准。\nNICAP样本在9.5至14.5岁之间进行了多达3次的重复评估，评估间隔约为18个月(M = 1.432, SD = 0.222, 1.021 - 2.330年)。iCATS样本在8.5至13.5岁之间进行了2次重复评估，评估间隔约为36个月(M = 2.763，SD = 0.243，2.158 - 3.344年)。这两个样本在性别、发育程度和智力均无显著差异。然而，在基线检查时，iCATS样本明显比NICAP样本年轻(平均值: iCATS = 9.556, NICAP = 10.425; t(157) = -14.928, p \u0026lt; 0.001)，具有较高的社会经济地位（基于澳大利亚人口普查数据的相对社会经济优势和劣势区域指数的社会经济指数；平均值: iCATS = 1056.175, NICAP = 1018.326; t(198) = 4.887, p \u0026lt; 0.001）。\n在质量控制期间的排除（详见下文）之后，最终样本包括192名年龄在8.5-14.5岁的参与者（96名女性，90名NICAP）的366次扫描，用于创建横断面窗口。具体而言，59名参与者（28名男性）进行了一次扫描，92名参与者（46名男性）进行了两次扫描，41名参与者（22名男性）进行了三次扫描。\nMRI采集和处理 # 这两个项目的神经成像数据都是在澳大利亚墨尔本默多克儿童研究所的3T西门子扫描仪（德国埃尔兰根西门子）上获得的。受试者在第1波实际扫描之前完成模拟扫描（如果受试者愿意或研究人员认为合适，则在随后的第1波中重复）。在参与之前，他们还获得了MRI信息（包括视频），以使他们熟悉手术过程并尽可能减少焦虑。在TIM Trio扫描仪上采集iCATS的第一批和NICAP第一和第二批次被试。NICAP的最后一批次参与者是在升级到MAGNETOM Prisma扫描仪后收集的，该扫描仪已在统计建模中进行了说明。\nT1加权图像通过FreeSurfer 6.0进行处理，FreeSurfer 6.0是一个免费提供的用于皮质重建和体积分割的图像分析套件。 具体而言，使用亚毫米级重建37和纵向流处理图像，该纵向流使用稳健的反向一致配准，从所有可用数据创建对象模板空间内的无偏。该模板被用作每个时间点初始化分割过程的估计值，提供有关解剖结构的公共信息，并被发现显著提高了可靠性和统计能力。对1) 原始图像和2)（纵向）皮质重建的质量进行目视检查，并对所有扫描进行评级。原始图像的“响铃”（1：无响铃；2：局限于小皮质区域的轻微响铃；3：更多响铃延伸至白质和/或覆盖更多大脑区域；4：广泛响铃）和“模糊”评分为4分（1：清晰清晰的图像；2：轻微模糊；3：或相当模糊；4：全程模糊）。排除任何一个等级的“3”和“4”评级。处理后的图像在白色和软膜表面的准确度上以3分制进行评级（1：近乎完美的重建；2：仅限于大脑小区域的轻微重建问题；3：重建不良，白质或脑脊液广泛区域被低估，包括灰质）。排除“3”评级。图像也通过MRIQC处理补充目视检查。这导致34名参与者总共排除了37次扫描（即3名参与者删除了2次扫描）。未对剩余（包括）数据进行手动编辑。从HCP处理流程的多模式分组图谱（HCP-MMP1）的360个区域提取平均皮质厚度估计值并用于后续分析。补充分析检查了Desikan Killianny Tourville（DKT）图谱的62个区域的平均皮质厚度。\n统计分析 # 结构共变网络（SCN）建模 # 滑动窗口方法涉及创建一系列重叠的参与者“箱子”，同时在该样本的年龄范围内逐步滑动。年龄“箱子”由1)窗口大小和2)步长定义。由于这种滑动窗口方法需要对样本和步长进行任意定义，我们对一系列参数进行了分析。研究了n=70、80和90的窗口大小，以及70%、75%和80%的样本重叠（即基于年龄的增量“步长”为20%、25%和30%）。对每一种窗口大小和步长组合都进行了分析，因此产生了9种配置。图1中给出了一个滑动窗口配置的数据的表示。\n对于这9个滑动窗口配置中的每一个，为每个年龄段创建结构共变网络，并将每个年龄段的中值年龄分配给相应的矩阵。每个参与者对每个年龄定义的网络进行一次扫描。如果参与者的多个扫描落入给定的年龄段，则选择最接近中位年龄的扫描。3个“箱子”大小和3个步长参数是根据“箱子”大小和每个“箱子”内每个参与者重复评估之间的权衡选择的。换句话说，尺寸越大，年龄范围越宽，因此参与者更有可能在每个“箱子”内被纳入超过一次。\n鉴于上述人口统计学和扫描仪协议的样本差异，在为每个“箱子”创建结构共变网络之前，我们进行了线性回归，将每个区域的皮质厚度建模为整个样本中性别、队列（iCAT、NICAP）和扫描仪（升级前、升级后）的函数。该模型的标准化残差使用R中的“rstandard”函数计算，并用于创建结构协方差网络。也就是说，对于每个“箱子”中参与者的子样本，我们将HCP-MMP1分区定义的360个区域的皮质厚度关联起来，并作为DKT分区定义的62个区域的补充分析。\n从小样本量估计结构共变网络时存在噪声问题，尽管关于样本量的知识仍然有限。先前的研究已经使用概率引导阈值程序来解决这个问题，其中连接是基于连接“可能性”的标准而不是连接权重或固定边缘密度来保留的。Bootstrap阈值方法识别网络中统计上最健壮的连接，这些连接最不可能表示误报。在每个年龄段内，对1000次参与者内的有放回抽样，以重新估计结构网络。我们保留了引导过程中始终为正的边缘（错误发现率[FDR]校正α=0.05），并将剩余边缘设置为零。在图分析之前，对阈值网络进行二值化。\n图论指标。 # 使用全局、节点和模块属性检查每个阈值化和二值化SCN的指标。我们将重点放在基本指标上，因为Bootstrap阈值产生每个网络的密度是不一样的，这会在比较高阶图指标时混淆网络之间的差异。因此，我们检查了全局密度（即总连接的百分比）和节点度（即每个区域的连接数）。核心节点“Hub”被定义为标准化度大于1的节点（即，大于给定SCN的平均值一个标准差）。SCN还使用Yeo 7划分模式分解为功能模块结构，HCP-MMP1图谱的每个皮质区域根据垂直的最大重叠分配给一个Yeo模块。对于这种结构，我们计算了1) 模块内密度，定义为每个模块内的连接密度（即模块内节点之间的连接数量，相对于所有可能的连接），以及2)模块间密度，定义为每对模块之间的连接密度（即，相对于所有可能的连接，每对模块中节点之间的连接数）。由于全局属性随时间窗口的变化，这些模块度量标准化（即除以）相应SCN的整体密度。\nSCN的发育轨迹 # 使用R中的“mgcv”软件包，使用广义加性模型（GAM）检查8至15岁之间SCN拓扑特性的变化。具体而言，每个“箱子”的给定属性被分配给“箱子”内参与者的年龄中位数。然后，我们检查了该房产相对于（中位）年龄的变化。在“平滑”模型中，密度由一个平滑的年龄项预测，该年龄项的基函数为3（即，平滑项所允许的最大可能自由度，密度s(年龄, k=3)）。将该模型与“线性”模型（密度age）和“零”模型（密度~1）进行比较。所有模型均采用最大似然（ML）估计进行检验，模型比较用于确定最适合的发育轨迹。模型比较基于AIC值，如果AIC至少比所有低阶模型低，则选择更复杂的模型（即，只有当AIC低于“线性”和“零”模型时，才选择“平滑”模型）。\n该模型拟合程序首先用于检验无阈值网络的平均相关性和阈值网络的全局密度的变化。其次，我们通过对核心节点（标准化）度的年龄相关变化建模，检验了“枢纽”连通性的变化。我们将这些分析限制在至少两个年龄段中被归类为核心节点的区域，以便将一个年龄段中被归类为中心的区域的潜在误差降至最低。第三，我们使用相同的模型拟合程序检查了功能网络（归一化）模块内和模块间连接密度的变化。在节点和模块分析中，我们检查了平滑年龄项的显著性，并使用Benjamini \u0026amp; Hochberg FDR校正对显著性进行校正。\nGAM模型针对9种“箱子”大小和步长组合进行了分析，仅给出了在这些滑动窗口配置中超过50%的发现。文章中报告的模型系数和发育模式是在窗口大小为80、25%步长的参数中得到的，因为它代表了所有分析的9种参数设置的中位数。\n与皮质变薄的关系 # 使用R中的“lmer”软件包，使用线性混合模型计算每个区域的变薄率。我们根据之前在该数据集中检查皮质发育的工作建立了线性轨迹模型：$ Y = 截距 + d_i + β_1(性别) + β_2(队列) + β_3(扫描仪) + β_4(年龄) + e_i \\(，其中随机截距（\\)d_i$）用于解释每个受试者的重复观察。$e_i$表示正态分布的剩余误差项。提取年龄的β系数作为区域变薄的效应大小。为了了解皮质变薄率是否与青春期中期的协方差特性相关，我们将β系数与年龄最大的组中标准化脑区的度进行相关分析。并在年龄最小的组中，验证发现的显著脑区是否仍是显著的，以确定潜在关联是否是青春期中期特有的（从而反映年龄变化）。\n探索性别差异。使用与上述相同的滑动窗口配置，在每个年龄窗口内为男性和女性重新创建SCN。为此，首先在每个性别中进行线性回归，以消除皮质厚度中非感兴趣变量（队列（iCATS，NICAP）和扫描仪（升级前，升级后））的影响。接下来，为每个年龄段的男性和女性创建SCN。对它们进行Bootstrap阈值化、二值化，并计算图形度量。广义加性模型检验了SCN的平均相关性和总体密度的年龄相关轨迹中的性别差异。最后，我们检查了不同性别的功能网络的（标准化）模内和模间密度的变化，检查了“零”模型、“线性”模型和“平滑”模型变化。\n结果 # 整体指标 # 非阈值SCN的GAM揭示了最小年龄和最大年龄窗口之间连接强度（即所有相关性的平均值）的非线性变化，其特征为11.5岁左右的“峰值”。这种平均相关性的非线性变化模式在9个滑动窗口配置中的8个配置中是一致的。当关注统计上最稳健的连接（即Bootstrap阈值化和二值化SCN）时，GAM显示了类似的非线性变化模式，在11.5岁时具有最大的全局边缘密度（图2A）。这种非线性变化模式在所有9种配置中都是一致的。与年龄最小和最大的窗口相比，阈值SCN在中年窗口（~11.5年）的程度（即，程度分布）也表现出增加的变异性（图2B）。\n节点指标 # 在区域层面，节点度的非线性变化模式相似（图2C）；在整个大脑皮层，各区域在最小年龄到年龄范围的中期（即大约9.5至11.5岁）之间的连接数量呈现出增加的模式，随后是最老年龄窗口（约13.5岁）的连接数量减少。核心“Hub”被定义为在至少两个年龄窗口内高度（\u0026gt;1 SD）的区域，主要位于感觉运动和关联皮层（图3）。虽然GAMs显示，这些枢纽中的许多枢纽在各年龄段的标准化程度上没有表现出变化，但在运动区发现了显著的下降，在多个额叶和顶叶区发现了显著的上升（模型比较和系数见补充表S2）。此外，在整个分区中进行的相关分析显示，皮质变薄率与最老年龄组的标准化程度相关，因此表现出更大变薄的区域具有更大的程度（左半球：r=-0.270，p=0.011，9/9窗口配置；右半球：r=-0.241，p=0.044，6/9配置）。然而，在最年轻年龄组中没有这种关联（左：r=-0.160，p=0.182，9/9配置；右：r=-0.185，p=0.171，9/9配置）。\n模块化指标 # 在功能社区的背景下，确定了所有模块的平均密度“峰值”，与全球密度模式一致。为了进一步了解社区层面的变化，我们研究了模块化密度的“标准化”指标，这些指标代表了全球密度。背侧注意网络和额顶叶网络的归一化模内密度（即网络内区域的连接）随年龄窗口呈现非线性增加（图4A，B），而视觉和躯体运动网络的归一化模内密度随年龄呈现线性减少。标准化连接密度（即网络之间区域的连接）在腹侧注意、背侧注意、额顶和默认模式网络之间表现出主要的线性增加（见图4A，C）。\n性别差异 # 探索性分析未能确定非阈值平均相关和阈值全局密度显著的性别差异。接下来，研究了不同性别的功能性模块之间连接密度的变化，并根据其各自的整体密度进行标准化。在女性中，模块内和模块间密度的增加仅限于背侧和腹侧注意网络，特别是与额顶和默认模式网络有关。相比之下，在视觉和躯体运动网络中发现了一些非线性减少（图5A，C）。在男性中，背侧注意网络和额顶网络的模块密度增加，而腹侧注意网络和边缘网络的模块内连接减少（图5B，D）。\n讨论 # 目前的调查揭示了结构共变网络在从儿童向青少年过渡期间的年龄相关变化。根据假设，根据受试者区域厚度的相关性，9.5至14.5岁之间的整体共变模式存在“峰值”。在这种整体模式之外，还存在区域变异性，联合皮质表现出更大的共变增加。相关地，与感觉运动网络相比，高阶神经认知系统内的区域在网络内和网络间随着年龄的变化表现出更大的共变。探索性分析还表明，与男性相比，女性的这些模式更为突出。最后，正如假设的那样，在此期间表现出最大变薄的区域与大脑其他部分的共变程度最大。\n研究结果表明，从儿童期到青春期的过渡的特点是结构共变的总体增加，然后是青春期中期的减少。该模式是针对非阈值连接的强度（即平均相关性）以及阈值连接的密度确定的。在此期间，前人研究已针对平均相关性和平均局部效率（节点间通信的度量）确定了类似的非线性轨迹。这些整体“峰值”可能反映了青春期早期大脑皮层解剖特性的短暂趋同，随后出现的差异反映了在第二个十年中区域成熟的速度或时间上更大的个体间差异。在某种程度上与这一推测一致，其他人研究已经表明，在参与者20岁趋于稳定之前，大脑整体共变在青春期后期持续下降，这与关联皮质的长期成熟相对应。未来的研究需要进一步了解这种差异是否与青少年时期社会情绪问题的发生有关。\n我们的分析还强调了青春期早期感觉运动和联想皮质共变特性的区域差异。对（标准化）程度的检查显示，在儿童晚期，感觉运动区域作为高度连接的“中枢”十分突出。视觉中枢的连通性在青春期早期保持一致，而运动中枢则随着年龄的增长而显著减少。虽然在儿童晚期，大脑皮质中存在一些中枢区域，但额叶和顶叶皮质内中枢的范围和强度随着年龄的增长而增加。这些结果与先前的文献一致，这些文献强调了青春期联合皮质内中枢的突出作用，尽管在一些研究中这仅限于顶叶区域。研究结果也得到了群体水平轨迹的区域变异性的支持，在青春期，额叶、顶叶和颞叶皮质的变化比枕叶和运动皮质的变化更大，在猕猴中表现出更晚的成熟。此外，增加的协方差主要局限于支持抽象的高阶认知技能的区域，这些技能在青春期继续成熟。有趣的是，其他研究表明，平均相关强度与青少年时期（群体水平）的工作记忆有关。然而，我们的研究结果表明，在青春期早期研究特定区域的协方差特性对认知成熟的贡献具有潜在价值。\n当考虑到整体密度的“峰值”时，额顶和腹侧注意网络中的节内（网络内）相关性也存在年龄相关的（线性）增加，这表明这些网络中的区域相对于皮层的平均连通性变得越来越相互连接。腹侧注意、背侧注意、额顶叶和默认模式网络之间的调制间（网络间）连接也存在与年龄相关的线性增加。相对而言，随着年龄的增长，与视觉和躯体运动网络的联系出现脱钩。综上所述，高阶认知网络似乎经历了协调的结构发展，在整个大脑皮层普遍分化的背景下，支持其在青春期的专业化和分离。这些发现与基于种子点的结构共变分析一致，这些分析发现初级感觉和运动网络在儿童早期发育良好，在青少年时期显著性和执行控制网络随后成熟。其他人发现，高阶网络持续成熟到年轻成人，额叶顶网络在青少年末期至20岁左右时表现出最大的共变程度降低，而默认模式和腹侧注意网络是最后达到成人成熟水平的网络。功能连通性也假设了类似的发展模式，视觉和感觉运动区域发展较早，其轨迹的可变性比其他网络小。研究结果也与青少年时期任务积极网络（额叶顶、注意力）和任务消极网络（默认模式）之间连接的持续成熟相一致。因此，节点和模块属性的发展模式与早期对基本感觉和运动技能的掌握是一致的，但情绪调节、社会认知和其他复杂执行功能的不断完善得到了额顶、默认模式和注意网络的支持。\n结构共变网络背后的确切机制仍然不确定，但通常认为它是由分布的大脑区域的协调功能产生的。在支持中，结构共变网络和大脑功能网络之间存在一些重叠。对新生儿的研究还发现，SCN比功能性网络发展得晚，这表明功能性网络的共同激活可能促进了SCN的发展。与结构连接网络也存在部分趋同，这表明由潜在轴突连接介导的相互营养效应的作用。其他人强调了与共变网络成熟（即纵向区域轨迹的相关性）的相似性，以及大脑发育过程中的协调基因表达。此外，距离较短的区域之间的较高共变性也可能与来自共同胚胎起源的共享基因表达有关。重要的是，这些机制并不相互排斥，因为营养、遗传和神经发育过程很可能对SCN产生相互关联的影响。\n对可能导致结构共变发展变化的机制知之甚少。然而，我们发现，在青春期中期，表现出更大皮质变薄的区域有更大的程度。由于皮质变薄率与儿童末期节点的度无关，研究结果表明，变薄特别有助于儿童末期和青春期中期之间共变网络的变化。在青春期后期，皮质变薄的程度越大，与节点度的降低程度越大有关。在这两个数据集中，联合皮质表现出最大的皮质变薄，因此，潜在的神经机制，如突触修剪和髓鞘形成，可能在青春期的延长期对这些区域的网络特性产生非线性影响。Váša及其同事还表明，皮质内髓鞘形成与共变区域变化的关联性比皮质变薄更强，这突出了多模态分析的必要性，以揭示发育过程中结构连通性和结构共变网络之间的演变关系。\n对性别的探索性研究未能确定与年龄相关的整体共变模式的变化（即平均相关和整体密度）的一致性差异，尽管在许多滑动窗口配置中与年龄相关的非线性差异表明女性在青春期早期可能有更陡峭的“峰”，并且整体连接密度高于男性。鉴于这些不一致性，因此需要在这一目标年龄范围内对每组进行更大样本量的持续研究，以进一步调查性别差异。我们发现女性的总体平均相关性更大，这也与之前的研究不一致，之前的研究发现男性的皮质下体积相关性更大，这表明在发育过程中，解剖网络中的性别差异可能因感兴趣的区域和/或形态特征而不同。当考虑到潜在的整体指标差异时，女性表现出（背侧和腹侧）注意网络彼此之间以及额顶和默认模式网络的共变增加的一般模式，而男性的这种增加较少，集中在背侧注意和额顶网络。此外，女性在初级感觉运动网络的共变方面表现出一些下降。先前基于种子点的分析表明，青春期睾酮水平和前额叶海马共变之间存在性别特异性关联。新生儿和后期青少年/年轻成人的结构共变缺乏性别差异，因此似乎共变的性别差异可能特异于激素水平快速变化的时期。我们的发现模式也可能暗示女性的更早的发育，因为她们在较晚发育的完成的高阶认知网络中存在更广泛的分离。然而，值得注意的是，模块密度的差异是定性的，需要结合激素和更长的青春期进行进一步的研究来检验我们的假设。\n局限性 # 我们的研究结果需要考虑到某些优势和局限性。目前对年龄相关变化的研究从群体层面的网络推断出发展过程。如上所述，横截面相关性的变化暗示了发展轨迹的个体差异，需要进行纵向研究以充分了解这些潜在的神经发育过程。我们的分析还取决于基于窗口和步长/重叠大小的年龄窗口配置。然而，我们对一系列窗口和步长进行了统计分析，以确定在大多数配置中一致的结果。与以前的文献相比，窗口还包括大量参与者和狭窄的年龄范围，但样本量的进一步增加将继续减少年龄定义的SCN内的噪音，并创建额外的年龄箱/估计值，以模拟年龄相关的变化。滑动窗口方法的另一个限制是，在GAM中建模的每个窗口的拓扑属性不是相互独立的。在其中一个队列中，MRI扫描仪在波与波之间也进行了升级，但我们在分析中将此升级作为协变量进行了额外建模。此外，在扫描仪升级前后对年龄匹配的受试者进行比较，未能发现显著差异。我们还注意到，为了将头部运动的影响降至最低，我们采取了严格的质量控制程序，但需要对T1加权图像的头部运动进行估计，以确认研究结果，同时对运动混淆进行统计控制。最后，考虑到区分男性和女性时样本量较小，我们认为性别差异是探索性的，尽管我们注意到文献中经常使用类似的样本量。然而，考虑到对小样本估计的可靠性的担忧，未来需要对这一年龄段的大样本进行研究，以证实我们的发现。青春期测量的结合也可能提供对生物过程的新见解，这些生物过程可能是这一时期结构共变网络变化的基础。\n结论 # 从儿童期到青春期的过渡以皮质厚度的整体共变具有“峰值”的非线性轨迹为特征。虽然在儿童晚期，枕部和运动区是高度连接的中枢，但额叶和顶叶区域作为中枢的突出程度随着年龄的增长而增加。除了整体共变模式，注意力、额顶和默认模式网络表现出越来越大的共变性，这表明在青春期早期支持高阶认知过程的区域更加专业化和分离。\n原文链接：https://www.nature.com/articles/s41598-021-88918-w\n","date":"2021年09月12日","externalUrl":null,"permalink":"/posts/2021/2021-09-12-papersummary/","section":"博客","summary":"期刊：Scientific Reports, (2021)11:9415\n摘要 # 结构共变（SCN）是指在群体水平上不同大脑区域形态学指标之间的相关。它可以为发育期功能性网络模块的形成提供皮层结构的信息。本研究探究了从儿童期到青少年期大脑结构共变网络的变化模式，而这一时期会发生明显的大脑结构性的重组。本研究的被试在他们8.5岁到14.5岁之间进行了核磁扫描。研究者使用滑动时间窗方法选择一组被试作为“age-bin”，在每个“age-bin”上建模得到结构共变网络。之后，研究者使用广义加性模型（GAM）检查网络属性的随龄变化模式。结果显示了平均连接强度和网络密度的非线性变化轨迹。这表明在青少年早期阶段存在一段皮层结构属性趋同的时期，对应于前人研究中的脑区特异化现象。在儿童后期，感觉运动区域出现了一些“Hub”脑区。然而，到了青少年中期，联合皮层中的“Hub”节点范围和强度都出现了增加。此外，这些脑区水平的改变与发育期皮层变薄的速率相关。在对典型功能性网络连接的研究中发现，额顶、默认和注意网络均表现出了网络内部和网络之间共变性的随龄增加。本研究发现的脑区和脑网络层面上的发育模式，与青少年早期社会情绪和其他通过高级认知网络支持的复杂执行功能，在这一时期发生的一系列改变是一致的。\n","title":"文献总结-从儿童期到青少年期结构共变网络的改变","type":"posts"},{"content":"","date":"2021年09月03日","externalUrl":null,"permalink":"/tags/annot/","section":"标签","summary":"","title":"Annot","type":"tags"},{"content":"","date":"2021年09月03日","externalUrl":null,"permalink":"/tags/parallel/","section":"标签","summary":"","title":"Parallel","type":"tags"},{"content":" Python并行处理 # Python 中的concurrent包提供了对于并行运行的接口，包括进程级并行和线程级并行。下面是一个例子。\nfrom concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor def func(a, b): return a*b if __name__ == \u0026#39;__main__\u0026#39;: n_core = 4 nums = 10000 b = 2 res = [0 for _ in range(nums)] with ProcessPoolExecutor(n_core) as pool: futures = {pool.submit(func, i, b): i for i in range(1, nums)} for f in futures: res[futures[f]] = f.result() res = [0 for _ in range(nums)] with ThreadPoolExecutor(n_core) as pool: futures = {pool.submit(func, i, b): i for i in range(1, nums)} for f in futures: res[futures[f]] = f.result() 在并行处理时，写明 if __name__ == '__main__' 以声明主进程。\n进程级并行时，各个并行进程之间独享计算资源（尤其是内存）。对于这个例子，就是会为每个进程拷贝一个 b 。这样的好处是进程之间基本不会相互影响，对于I/O型任务的效率提升较大；而缺点是会增加内存的消耗。\n对于线程级并行，并行线程之间可以共享变量，因此相比起进程级别的并行，消耗的内存会更少。\n上面的线程和进程相关的描述是笔者久远的记忆加上自己的理解，可能不准确，但代码可用。\nfutures[f] 会返回 {pool.submit(func, i, b): i for i in range(1, nums)} 里面的 i。\nR并行处理 # R 里面的 snowfall 包提供了并行的接口。\nlibrary(snowfall) parallel \u0026lt;- function(x, y) { sfCat(print(x)) return(x * y) } b \u0026lt;- 2 sfInit(parallel = TRUE, cpus = 4, slaveOutfile = \u0026#39;demo.log\u0026#39;) sfLibrary(snowfall) sfExport(\u0026#39;b\u0026#39;) res \u0026lt;- sfSapply(1:5, parallel, b) sfStop() sfInit 用于设置基础环境，其中 slaveOutfile 用来重定向并行中的输出信息，方便检测进度。\nsfLibrary 函数导入并行函数需要的包。\nsfExport 函数将外部变量和函数导入并行函数。\nsfSapply 类似 R 中其他的*apply函数族，返回值类似。\nsfCat 函数将并行过程中的信息输出。如果在 slaveOutfile 中设置了，输出信息将保存到相应的文件中。\nannot文件 # FreeSurfer 中的函数可以将 .annot 文件转换为 .gii 文件，命令如下。\nmris_convert --annot lh.aparc.annot lh.white lh.aparc.gii ggplot2中自定义字体 # library(showtext) font.add(\u0026#39;calibri\u0026#39;, \u0026#39;xxx.ttf\u0026#39;) showtext.auto() ggplot() ... showtext 包可以载入外部字体。利用 font.add 函数，载入字体文件。showtext.auto 函数可以在后面的绘图中自动使用载入的字体。\n","date":"2021年09月03日","externalUrl":null,"permalink":"/posts/2021/2021-09-03-weeklysummary/","section":"博客","summary":"Python并行处理 # Python 中的concurrent包提供了对于并行运行的接口，包括进程级并行和线程级并行。下面是一个例子。\n","title":"周总结-并行/annot文件/ggplot2字体","type":"posts"},{"content":"","date":"2021年08月30日","externalUrl":null,"permalink":"/tags/cat12/","section":"标签","summary":"","title":"CAT12","type":"tags"},{"content":"本文记录了上周笔者在使用GRETNA和CAT12中遇到的一些问题和想法。\nGRETNA # GRETNA是脑网络中进行图论分析的一款工具包。它也支持对于静息态功能磁共振成像(fMRI)数据的预处理。在fMRI数据的网络拓扑分析中，最常见的网络建模方式是功能连接网络。其中，网络的节点表示脑区，而网络连边表示不同脑区BOLD信号时间序列的相关值——相关值越高，表明两个脑区连接越紧密。\n网络中连边值的问题是重要的，因为在另外一些网络中，网络连边值越高表明两个节点之间的代价越高。例如在公路网络中，节点为不同的城市，连边表示不同城市之间的距离。\n在GRETNA计算网络的平均距离时，在得到距离矩阵后进行了取倒数的操作。这一步，对于相关系数网络，即连边值越到，节点连接越紧密的加权网络而言是合适的。因为距离矩阵中的值表示的含义是两个节点之间的最短路径的权重和。它的值越大，表明两个节点连接越紧密。为了与通常的距离越远，代价越高的认知相一致，取倒数后就保证了连接越紧密的节点，它们的“距离”也越短。\n但对于二值网络而言，两个节点的距离是其最短路径中边的条数，也就是距离矩阵中的值的含义。节点距离越近，它们的连边条数也越少，“距离”也越短。因此这里不应该在进行取倒数的操作。\nCAT12 # 使用CAT12中的Segment模块进行皮层构建时，默认会得到个体皮层厚度的文件。如果要进行SBM分析，还需要将个体皮层厚度文件转换到标准空间(fsaverage)中，这一步在CAT12中是包含在resample模块中的。\n另外，CAT12也提供了提取ROI上相关指标的功能。它在提取ROI指标时，也是将个体的指标文件转换到标准空间中，再计算图谱文件(annotation)定义的ROI的指标。这里个体指标转换到标准空间使用的也是resample模块，不过这里的平滑核是0. 这也是容易理解的，因为在计算ROI指标时，会平均整个ROI中所有的Vertex。这样由于个体指标再转换到标准空间中产生的误差就会被平均掉。而在进行SBM分析时，因为是逐Vertex进行的统计，上面的误差就会对统计产生影响，因此在SBM中，resample并且设置合适的平滑核大小是重要的。\n","date":"2021年08月30日","externalUrl":null,"permalink":"/posts/2021/2021-08-30-weeksummary/","section":"博客","summary":"本文记录了上周笔者在使用GRETNA和CAT12中遇到的一些问题和想法。\n","title":"周总结-GRETNA/CAT12","type":"posts"},{"content":"","date":"2021年08月22日","externalUrl":null,"permalink":"/tags/heatmap/","section":"标签","summary":"","title":"Heatmap","type":"tags"},{"content":"","date":"2021年08月22日","externalUrl":null,"permalink":"/tags/matplotlib/","section":"标签","summary":"","title":"Matplotlib","type":"tags"},{"content":"本文用于记录笔者在使用seaborn绘制heatmap中遇到的一些问题和解决方法。\n完整的代码如下所示：\nimport numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib.font_manager as fm import matplotlib.ticker as ticker sns.set_theme(style=\u0026#34;white\u0026#34;) mat = np.random.rand(68*68) mat = mat.reshape((68, 68)) labels = pd.DataFrame({\u0026#39;Name\u0026#39;: range(1, 69)}) cmap = sns.color_palette(\u0026#39;flare\u0026#39;, as_cmap=True) font = fm.FontProperties(fname=\u0026#39;Resource/font/calibri.ttf\u0026#39;) p = sns.heatmap( mat, mask=(mat==0), cmap=cmap, square=True, xticklabels=True, yticklabels=True, center=0.75, vmin=0.5) ax = p.figure.axes[0] ax.axvline(34, color=\u0026#39;k\u0026#39;, alpha=0.8, linestyle=\u0026#39;-\u0026#39;, linewidth=0.8) ax.axhline(34, color=\u0026#39;k\u0026#39;, alpha=0.8, linestyle=\u0026#39;-\u0026#39;, linewidth=0.8) ax.set_title(\u0026#39;Title of Heatmap\u0026#39;, fontproperties=font, fontsize=14) ax.set_xticklabels(labels[\u0026#39;Name\u0026#39;], fontproperties=font, fontsize=4) ax.set_yticklabels(labels[\u0026#39;Name\u0026#39;], fontproperties=font, fontsize=4) barax = p.figure.axes[1] barax.set_ylabel(\u0026#39;Mean Value\u0026#39;, fontproperties=font, fontsize=12) barticks = barax.get_yticks() tickformat = \u0026#39;{:.1f}\u0026#39; barax.yaxis.set_major_locator(ticker.FixedLocator(barticks)) barax.set_yticklabels([tickformat.format(x) for x in barticks], fontproperties=font, fontsize=10) barax.tick_params(direction=\u0026#39;in\u0026#39;, width=0) plt.savefig(\u0026#39;demo.png\u0026#39;, bbox_inches=\u0026#39;tight\u0026#39;, dpi=500) 图1. 示例结果 解释 # 导入相关包：\nimport numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib.font_manager as fm import matplotlib.ticker as ticker # 设置显示主题 sns.set_theme(style=\u0026#34;white\u0026#34;) 数据准备：\n# 生成68x68的随机数矩阵 mat = np.random.rand(68*68) mat = mat.reshape((68, 68)) # 热图标签 labels = pd.DataFrame({\u0026#39;Name\u0026#39;: range(1, 69)}) 颜色映射：\ncmap = sns.color_palette(\u0026#39;flare\u0026#39;, as_cmap=True) 选择matplotlib中的flare配色。如图2所示。\n图2. flare配色 字体设置：\nfont = fm.FontProperties(fname=\u0026#39;Resource/font/calibri.ttf\u0026#39;) fname为自定义字体存放位置。\n绘图：\np = sns.heatmap( mat, mask=(mat==0), cmap=cmap, square=True, xticklabels=True, yticklabels=True, center=0.75, vmin=0.5) mat为显示的矩阵；mask是和mat相同大小的0/1矩阵，其中1表示相应位置不在热图中显示；cmap为颜色映射；square为True表示设置热图中每个小格子为正方形；xticklabels和yticklabels为True表示显示热图横纵坐标轴标尺标签；center表示Colorbar中心处颜色对应的数值；vmin为Colorbar中最低颜色对应的数值。\n热图区域设置：\n# 获取矩形图对象 ax = p.figure.axes[0] # 添加竖直线x=34 ax.axvline(34, color=\u0026#39;k\u0026#39;, alpha=0.8, linestyle=\u0026#39;-\u0026#39;, linewidth=0.8) # 添加水平线y=34 ax.axhline(34, color=\u0026#39;k\u0026#39;, alpha=0.8, linestyle=\u0026#39;-\u0026#39;, linewidth=0.8) # 设置标题，并应用自定义字体 ax.set_title(\u0026#39;Title of Heatmap\u0026#39;, fontproperties=font, fontsize=14) # 设置横纵坐标轴标尺标签，并应用自定义字体 ax.set_xticklabels(labels[\u0026#39;Name\u0026#39;], fontproperties=font, fontsize=4) ax.set_yticklabels(labels[\u0026#39;Name\u0026#39;], fontproperties=font, fontsize=4) 该figure中包含两个axes，第一个是矩形图本身，第二个axes是Colorbar的区域。\nColorbar设置：\n# 获取Colorbar对象 barax = p.figure.axes[1] # 设置Colorbar标题 barax.set_ylabel(\u0026#39;Mean Value\u0026#39;, fontproperties=font, fontsize=12) # 获取Colorbar中y轴标尺 barticks = barax.get_yticks() # 标尺显示数字格式为保留1位小数位的浮点数 tickformat = \u0026#39;{:.1f}\u0026#39; # 设置y轴标尺，并设置其标签，字体自定义 barax.yaxis.set_major_locator(ticker.FixedLocator(barticks)) barax.set_yticklabels([tickformat.format(x) for x in barticks], fontproperties=font, fontsize=10) # 设置标尺形状，即坐标轴数字对应的短线。这里为了美观，不显示标尺短线。 barax.tick_params(direction=\u0026#39;in\u0026#39;, width=0) 保存图片：\n# 保存图片，并设为dpi为500 plt.savefig(\u0026#39;demo.png\u0026#39;, bbox_inches=\u0026#39;tight\u0026#39;, dpi=500) ","date":"2021年08月22日","externalUrl":null,"permalink":"/posts/2021/2021-08-22-heatmap/","section":"博客","summary":"本文用于记录笔者在使用seaborn绘制heatmap中遇到的一些问题和解决方法。\n","title":"Python作图-Heatmap","type":"posts"},{"content":"","date":"2021年08月22日","externalUrl":null,"permalink":"/tags/seaborn/","section":"标签","summary":"","title":"Seaborn","type":"tags"},{"content":"","date":"2021年06月24日","externalUrl":null,"permalink":"/tags/jupyter-notebook/","section":"标签","summary":"","title":"Jupyter Notebook","type":"tags"},{"content":"","date":"2021年06月24日","externalUrl":null,"permalink":"/tags/remote-server/","section":"标签","summary":"","title":"Remote Server","type":"tags"},{"content":"通过Jupyter可以使用远端服务器的计算资源，以下是设置步骤。\n安装Jupyter # ## pip 安装 pip install notebook ## conda安装 conda install -c conda-forge notebook 服务器端设置 # 生成密码密文： # jupyter notebook password Enter password: Verify password: \u0026gt; [NotebookPasswordApp] Wrote hashed password to /home/you/.jupyter/jupyter_notebook_config.json 密文保存在/home/you/.jupyter/jupyter_notebook_config.json文件中。\n修改配置文件 # ## 打开前面生成的配置文件 vim ~/.jupyter/jupyter_notebook_config.py ## 修改配置内容 c.NotebookApp.ip=\u0026#39;*\u0026#39; ## 修改成将之前生成的密文 c.NotebookApp.password = u\u0026#39;xxx\u0026#39; 启动Jupyter # jupyter notebook --no-browser --port=8889 本地设置 # 打开本地终端，输入以下命令：\nssh -N -f -L localhost:8836:localhost:8889 xxx@ip 之后打开浏览器，在地址栏中输入http://localhost:8836即可。\n参考 # [1] https://blog.csdn.net/weixin_40641725/article/details/114636779\n[2] https://zhuanlan.zhihu.com/p/166425946\n","date":"2021年06月24日","externalUrl":null,"permalink":"/posts/2021/2021-06-24-remotejupyter/","section":"博客","summary":"通过Jupyter可以使用远端服务器的计算资源，以下是设置步骤。\n","title":"远程Jupyter Notebook设置","type":"posts"},{"content":"Python中，*除了可用于乘法和乘方运算外，还可以把它放在函数形式参数的前面，用来传递多个参数或进行参数的拆解。下面简单介绍后者的用法。\n传递多参数 # 示例1 # def f(*x): print(x) f(1, 2, 3, 4) 输出：(1, 2, 3, 4)\n可见，虽然在定义函数f()时，只用了一个形式参数x，但是由于*的存在，再调用该函数时，即便是传递多个参数，也会把多个参数当成一个变量x（这里当作元组处理）来处理。\n示例2 # def f(**x): print(x) f(a=1, b=2, c=3, d=4) 输出：{\u0026lsquo;a\u0026rsquo;: 1, \u0026lsquo;b\u0026rsquo;: 2, \u0026lsquo;c\u0026rsquo;: 3, \u0026rsquo;d\u0026rsquo;: 4}\n**也可以接收多个参数，但是跟*不同的是，**接收带有key的参数，并且将多个key-value形式的参数转换成为一个字典。\n拆分参数 # def f(*x): print(x) # Test 1 f(1, 2) # Test 2 f((1, 2)) # Test 3 f(*(1, 2)) 三次调用的输出分别为：\nTest 1: (1, 2) Test 2: ((1, 2),) Test 3: (1, 2)\nTest 1的结果跟示例1一样，此时的x为两个参数构成的元组。Test 2输入参数变成了一个由两个元素构成的元组，此时的x把这个元组当成一个整体作为它的第一个元素，形成了一个新的元组。Test 3在传递参数时，前面添加了*，此时函数f中的x为输入的元组本身，效果与Test 1相同。\n参考 # [1] https://zhuanlan.zhihu.com/p/93656773\n","date":"2021年06月17日","externalUrl":null,"permalink":"/posts/2021/2021-06-17-python/","section":"博客","summary":"Python中，*除了可用于乘法和乘方运算外，还可以把它放在函数形式参数的前面，用来传递多个参数或进行参数的拆解。下面简单介绍后者的用法。\n","title":"Python函数参数中的“*”","type":"posts"},{"content":"","date":"2021年06月02日","externalUrl":null,"permalink":"/tags/dicom/","section":"标签","summary":"","title":"Dicom","type":"tags"},{"content":" 本文为B站up主@智能医学成像-贾广相关视频的笔记。\nDICOM (Digital Imaging and Communications in Medicine) 是医学成像领域通用的数据格式，被广泛应用于各种医学成像设备当中，包括但不限于CT、超声、核磁共振等设备。\nDICOM文件方向 # DICOM文件以病人为中心，它的指向或朝向（orientation）通过头文件中的一些字段标识。这些字段包括：\n(0x0008, 0x5100), Patient Position\n(0x0020, 0x0032), Image Position\n(0x0020, 0x0037), Image Orientation\n(0x0028, 0x0030), Pixel Spacing\n(0x0018, 0x0050), Slice Thickness\nTag: (0x0008, 0x5100) # 用来记录病人进入扫描仪中的朝向或姿势。它的值为[H | F] F { [P | S] | D[R | L] }。[ ]或{ }限定取值范围，｜表示在[ ]限定的范围内二者取其一。[H | F]F表示头或脚先进入扫描仪，[P | S]表示面朝上或下，D[R | L]表示侧卧面朝右或左。例如，HFP表示病人头部先进入扫描仪，并且面朝上。\nTag: (0x0020, 0x0032) # 描述图像第一个像素（左上角）的坐标(x, y, z)。这里以病人为中心，x的正方向表示病人的左边，y的正方向表示病人的后边，z的正方向表示病人的上面。\nTag: (0x0020, 0x0037) # 该字段包含6个不超过16字节的数字，前三个表示图像矩阵从左往右的方向与图像坐标轴x、y和z的余弦值，后三个表示图像矩阵从上往下的方向与坐标轴x、y和z的余弦值。\n例如图1，该文件在(0x0020, 0x0037)处的值为0020,0037,Image Orientation (Patient)=1e-016\\1\\0\\0.00523601152635\\-1e-016\\-0.9999862919977，近似为(0, 1, 0, 0, 0, -1)表示图像从左往右的方向为病人从前往后的方向，即图像的右侧为病人的后侧（第二位为+1）；图像从上往下的方向为病人从上往下的方向，及图像的下面，就是病人的下面（第六位为-1）。当然，这里的示例数据是矢状位扫描的，图像的朝向和病人位置的关系比较明显，但对于冠状位采集的影像，通过该字段可以确认影像左右与病人左右的对应关系。\n图1. DICOM图像实例 参考 # [1] https://space.bilibili.com/475985153?spm_id_from=333.788.b_765f7570696e666f.1\n","date":"2021年06月02日","externalUrl":null,"permalink":"/posts/2021/2021-06-02-mi-01/","section":"博客","summary":"本文为B站up主@智能医学成像-贾广相关视频的笔记。\nDICOM (Digital Imaging and Communications in Medicine) 是医学成像领域通用的数据格式，被广泛应用于各种医学成像设备当中，包括但不限于CT、超声、核磁共振等设备。\n","title":"医学影像技术笔记-01-DICOM文件方向","type":"posts"},{"content":"在Windows 10的Linux子系统（WLS）中安装singularity(version=2.6.0)，并创建镜像。\n在之前多次尝试中发现，在直接创建.simg镜像时会报告错误（Error: no more available loop devices.），导致创建失败。尝试发现可以通过添加\u0026ndash;sandbox参数解决。完整命令如下：\nsudo singularity build --sandbox image_name library/recipes 其中，image_name为镜像的名称，library/recipes可以为shub，docker链接或符合singularity语法的配置文件（config.def）。如果在wsl中，输入上述命令后，提示无法找到此命令，而直接输入singularity可以正常显示相关信息。那么可以为singularity创建链接文件解决。\nsudo ln -s /usr/local/singularity/bin/singularity /usr/bin/singularit 配置文件实例：\nBootstrap: yum OSVersion: 7 MirrorURL: http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/ Include: yum %labels Python version: 3.9.5 R version: 4.1.0 %post yum -y update yum -y groupinstall \u0026#34;Development Tools\u0026#34; yum install -y gcc gcc-c++ gcc-gfortran java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 yum install -y readline-devel bzip2-devel libXt-devel fonts-chinese tcl tcl-devel tclx tk tk-devel mesa-libGLU mesa-libGLU-devel libcurl libcurl-devel xz-devel.x86_64 libjpeg-devel pcre2-devel libtiff-devel libicu-devel which vim %environment export LC_ALL=C 奇怪的是，如果把配置文件的名称改为demo.def或test.def，则无法创建镜像。\n等创建完成，可以在运行命令中添加\u0026ndash;writable参数运行镜像，并在镜像中安装相关的软件。\nsingularity shell --writable image_name 软件安装完成后，可以通过如下命令将镜像重新打包为.simg文件。\nsingularity build image_name.simg image_name/ 参考 # [1] https://sylabs.io/guides/2.5/admin-guide/\n[2] https://sylabs.io/guides/2.6/user-guide/\n","date":"2021年06月01日","externalUrl":null,"permalink":"/posts/2021/2021-06-01-singularity3/","section":"博客","summary":"在Windows 10的Linux子系统（WLS）中安装singularity(version=2.6.0)，并创建镜像。\n","title":"Singularity-03-创建镜像","type":"posts"},{"content":"","date":"2021年06月01日","externalUrl":null,"permalink":"/tags/wsl/","section":"标签","summary":"","title":"Wsl","type":"tags"},{"content":" 问题描述 # 安装singularity后，将其安装路径通过.bashrc文件添加进PATH，并重新载入.bashrc. 尝试运行singularity，正常可用。但运行sudo singularity时，提示无法找到此命令。\nsingularity version: 2.6.0-dist\ninstall path: /usr/local/singularity\nOS version: CentOS 7\n解决方法 # 在/usr/bin中创建singularity的连接文件即可。\nsudo ln -s /usr/local/singularity/bin/singularity /usr/bin/singularity 参考 # [1] https://blog.csdn.net/tanmx219/article/details/86750322\n","date":"2021年05月31日","externalUrl":null,"permalink":"/posts/2021/2021-05-31-linuxbugs/","section":"博客","summary":"问题描述 # 安装singularity后，将其安装路径通过.bashrc文件添加进PATH，并重新载入.bashrc. 尝试运行singularity，正常可用。但运行sudo singularity时，提示无法找到此命令。\n","title":"Linux-sudo xxx 无法找到命令","type":"posts"},{"content":"","date":"2021年05月31日","externalUrl":null,"permalink":"/tags/sudo/","section":"标签","summary":"","title":"Sudo","type":"tags"},{"content":"","date":"2021年05月27日","externalUrl":null,"permalink":"/tags/thickness/","section":"标签","summary":"","title":"Thickness","type":"tags"},{"content":"CAT12作为一种常用的神经影像数据处理和分析工具包，它提供了很多实用的功能，包括但不限于完整的VBM和SBM分析模块以及相关的统计模块。这里简单记录一下笔者使用CAT12在显示皮层厚度时遇到的问题和相应的解决方法。\n问题描述 # CAT12的GUI窗口中有个Display Surface的按钮（图1），可以在窗口中通过选择并显示相应的.gii文件（可以显示的文件有surf/[r|l]h.[sphere|central].name.gii）。但是对于重采样后的皮层指标，例如皮层厚度thickness (文件名为surf/s[fwhm].mesh.thickness.resampled.name.gii)，却不能通过相同的方式去显示。\n图1. CAT12图形化界面 解决方法 # 首先查询CAT12手册，但是手册中并没有相关的描述。进而在CAT12帮助界面中查找。发现在Surface tools中有关于可视化皮层数据的相关函数的介绍和演示（图2）。\n图2. CAT12帮助界面 随后确定cat_surf_display函数可以进行皮层指标的可视化，同时GUI中的Display Surface按钮调用的也是这个函数。通过help cat_surf_display查看该函数的说明，确定函数的输入参数以及参数的格式。最终，用于可视化皮层厚度的代码如下：\n皮层厚度文件为surf/s15.mesh.thickness.resampled.anat.gii，显示效果如图3。\ncat_surf_display(struct(\u0026#39;data\u0026#39;, \u0026#39;surf/s15.mesh.thickness.resampled.anat.gii\u0026#39;, \u0026#39;usefsaverage\u0026#39;, 1, \u0026#39;multisurf\u0026#39;, 1, \u0026#39;dpi\u0026#39;, 1500, \u0026#39;caxis\u0026#39;, [0, 3], \u0026#39;colormap\u0026#39;, \u0026#39;autumn\u0026#39;)) 图3. 皮层厚度显示效果 另外，可以在弹出的绘图窗口上，右键单击来调整显示的参数和保存图片（图4）。\n图4. 显示参数调节 相关连接 # [1] http://141.35.69.218/cat/index.html\n","date":"2021年05月27日","externalUrl":null,"permalink":"/posts/2021/2021-05-27-visualizationsurferbycat/","section":"博客","summary":"CAT12作为一种常用的神经影像数据处理和分析工具包，它提供了很多实用的功能，包括但不限于完整的VBM和SBM分析模块以及相关的统计模块。这里简单记录一下笔者使用CAT12在显示皮层厚度时遇到的问题和相应的解决方法。\n问题描述 # CAT12的GUI窗口中有个Display Surface的按钮（图1），可以在窗口中通过选择并显示相应的.gii文件（可以显示的文件有surf/[r|l]h.[sphere|central].name.gii）。但是对于重采样后的皮层指标，例如皮层厚度thickness (文件名为surf/s[fwhm].mesh.thickness.resampled.name.gii)，却不能通过相同的方式去显示。\n","title":"使用CAT12可视化皮层Surface指标","type":"posts"},{"content":"","date":"2021年05月26日","externalUrl":null,"permalink":"/tags/bug/","section":"标签","summary":"","title":"Bug","type":"tags"},{"content":"","date":"2021年05月26日","externalUrl":null,"permalink":"/tags/catalina/","section":"标签","summary":"","title":"Catalina","type":"tags"},{"content":"","date":"2021年05月26日","externalUrl":null,"permalink":"/tags/dock/","section":"标签","summary":"","title":"Dock","type":"tags"},{"content":" 环境 # OS: MacOS Catalina (10.15.7)\n正常情况是无论Dock是否设置自动隐藏，在全屏模式下，它都会自动隐藏。这里采取的解决方法是重置Dock的默认设置，并重启Dock栏。\n操作 # defaults write com.apple.dock autohide-delay -int 0 defaults write com.apple.dock autohide-time-modifier -float 1.0 killall Dock 参考 # [1] https://blog.csdn.net/santa12138/article/details/111293518\n","date":"2021年05月26日","externalUrl":null,"permalink":"/posts/2021/2021-05-26-dock/","section":"博客","summary":"环境 # OS: MacOS Catalina (10.15.7)\n","title":"全屏模式Dock栏不消失","type":"posts"},{"content":"","date":"2021年05月20日","externalUrl":null,"permalink":"/tags/install/","section":"标签","summary":"","title":"Install","type":"tags"},{"content":" ERROR : Base home directory does not exist within the container: /brain # 用沙盒模式创建镜像，然后以交互方式进入镜像后创建/brain目录。之后将沙盒格式的镜像打包为.img文件即可。\n# 创建沙盒镜像 singularity build --sandbox centos7 docker://centos:7 # 以交互方式打开镜像 singularity shell --writable centos7/ Singularity: Invoking an interactive shell within container... # 镜像内创建缺失目录 Singularity centos7:~/envs\u0026gt; mkdir /brain Singularity centos7:~/envs\u0026gt; exit # 重新打包镜像 singularity build centos7.img centos7/ ERROR : Home directory is not owned by calling user: /usr/local/singularity-2.5.2 # 报错命令：singularity shell smriprep.simg\n解决方法：添加\u0026ndash;home xxx参数，这里必须是绝对路径。例如：singularity shell \u0026ndash;home /babri/sangf/Desktop/test/ smriprep.simg\n","date":"2021年05月20日","externalUrl":null,"permalink":"/posts/2021/2021-05-20-singularity2/","section":"博客","summary":"ERROR : Base home directory does not exist within the container: /brain # 用沙盒模式创建镜像，然后以交互方式进入镜像后创建/brain目录。之后将沙盒格式的镜像打包为.img文件即可。\n","title":"Singularity-02-常见问题汇总","type":"posts"},{"content":"简单来讲，Singularity是一种可以跨平台执行的小型虚拟机。在数据分析时，首先往往要搭建运行环境，比如R，python等。为了保证结果的可靠性，通常要保证跨设备环境的一致性。但是在跨运算设备之间搭建相同的环境是一项比较麻烦的事情。因此，如果只搭建一次环境，就可以在各个设备上使用，就比较轻松了。Singularity和Docker就提供了这样的功能。笔者在这里使用Singularity1，版本为2.4.6。\n安装依赖库 # Ubuntu # sudo apt-get update sudo apt-get install python dh-autoreconf build-essential libarchive-dev CentOS # sudo yum update sudo yum groupinstall \u0026#39;Development Tools\u0026#39; sudo yum install libarchive-devel 编译安装 # VER=2.4.6 wget https://github.com/singularityware/singularity/releases/download/$VER/singularity-$VER.tar.gz tar xvf singularity-$VER.tar.gz cd singularity-$VER ./autogen.sh ./configure --prefix=\u0026#34;/usr/local/singularity-${VER}\u0026#34; make sudo make install 将**/usr/local/singularity-2.4.6/bin添加进$PATH**并重新加载配置文件。\necho \u0026#34;export $PATH=/usr/local/singularity-2.4.6/bin:$PATH\u0026#34; \u0026gt; ~/.bashrc source ~/.bashrc 图1. 显示singularity版本 参考 # ","date":"2021年05月19日","externalUrl":null,"permalink":"/posts/2021/2021-05-19-singularity/","section":"博客","summary":"简单来讲，Singularity是一种可以跨平台执行的小型虚拟机。在数据分析时，首先往往要搭建运行环境，比如R，python等。为了保证结果的可靠性，通常要保证跨设备环境的一致性。但是在跨运算设备之间搭建相同的环境是一项比较麻烦的事情。因此，如果只搭建一次环境，就可以在各个设备上使用，就比较轻松了。Singularity和Docker就提供了这样的功能。笔者在这里使用Singularity1，版本为2.4.6。\n","title":"Singularity-01-安装","type":"posts"},{"content":"","date":"2021年05月08日","externalUrl":null,"permalink":"/tags/alluvial/","section":"标签","summary":"","title":"Alluvial","type":"tags"},{"content":"","date":"2021年05月08日","externalUrl":null,"permalink":"/tags/%E5%86%B2%E5%87%BB%E5%9B%BE/","section":"标签","summary":"","title":"冲击图","type":"tags"},{"content":"冲击图可以非常直观地描述一组观测值的多个离散变量的情况。\nR语言中生成冲击图需要依赖包ggalluvial. 使用以下代码安装依赖包。\ninstall.packages(\u0026#34;ggalluvial\u0026#34;) 示例数据 # 这里用随机生成的虚拟数据作为示例数据data。data中每一行表示一个观测值。其中，每个观测值有三个维度的属性，分别是A，B和C。对于A属性，有3个水平，分别是a1，a2和a3。B属性有2个水平，C属性有4个水平。总共包含3000个观测值。因此，data的大小为3000*3.\ndata \u0026lt;- data.frame( id = seq(1:3000), A = rep(c(\u0026#39;a1\u0026#39;, \u0026#39;a2\u0026#39;, \u0026#39;a3\u0026#39;), 1000), B = rep(c(\u0026#39;b1\u0026#39;, \u0026#39;b2\u0026#39;), 1500), C = rep(c(\u0026#39;c1\u0026#39;, \u0026#39;c2\u0026#39;, \u0026#39;c3\u0026#39;, \u0026#39;c4\u0026#39;), 750) ) knitr::kable(head(data)) id A B C 1 a1 b1 c1 2 a2 b2 c2 3 a3 b1 c3 4 a1 b2 c4 5 a2 b1 c1 6 a3 b2 c2 将数据转换为长格式数据data_long。\nlibrary(tidyverse) data_long \u0026lt;- data %\u0026gt;% as_tibble() %\u0026gt;% pivot_longer(cols=c(A, B, C), names_to = \u0026#39;X\u0026#39;, values_to = \u0026#39;Response\u0026#39;) %\u0026gt;% group_by(X, Response) data_long %\u0026gt;% head() %\u0026gt;% knitr::kable() id X Response 1 A a1 1 B b1 1 C c1 2 A a2 2 B b2 2 C c2 这里转换为长格式数据的目的在于将A，B和C三个属性和它们的不同水平相互组合。其中X表示不同的属性，将来在冲击图中作为x轴。Response为各属性的不同取值，在图中表示为每个柱子划分的段。原始数据中的1行在长格式数据中被拆分成了3行。\n绘图代码 # library(ggalluvial) ggplot(data_long, aes(x = X, stratum = Response, alluvium = id, fill = Response, label = Response)) + scale_x_discrete(expand = c(.1, .1)) + geom_flow() + geom_stratum(alpha = .5) + geom_text(stat = \u0026#34;stratum\u0026#34;, size = 4) + ylab(\u0026#39;Number of subjects\u0026#39;) + xlab(\u0026#39;\u0026#39;) + theme_classic() 参考 # https://blog.csdn.net/qq_42458954/article/details/109106860 ","date":"2021年05月08日","externalUrl":null,"permalink":"/posts/2021/2021-05-08-alluvialdiagram/","section":"博客","summary":"冲击图可以非常直观地描述一组观测值的多个离散变量的情况。\nR语言中生成冲击图需要依赖包ggalluvial. 使用以下代码安装依赖包。\n","title":"作图-R语言中的冲击图(Alluvial)","type":"posts"},{"content":"","date":"2021年05月05日","externalUrl":null,"permalink":"/tags/fmri/","section":"标签","summary":"","title":"Fmri","type":"tags"},{"content":"","date":"2021年05月05日","externalUrl":null,"permalink":"/tags/segregation/","section":"标签","summary":"","title":"Segregation","type":"tags"},{"content":" Title # Segregated systems of human brain networks\nNotes # RSFC within and between brain system exhibits progressive difference across adulthood, even in the absence of disease.\nIncreasing age is associated with decreasing connectivity within systems and increasing connectivity between brain systems.\nincreasing age is accompanied by decreasing segregation different types of functional systems exhibit different trajectories of age-related differences in system segregation With healthy adult , increasing segregation is associated with superior cognitive ability independently of influence of age.\nHigher RSFC segregation exhibit the greatest improvements, and positivity correlate with improvement in the therapy.\n\\(Segregation=(within-between)/within\\)\nModularity is calculated as the fraction of edges that fall within the given communities of a network compared to the expected fraction if the connections were distributed at random across the network.\nFuture # System segregation of an individual change over time and relation to their health\nHow do properties of the anatomical network of brain relate to the maintenance and modulation in segregation and integration of the brain network\u0026rsquo;s functional systems?\nMechanisms of dynamically adjust the segregation and integration\nOptimal network regime or configuration, in aging and disease the differences in segregation\nIndividual differences\nReference # Wig, G. S. . (2017). Segregated systems of human brain networks. Trends in Cognitive Sciences, 21(12), 981-996.\n","date":"2021年05月05日","externalUrl":null,"permalink":"/posts/2021/2021-05-05-papernote-segregated/","section":"博客","summary":"Title # Segregated systems of human brain networks\n","title":"文献笔记-大脑功能网络的分离与整合","type":"posts"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/anova/","section":"标签","summary":"","title":"Anova","type":"tags"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/cor/","section":"标签","summary":"","title":"Cor","type":"tags"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/glm/","section":"标签","summary":"","title":"GLM","type":"tags"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/lm/","section":"标签","summary":"","title":"Lm","type":"tags"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/lme/","section":"标签","summary":"","title":"Lme","type":"tags"},{"content":" 本文为笔者在学习b站up主@学术数据分析及可视化相关视频的笔记。文中只是笔者个人的理解，描述也只是便于自己理解。在使用相关内容时，还需要进一步查看相关的手册或帮助文档。\n相关 # cor()用于计算两个向量的相关系数。ggm::pcor()用于计算偏相关系数。这两个函数只能计算相关系数。cor.test(), psych::cor.test和psych::pcor.test()分别计算相关系数和偏相关系数及其显著性检验的结果。\n差异性 # t检验 # t.test()用于进行独立样本或配对样本t检验。要求各组内方差相等。相应的非参数版本为wilcox.test()。\n方差分析 # 方差分析要求数据满足三个条件，分别是正态性、方差齐性和独立性。独立性一般在实验设计阶段考虑。这里只讨论前两个条件。\n对正态性的检验 # 数据是否满足正态性可以通过直方图hist(), qq图qqplot()和shapiro.test()进行检验。其中shapiro.test()检验的零假设为数据满足正态性。\n对方差齐性的检验 # 方差齐性检验可以通过bartlett.test(), leveneTest()和fligner.test()进行。它们的零假设均为各组方差相等。\n单/多因素方差分析(ANOVA) # 使用aov()。TukeyHSD()用于进行事后检验/多重比较。\n单/多因素重复测量方差分析(ANCOVA) # aov(y~x+Error(subjects/Group))\n非参数方差分析 # 其中一种利用重采样的方法使用lmPerm::aovp()，用法与aov()类似。\n回归 # 回归拟合 # lm()。 拟合通常用于数据可视化，涉及两个变量之间的关系。目的是找到两个变量之间最合适的关系。 评价模型好坏的指标有残差标准误\\(\\sqrt{\\frac{sum(residual^2)}{n-p-1}}\\)和决定系数\\(R^2=1-\\frac{RSS}{TSS}\\)。 anova(fit, fitnull)可以比较拟合模型与零模型之间是否有差异。零模型一般为\\(\\hat{y}=mean(y)\\)。 包aomisc提供了许多不同函数的拟合函数。以线性和指数函数拟合为例。\n线性/多项式 # \\(y=a+bx+cx^2\\) , drm(y~x, fct=DRC.poly2())等价于lm(y~x+I(x^2)).\n指数 # \\(y=a*exp(k*x)\\), drm(y~x, fct=DRC.expoDecay())\n回归分析 # 回归分析通常用于模型构建预测等，可以包含多个变量。\n一般线性模型 # lm(). AIC()用于比较模型的好坏，值越小模型越好。也可以用anova()对两个模型是否存在差异进行检验。 MASS::stepAIC(), leaps::resubsets()和car::subsets()可以筛选纳入模型的变量。car::vif()可以计算自变量的膨胀系数，值越大表示与其他变量的共线性更强。\n广义线性模型 # 把因变量按照特定的分布进行转换，以符合特定的概率分布，再利用该分布进行预测。glm()，需要指定函数分布族family。高斯分布的glm与lm的结果是相同的。 当响应变量为分类变量时，采用logistic（二分类）。glm(formula, data, family=binomial(\u0026rsquo;logit\u0026rsquo;))。涉及三分类及以上时，可以用nnet::multinom()进行建模分析。\n线性混合模型 # nlme和lme4包提供了相关的函数。nlme::lme(), lme4::lmer(). Eg. lme(Richness~NAP, random=~1|Beach, data) or lmer(Richness~NAP+1|Beach, data).\n广义线性混合模型 # lme4::glmer()和glmmADMB::glmmadmb()提供了相关的建模函数。\n其他 # 其他还包括贝叶斯回归模型、广义非线性模型和广义非线性混合模型。\n参考 # B站UP主@学术数据分析及可视化。\n","date":"2021年05月04日","externalUrl":null,"permalink":"/posts/2021/2021-05-04-r-basic-statistic/","section":"博客","summary":"本文为笔者在学习b站up主@学术数据分析及可视化相关视频的笔记。文中只是笔者个人的理解，描述也只是便于自己理解。在使用相关内容时，还需要进一步查看相关的手册或帮助文档。\n相关 # cor()用于计算两个向量的相关系数。ggm::pcor()用于计算偏相关系数。这两个函数只能计算相关系数。cor.test(), psych::cor.test和psych::pcor.test()分别计算相关系数和偏相关系数及其显著性检验的结果。\n","title":"R语言基本统计","type":"posts"},{"content":"","date":"2021年05月04日","externalUrl":null,"permalink":"/tags/t.test/","section":"标签","summary":"","title":"T.test","type":"tags"},{"content":"","date":"2021年04月19日","externalUrl":null,"permalink":"/tags/bar/","section":"标签","summary":"","title":"Bar","type":"tags"},{"content":"","date":"2021年04月19日","externalUrl":null,"permalink":"/tags/ggplot/","section":"标签","summary":"","title":"Ggplot","type":"tags"},{"content":"","date":"2021年04月19日","externalUrl":null,"permalink":"/tags/histogram/","section":"标签","summary":"","title":"Histogram","type":"tags"},{"content":"本文用于记录ggplot2作图相关的代码，会不定期更新。\n示例数据格式为\nlibrary(tidyverse) data \u0026lt;- read.csv(\u0026#39;test.csv\u0026#39;) %\u0026gt;% as_tibble() data %\u0026gt;% head() %\u0026gt;% knitr::kable() ID Gender Age Education 1 M 6 M 2 F 8 M 3 F 12 M 4 F 19 H 5 F 4 L 6 F 2 M 直方图 # ..density..: 指明y轴为频率值，为ggplot2内置的变量。\ngeom_vline: 添加竖直线，线与x轴的交点由xintercept指定。\ndata %\u0026gt;% ggplot(aes(x=Age, y=after_stat(density))) + geom_histogram(stat = \u0026#39;bin\u0026#39;) + geom_vline(xintercept=mean(data$Age), linetype=\u0026#39;dashed\u0026#39;, color=\u0026#39;blue\u0026#39;) + ylab(\u0026#39;Density\u0026#39;) 条形图 # ggplot2的条形图，每个柱子的高度直接跟输入数据中的某一列对应，其中一个值会产生一个柱子。这跟seaborn包中catplot的逻辑不太一样：它接受一组数对应一个柱子，因此可以自动生成误差线，而不用单独添加。但也可以自定义函数，将数据转换和作图封装起来，达到类似seaborn中catplot的效果\ngeom_errorbar: 为每个柱子添加标准差线，也可以给折线图的每个点添加。\ndata %\u0026gt;% group_by(Gender) %\u0026gt;% mutate( value=mean(Age), sd=sd(Age) ) %\u0026gt;% ggplot(aes(x=Gender, y=value, fill=Gender)) + geom_col(position = \u0026#34;dodge\u0026#34;, width = 0.3) + geom_errorbar(aes(ymin = value-sd, ymax = value+sd), position = position_dodge(0.9), width = .05) + ylab(\u0026#39;Age\u0026#39;) 参考 # https://semba-blog.netlify.app/03/25/2020/barplot-with-errorbar-in-ggplot2/ http://www.sthda.com/english/wiki/ggplot2-barplots-quick-start-guide-r-software-and-data-visualization ","date":"2021年04月19日","externalUrl":null,"permalink":"/posts/2021/2021-04-19-barplot/","section":"博客","summary":"本文用于记录ggplot2作图相关的代码，会不定期更新。\n示例数据格式为\n","title":"作图-ggplot2中的直方图和条形图","type":"posts"},{"content":"","date":"2021年04月18日","externalUrl":null,"permalink":"/tags/hemsiphere-differences/","section":"标签","summary":"","title":"Hemsiphere Differences","type":"tags"},{"content":"","date":"2021年04月18日","externalUrl":null,"permalink":"/tags/rest-fmri/","section":"标签","summary":"","title":"Rest-FMRI","type":"tags"},{"content":"","date":"2021年04月18日","externalUrl":null,"permalink":"/tags/sex-differences/","section":"标签","summary":"","title":"Sex Differences","type":"tags"},{"content":" Title # Hemisphere- and gender-related differences in small-world brain networks: A resting-state functional MRI study\nResults # Male have a large normalized clustering coefficient in the right hemispheric network, but a lower clustering coefficient in the left hemispheric network.\nSignificant hemisphere-related differences in the regional nodal characteristics: frontal and occipital regions (leftward asymmetry), temporal regions (rightward asymmetry).\nConclustions # Topological organization of human brain functional networks is associated with gender and hemispheres.\nNotes # Alterations of brain asymmetries are associated with behavior changes in normal aging and in various neuropsychiatric and neurological diseases such as schizophrenia, stroke and dyslexia.\nStatistically, males perform better in right-lateralized visuospatial perception processing, whereas females have advantages in left-lateralized language processing.\nSmall-world properties is used to identify the range of sparsity (10%~46%). (\\(\\gamma\u003e1\\), \\(\\lambda\\approx1\\), and \\(\\sigma\u003e1.2\\))\nGenerate the comprehensive score by multiplying the sparsity interval and measures at all sparsities.\nHub node is at least one standard deviation greater than the average of parameter (x \u0026gt; mean + SD).\nAsymmetry score (A) = 100 * (R-L)/(0.5*(R+L)), and positive asymmetry scores indicated right-ward asymmetry and vice versa.\nLinks # https://doi.org/10.1016/j.neuroimage.2010.07.066 ","date":"2021年04月18日","externalUrl":null,"permalink":"/posts/2021/2021-04-18-papernote/","section":"博客","summary":"Title # Hemisphere- and gender-related differences in small-world brain networks: A resting-state functional MRI study\n","title":"文献笔记-大脑功能网络中体现的左右半球和性别差异","type":"posts"},{"content":"","date":"2021年04月16日","externalUrl":null,"permalink":"/tags/%E5%8A%9F%E8%83%BD%E7%BD%91%E7%BB%9C/","section":"标签","summary":"","title":"功能网络","type":"tags"},{"content":"","date":"2021年04月16日","externalUrl":null,"permalink":"/tags/%E5%9B%BE%E8%AE%BA%E5%88%86%E6%9E%90/","section":"标签","summary":"","title":"图论分析","type":"tags"},{"content":" Title # Disrupted Brain Connectivity Networks in Drug-Naive, First-Episode Major Depressive Disorder\nResults # MDD患者表现出了全局属性的改变：更短的最短路径长度和更高的全局效率→朝着随机网络转变； 尾状核和默认网络脑区中心性在MDD组中增加； 枕叶、眶额和颞叶脑区中心性下降； Conclustions # MDD is associated with disruptions in the topological organization of functional brain networks; Disruption in the topological organization may contribute to disturbances in mood and cognition in MDD; Notes # 网络稀疏性选择标准：(1) 网络平局度\u0026gt;2*log(N)，N为网络节点数；(2) 小世界属性大于1.1； AUC指标提供了独立与单个稀疏性下的综合度量，summaried scale; NBS, Network-based statistic, 对网络中的连边进行统计的方法； Nonparametric permutation test; Combination of high local clustering and short path length supports the two fundamental organizational principles in the brain: functional segregation and functional integration; Links # https://doi.org/10.1016/j.biopsych.2011.05.018 ","date":"2021年04月16日","externalUrl":null,"permalink":"/posts/2021/2021-04-16-papernote/","section":"博客","summary":"Title # Disrupted Brain Connectivity Networks in Drug-Naive, First-Episode Major Depressive Disorder\n","title":"文献笔记-抑郁症大脑功能网络拓扑属性的改变","type":"posts"},{"content":"","date":"2021年04月16日","externalUrl":null,"permalink":"/tags/%E5%B0%8F%E4%B8%96%E7%95%8C%E5%B1%9E%E6%80%A7/","section":"标签","summary":"","title":"小世界属性","type":"tags"},{"content":"","date":"2021年04月16日","externalUrl":null,"permalink":"/tags/%E6%8A%91%E9%83%81%E7%97%87/","section":"标签","summary":"","title":"抑郁症","type":"tags"},{"content":"","date":"2021年04月14日","externalUrl":null,"permalink":"/tags/codens-d/","section":"标签","summary":"","title":"Coden's D","type":"tags"},{"content":" 统计当中，假设检验和P值可以给我们提供关于假设为真的可能性。例如双样本t检验可以报告两组样本所对应总体均值存在差异的可能性。若可能性小于一个比较小的值（通常设置为0.05），那我们认为在一次试验中，小概率事件不可能发生，所以拒绝零假设成立。但是我们只是知道了这两组有多大的概率相等，并不知道两组具体有多大的差异。因此我们需要引入效应量的概念。\n什么是效应量 # 简单来讲，效应量是用来量化变量之间关系或差异具体有多大或多小的指标。其是通过样本计算得到的。\n如何计算 # 效应量大致分为两种类型：(1)量化变量之间关系的，也被称为r family, 和(2)量化变量之间差异的，也被称为d family。\nR family有Pearson相关系数和\\(r^2\\)等。\nD family有Cohen\u0026rsquo;s d, 优势比和相对风险率等。其中Cohen\u0026rsquo;s d计算公式如下，\n$$ Cohen's d=(\\mu_1-\\mu_2)/s, $$ $$ s=\\sqrt{\\frac{(n_1-1)*s_1^2+(n_2-1)*s_2^2}{(n_1+n_2-2)}} $$\\(s_1\\)和\\(s_2\\)分别表示两个样本的标准差。\n参考 # http://www.atyun.com/23635.html https://www.iikx.com/news/statistics/1827.html ","date":"2021年04月14日","externalUrl":null,"permalink":"/posts/2021/2021-04-14-effectsize/","section":"博客","summary":"统计当中，假设检验和P值可以给我们提供关于假设为真的可能性。例如双样本t检验可以报告两组样本所对应总体均值存在差异的可能性。若可能性小于一个比较小的值（通常设置为0.05），那我们认为在一次试验中，小概率事件不可能发生，所以拒绝零假设成立。但是我们只是知道了这两组有多大的概率相等，并不知道两组具体有多大的差异。因此我们需要引入效应量的概念。\n","title":"什么是效应量？","type":"posts"},{"content":"","date":"2021年04月14日","externalUrl":null,"permalink":"/tags/%E6%95%88%E5%BA%94%E9%87%8F/","section":"标签","summary":"","title":"效应量","type":"tags"},{"content":" 在对fMRI数据，尤其是task-fMRI数据进行分析的时候，利用广义线性模型进行建模是很重要的一步。这里简单记录一下自己关于这部分的理解。\n我们的大脑每时每刻都在活动，也就造成了血氧水平的变化（BOLD）。理论上在接收到刺激以后，大脑BOLD信号的变化符合血氧动力学函数（HRF）。但是考虑到各种因素，最终大脑的变化是非常复杂的。磁共振技术可以用来收集大脑的BOLD信号。在每个TR内，都会生成一个全脑或者一定范围内大脑活动的三维图像。对于其中的一个体素来说，假设它的信号为\\(y\\)。这里只考虑一种刺激条件的情况。如图1所示。\n图2. 理论上，BOLD信号和体素y信号的关系。 当给予刺激之后，根据刺激的时间、时长和HRF，我们可以估计出某个体素理论上的BOLD信号。然后在这段时间内进行采样，就可以得到一系列的\\(y\\)和对应理论上的BOLD信号\\(x\\)（图2）。通过广义线性模型，我们就可以估计出相应的系数\\(\\beta\\)。\n图2. 通过采样之后BOLD信号和体素y信号的关系 ","date":"2021年04月09日","externalUrl":null,"permalink":"/posts/2021/2021-04-09-fmriglm/","section":"博客","summary":"在对fMRI数据，尤其是task-fMRI数据进行分析的时候，利用广义线性模型进行建模是很重要的一步。这里简单记录一下自己关于这部分的理解。\n","title":"fMRI上广义线性模型建模简述","type":"posts"},{"content":"","date":"2021年04月09日","externalUrl":null,"permalink":"/tags/%E5%B9%BF%E4%B9%89%E7%BA%BF%E6%80%A7%E6%A8%A1%E5%9E%8B/","section":"标签","summary":"","title":"广义线性模型","type":"tags"},{"content":"","date":"2021年04月08日","externalUrl":null,"permalink":"/tags/big-sur/","section":"标签","summary":"","title":"Big Sur","type":"tags"},{"content":"","date":"2021年04月08日","externalUrl":null,"permalink":"/tags/%E5%9B%BE%E6%A0%87/","section":"标签","summary":"","title":"图标","type":"tags"},{"content":"","date":"2021年04月08日","externalUrl":null,"permalink":"/tags/%E7%A7%BB%E5%8A%A8%E7%A1%AC%E7%9B%98/","section":"标签","summary":"","title":"移动硬盘","type":"tags"},{"content":"问题描述：访达侧边栏移动硬盘的图标显示如图1，感觉是不正常的显示。图2为正常显示的图标。\n环境：\nmacOS: Big Sur 11.2.3 移动硬盘：希捷 iRightMouse: 2.1.1\n图1. 显示异常的图标 图2. 正常显示的图标 解决方案：在系统偏好设置里面的扩展模块，把新近安装的访达扩展取消勾选即可（图3）。本机问题为超级右键的扩展导致的。取消勾选即可恢复正常的磁盘图标。但是取消之后，相关软件在访达里面的扩张功能也就没办法使用了。请自行斟酌。\n图3. 操作顺序 参考 # https://discussionschinese.apple.com/thread/252297105 ","date":"2021年04月08日","externalUrl":null,"permalink":"/posts/2021/2021-04-08-iconabnormal/","section":"博客","summary":"问题描述：访达侧边栏移动硬盘的图标显示如图1，感觉是不正常的显示。图2为正常显示的图标。\n","title":"移动硬盘图标异常","type":"posts"},{"content":"","date":"2021年04月07日","externalUrl":null,"permalink":"/tags/iterm2/","section":"标签","summary":"","title":"ITerm2","type":"tags"},{"content":" 起因 # 在更新BigSur之后的某一天，突然发现iTerm2在全屏模式下，顶部不时会出现一条白色的线闪动。后来在一个论坛里面看到有人说貌似是系统的问题。但是很奇怪，室友的电脑上就没有这样的情况。中间也试过重装系统（PS：强迫症重度患者），但还是会出现。\n通过排查，发现只有iTerm2配色选择深色主题，并且系统主题为浅色主题时，才会出现上述的问题。\n系统版本：macOS Big Sur 11.2.3\niTerm2版本：Build 3.4.4\n解决 # 打开iTerm2偏好设置，选择高级。在文本框中输入big sur，把通用这一行改为是即可。如图1.\n图1. 操作顺序 参考 # https://blog.csdn.net/lxyoucan/article/details/115085694 https://gitlab.com/gnachman/iterm2/-/issues/9199 ","date":"2021年04月07日","externalUrl":null,"permalink":"/posts/2021/2021-04-07-iterm2/","section":"博客","summary":"起因 # 在更新BigSur之后的某一天，突然发现iTerm2在全屏模式下，顶部不时会出现一条白色的线闪动。后来在一个论坛里面看到有人说貌似是系统的问题。但是很奇怪，室友的电脑上就没有这样的情况。中间也试过重装系统（PS：强迫症重度患者），但还是会出现。\n","title":"全屏模式下iTerm2标题栏闪动","type":"posts"},{"content":"","date":"2021年04月04日","externalUrl":null,"permalink":"/tags/blog/","section":"标签","summary":"","title":"Blog","type":"tags"},{"content":"","date":"2021年04月04日","externalUrl":null,"permalink":"/tags/blogdown/","section":"标签","summary":"","title":"Blogdown","type":"tags"},{"content":" 准备工作 # 安装RStudio和R包blogdown。\n创建博客 # 在R终端中输入如下代码即可创建默认主题的博客。\nblogdown::new_site() 另外也可以在RStudio中通过图形界面创建。\n鼠标点击File -\u0026gt; New Project\u0026hellip; -\u0026gt; New Directory -\u0026gt; Website using blogdown\n在弹出的对话框的Directory name内输入本地存放项目的目录名。Create project as subdirectory of: 为项目的父目录。之后点击Create Project 按钮。Hugo theme为博客的主题。这里我们用默认主题。其他主题参考HUGO主题页面。\n在R终端中输入blogdown::server_site()即可在本地部署博客。 在Gitee上部署博客 # 首先需要在gitee上创建仓库，并将Depoly directory更改为 “.”（不带引号） 。 在R终端中输入blogdown::hugo_build(relativeURLs=TRUE)并运行。可以看到在home目录下生成了public。该目录下即为生成的博客静态页面。此时点击public/index.html是可以在浏览器查看的。\n将public中的文件同步到刚创建的gitee或github仓库中。使用的命令如下：\ncd public git init git add . git commit -m \u0026#39;first commit\u0026#39; git remote add origin xxxx.git git push -f origin master 之后就可以通过访问username.gitee.io/home访问自己的博客了。\n至此，我们使用blogdown创建了自己的博客，并使用hugo生成了静态页面。最后通过gitee或github发布生成的静态页面。\n","date":"2021年04月04日","externalUrl":null,"permalink":"/posts/2021/2021-04-04-blogdown/","section":"博客","summary":"准备工作 # 安装RStudio和R包blogdown。\n","title":"利用blogdown建立个人博客","type":"posts"},{"content":" sfRehearsal # A few days ago, I was preparing an English presentation. During rehearsal, I found that it would be much useful if I had a reference voice to follow and could record my own speech for comparison. This inspired me to create sfRehearsal, a simple tool for presentation practice and pronunciation training.\nFor the repository URL and more details, please see: https://github.com/isangfeng/sfRehearsal.git\n","externalUrl":null,"permalink":"/en/projects/","section":"Projects","summary":"sfRehearsal # A few days ago, I was preparing an English presentation. During rehearsal, I found that it would be much useful if I had a reference voice to follow and could record my own speech for comparison. This inspired me to create sfRehearsal, a simple tool for presentation practice and pronunciation training.\n","title":"Projects","type":"projects"}]