Nilearn学习笔记2-从FMRI数据到时间序列

通过前面的学习了解,我们知道最原始的Fmri数据是4维的,包含三围的空间信息和一维的时间。在实际应用中,我们更多的是利用大脑图像时间序列做研究分析,因为无法直接使用fmri数据做相关研究。在我们使用数据之前,我们需要对原始数据做一些数据预处理和变换。
##1. mask
在所有的分析之中,我们第一步所做的事儿都是把四维fmri数据转换为二维矩阵,这个过程称为MASK。通俗的理解就是提取我们能利用的特征。通过mask得到的二维矩阵包含一维的时间和一维的特征,也就是将fmri数据中每一个时间片上的特征提取出来,再组在一起就是一个二维矩阵。如图所示:
这里写图片描述

这里写图片描述

在nilearn库中,提供了两个函数计算mask:

(1) nilearn.masking.compute_background_mask for brain images where the brain stands out of a constant background. This is typically the case when working on statistic maps output after a brain extraction
(2)nilearn.masking.compute_epi_mask for EPI images

(两个函数应用不同的数据,如果数据是EPI采样,就用第二个)
下面看例子:

from nilearn import masking
mask = masking.compute_background_mask(r'E:\home\bct_test\NC_01_0001\rs6_f8dGR_w3_rabrat_4D.nii')
print(mask.get_data().shape)
from nilearn.masking import apply_mask
masked_data = apply_mask(r'E:\home\bct_test\NC_01_0001\rs6_f8dGR_w3_rabrat_4D.nii', mask)
print(masked_data.shape)
# masked_data shape is (timepoints, voxels). We can plot the first 150
# timepoints from two voxels

# And now plot a few of these
import matplotlib.pyplot as plt
plt.figure(figsize=(7, 5))
plt.plot(masked_data[:230, 98:100])
plt.xlabel('Time [TRs]', fontsize=16)
plt.ylabel('Intensity', fontsize=16)
plt.xlim(0, 150)
plt.subplots_adjust(bottom=.12, top=.95, right=.95, left=.12)

plt.show()

得到的图像:
这里写图片描述

代码中可以看到,我选取了第98和99个特征,画出的图就是这样的。

##2. Timeseries
Mask之后的数据我们也可以做研究分析了,但是我们也发现特征实在是太多了,根本就无法下手,或者是计算两太大。一般而言我们需要找出随着时间在变化的量,只有通过变化的量我们才能得到有效的信息。最简单的一个例子我们想研究北京的雾霾与堵车之间是否有关,那么我们就要得到相应的数据后分析数据,可事实是北京每天都堵车,程度也还一样,没有什么变化,也就无法分析了(这个例子有点儿扯)。
在mask之后,接下来要做的任务就是提取时间序列。说到时间序列,不得不说的是图谱。前面mask之后的特征实在是太多,怎样将这些特征与我们已有的经过验证的图谱对应起来。这个时候就涉及到一个重采样。

#导入图谱,目前用的图谱有好几个,具体选择哪个没有定论。
from nilearn import datasets
dataset = datasets.fetch_atlas_harvard_oxford('cort-maxprob-thr25-2mm')
atlas_filename = dataset.maps
labels = dataset.labels

在nilearn中,重采样函数:resample_to_img

例如:from nilearn.image import resample_to_img
Atlas = resample_to_img(atlas_filename, mask, interpolation='nearest')

(这个是针对于已有参考图谱,最后一定要选最邻近的。如果没有参考图谱,有相应的函数)
重新采样之后就可以得到相应的时间序列了,在把时间序列转换为相关矩阵,并画出其图像。

from nilearn.input_data import NiftiLabelsMasker
masker = NiftiLabelsMasker(labels_img=Atlas, standardize=True,
                           memory='nilearn_cache', verbose=5)

time_series = masker.fit_transform\
    (r'E:\home\bct_test\NC_01_0001\rs6_f8dGR_w3_rabrat_4D.nii')

from nilearn.connectome import ConnectivityMeasure
correlation_measure = ConnectivityMeasure(kind='correlation')
correlation_matrix = correlation_measure.fit_transform([time_series])[0]

# Plot the correlation matrix
import numpy as np
from matplotlib import pyplot as plt
plt.figure(figsize=(10, 10))
# Mask the main diagonal for visualization:
np.fill_diagonal(correlation_matrix, 0)

plt.imshow(correlation_matrix, interpolation="nearest", cmap="RdBu_r",
           vmax=0.8, vmin=-0.8)

# Add labels and adjust margins
x_ticks = plt.xticks(range(len(labels) - 1), labels[1:], rotation=90)
y_ticks = plt.yticks(range(len(labels) - 1), labels[1:])
plt.gca().yaxis.tick_right()
plt.subplots_adjust(left=.01, bottom=.3, top=.99, right=.62)
plt.show()

图形:
这里写图片描述

  • 16
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 35
    评论
fMRI (功能性磁共振成像)是一种用于研究大脑活动的方法,它通过测量血氧水平变化来显示大脑不同区域的活动情况。而fMRI中的时间序列信号是指在进行fMRI扫描时所获得的一系列数据,它反映了大脑不同区域在特定时间点上的活动状态。 时间序列信号在fMRI研究中十分重要,因为它可以提供大脑活动的动态变化信息。研究人员可以通过分析时间序列信号,了解大脑在执行不同任务或受到不同刺激时的活动模式,进而推断不同脑区的功能定位和连接方式。 fMRI中的时间序列信号通常以血氧水平依赖信号(BOLD信号)的形式呈现。这种信号与大脑局部血流和氧合量的变化相关,通常被认为是神经活动的代表。研究人员可以利用时间序列信号的峰值和波动模式来确定特定脑区的激活程度和活动模式,从而识别不同的功能区域。 除了分析脑区活动外,时间序列信号还可以用于进行大脑网络的功能连接分析。通过研究大脑中不同区域间的时间序列信号的同步性和相关性,可以揭示大脑功能网络的结构和活动模式,从而了解大脑在执行认知任务时的信息传递和整合方式。 总之,fMRI中的时间序列信号是对大脑活动动态变化的记录,它为研究人员提供了解大脑功能定位和网络连接的重要信息,有助于揭示大脑活动的复杂机制和认知过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值