如何在R中识别CONN导出的3D功能连接矩阵并进行相关性分析
解决R中读取.mat 3D功能连接矩阵及计算相关性的问题
嘿,我之前也踩过Matlab多维数组在R里被误转成2D的坑,来给你一步步梳理解决方案:
第一步:正确读取3D .mat矩阵
问题大概率出在读取.mat文件的方式上——默认读取函数可能没正确识别多维数组结构。推荐用rmatio包,它对Matlab多维数组的支持比老的R.matlab更友好:
# 先安装并加载包 install.packages("rmatio") library(rmatio) # 读取你的静息态和任务态数据 # 注意替换成你.mat文件里实际的变量名(比如你在Matlab里存的变量叫rest_fc就用$rest_fc) rest_data <- read.mat("rest_condition.mat")$your_rest_variable_name task_data <- read.mat("task_condition.mat")$your_task_variable_name # 检查维度是否正确,应该输出 12 12 10 dim(rest_data) dim(task_data)
如果读入后还是2D(比如维度是144×10,也就是12*12的展平结果),手动把它重构为3D数组就行:
# 把2D矩阵转成3D rest_data_3d <- array(rest_data, dim = c(12, 12, 10)) task_data_3d <- array(task_data, dim = c(12, 12, 10))
第二步:计算相关性比较FC差异
功能连接矩阵是对称的,对角线都是1(自身连接),我们通常只需要分析上三角区域的连接值。这里提供两种常用的分析思路:
思路1:计算每个ROI对在两种状态下的相关性
先把每个时间点的12×12矩阵提取上三角,得到每个时间点的66个独立FC值(12*11/2),再计算每个ROI对在静息/任务态下的相关性:
# 定义函数提取对称矩阵的上三角(不含对角线) extract_upper_tri <- function(mat) { mat[upper.tri(mat)] } # 对每个时间点提取FC值,得到10×66的矩阵(10个时间点,66个ROI对) rest_fc <- t(apply(rest_data_3d, 3, extract_upper_tri)) task_fc <- t(apply(task_data_3d, 3, extract_upper_tri)) # 计算每个ROI对的静息-任务FC相关性 roi_pair_cors <- apply(cbind(rest_fc, task_fc), 2, function(x) { cor(x[1:10], x[11:20]) }) # 也可以计算整体的相关性(所有FC值拉平后的相关) overall_cor <- cor(as.vector(rest_data_3d), as.vector(task_data_3d))
思路2:统计检验FC差异(如果需要)
如果要验证两种状态下FC的差异是否显著,因为是同一组时间点的配对数据,用配对t检验最合适:
# 加载tidyverse工具包处理数据 install.packages("tidyverse") library(tidyverse) # 把数据整理成长格式 rest_df <- as.data.frame(rest_fc) %>% mutate(condition = "rest", time_point = 1:10) task_df <- as.data.frame(task_fc) %>% mutate(condition = "task", time_point = 1:10) combined_df <- bind_rows(rest_df, task_df) %>% pivot_longer(cols = -c(condition, time_point), names_to = "roi_pair", values_to = "fc_value") # 对每个ROI对做配对t检验 fc_test_results <- combined_df %>% group_by(roi_pair) %>% summarise( t_statistic = t.test(fc_value ~ condition, paired = TRUE)$statistic, p_value = t.test(fc_value ~ condition, paired = TRUE)$p.value, # 计算平均FC差异 mean_diff = mean(fc_value[condition == "task"]) - mean(fc_value[condition == "rest"]) )
常见问题排查
如果读入后还是不对,检查Matlab里的变量是不是存成了cell数组而不是3D数组——如果是cell,你需要先提取cell里的元素:
# 如果是cell数组,取第一个元素(假设你的cell里每个元素是12×12矩阵) rest_data <- read.mat("rest_condition.mat")$your_cell_variable[[1]] # 然后再重构为3D数组 rest_data_3d <- array(unlist(rest_data), dim = c(12,12,10))
内容的提问来源于stack exchange,提问作者Pedro Henrique
相关产品推荐
相关产品推荐

