本次教程目的如下:
导入进行基本分析所需的模块;
从提供的文本文件中创建一个新的 Neurosynth 数据集对象;
运行简单的基于术语的荟萃分析。
—————————————————————————————————————————————————————
创建不同版本的新数据集(可跳过该步骤)
创建一个新的数据集(这里示例的version 7),本质上只是一个巨大的激活坐标和相关研究 ID 的列表。
基于特征的简单荟萃分析
对文献进行自动化的大规模荟萃分析。
构建两个文件:
database文件
包含Neurosynth 数据库中所有研究的激活数据和关键元数据。每一行代表一项研究的单个激活。列包括 id、x/y/z 坐标和立体定向空间(MNI,TAL等)。
%首先将需要用到的tsv文件转为xlsx格式
% 使用readtable函数读取TSV文件
coordinates = xlsread('data-neurosynth_version-7_coordinates.xlsx');
[~, ~, metadata]=xlsread('data-neurosynth_version-7_metadata.xlsx');
metadata(1,:)=[];
%列分别为id,x,x,y,space
data=num2cell(coordinates(:,[1,5,6,7]));
jishu=1;
for i=1:size(metadata,1)
for j=jishu:size(coordinates,1)
if isequal(data{j, 1},metadata{i, 1})
data{jishu, 5}=metadata{i, 3};
jishu=jishu+1;
end
end
disp(i)
end
headers = {'id', 'x', 'y', 'z', 'space'};
database=[headers;data];
filename = 'database.xlsx';
xlswrite(filename, database);
feature文件
为上一个教程中代码所获得的文件。行表示研究,列表示术语。
将这两个文件分别保存到txt文件中,database.txt和features.txt(version 7)。
简单实例
不过,数据集存档 (current_data.tar.gz) 已经提供2 个实例文件:database.txt 和 features.txt (version 4)。下述代码基于提供的这两个文件(version 4)进行。
数据中包含了许多心理学术语(如 “语言”、“情感”、“记忆 ”等),这些术语在数据集中出现的频率较高。假设我们想对情感研究进行荟萃分析。我们可以将情感研究定义为作者高频使用以 “emo ”开头的词的研究,我们实际上是在讨论数据集中的每项研究在相应文章的全文中使用 “情感 ”一词的频率。
我们整理好了激活数据和特征数据,我们先做一下简单的基于术语的荟萃分析。
导入模块
from neurosynth.base.dataset import Dataset
#管理和访问数据的核心功能
from neurosynth.analysis import meta, decode, network
#用于元分析、图像解码和共激活分析的分析工具
建立数据集
dataset = Dataset('database.txt')
dataset.add_features('features.txt')
print(dataset.get_feature_names())
#查看数据特征,返回了术语列表,我们可以单独或组合使用这些术语来选择纳入荟萃分析的文章。
ids = dataset.get_studies(features='emo*', frequency_threshold=0.001)
#查询以emo开头的单词(如 “emotional”、“emotional”、“emotally ”等),频率超过千分之一的研究id列表,即一篇文章有5000个单词,至少emo开头的单词有五次,才被纳入列表。
len(ids)
#包含的研究数目
根据选择的术语进行meta分析
from neurosynth.analysis import meta
ma = meta.MetaAnalysis(dataset, ids)
ma.save_results('emotion')
#对筛选的研究进行meta分析,结果保存在emotion文件中
可以看出,这是一组nii格式的输出结果。
我们对一些重要函数进行详细解释:
dataset.get_studies
这个函数是为了获取符合特定条件的研究ID
def get_studies(self, features=None, expression=None, mask=None,
peaks=None, frequency_threshold=0.001,
activation_threshold=0.0, func=np.sum, return_type='ids',
r=6
):
其中features(列表或字符串)是 特征名称或特征名称的列表,
expression(str)要传递给 PEG 的字符串表达式,用于检索研究报告。
mask: the mask image (see Masker documentation for valid data types)。
paeks(ndarray 或 list): 一个 n x 3 的 numpy 数组,或一个由列表或元组组成的列表(例如,[(-10, 22, 14)])。
frequency_threshold(float):对于基于特征或基于表达式的选择,用于选择研究的阈值–即纳入研究的临界值。必须是范围为 [0, 1] 的浮点数。
activation_threshold(int 或 float): 对于基于mask的选择,根据显示的激活数目来确定是否纳入研究的阈值。如果是整数,则表示必须有多少体素在掩码内处于激活状态,研究才会被选中。如果是浮点数,则表示必须激活的体素比例。
如果传递了多个标准,则返回交叉集。例如,如果传递 expression='emotion
和mask='my_mask.nii.gz'
,将只返回那些与情绪相关且报告了所传图像中的体素内激活情况的研究。
得到的结果是字符串形式,可以选择:
ids
:返回筛选出的研究的 ID 列表。
images
:返回一个矩阵(voxel*选择的study)
weights
:返回一个dict,其中键为研究 ID,值为计算的权重。仅在执行基于特征的选择时有效。
r (int)
: 对于基于峰值的选择,纳入研究的距离截断值(单位:毫米)(即只有研究的一个或多个激活 在 r 毫米范围内的研究才会被返回)。
返回值:
当 return_type
为ids
(默认)时,将返回所选研究的 ID 列表。当 return_type
为 images
时,返回一个二维 numpy 数组,行为体素,列为研究。当 return_type
为weights
(仅对基于表达式 (expression-based)的选择有效),返回一个 dict,其中键为研究 ID,值为 计算的权重。
那么,我们可以用该函数实现哪些功能呢?
- 就是我们在简单实例中做的那样,选择出标记有 “情感 ”特征的研究:
ids = dataset.get_studies(features='emotion')
- 选择在杏仁核mask中激活了至少 20% 体素的研究,并且检索激活数据而不是 ID:
dataset.get_studies(mask='amygdala_mask.nii.gz', threshold=0.2, return_type='images')
- 选择报告在三个特定病灶中至少一个病灶的 12 毫米范围内至少有一个激活的研究:
ids = dataset.get_studies(peaks=[[12, -20, 30], [-26, 22, 22], [0, 36, -20]], r=12)