文章目录
-
-
- [MATLAB 基因表达数据处理与可视化全流程案例](#MATLAB 基因表达数据处理与可视化全流程案例)
- 一、数据准备与预处理
-
- [1. 模拟/加载基因表达数据](#1. 模拟/加载基因表达数据)
- 二、高维基因表达数据降维可视化
- 三、差异表达基因分析与可视化
- 四、基因表达时序数据可视化(扩展)
- 五、关键技巧与注意事项
- 六、真实数据加载示例
-
MATLAB 基因表达数据处理与可视化全流程案例
基因表达数据(如RNA-seq、微阵列数据)通常是高维稀疏矩阵(样本数×基因数,维度可达上万),核心需求包括:数据预处理、降维可视化、差异表达分析、聚类分析等。以下是完整可运行的实战案例,涵盖从数据加载到可视化的全流程。
matlab数据分析教程包含环境配置(matlab下载安装配置教程):https://blog.csdn.net/2501_93482651/article/details/154799463?spm=1011.2415.3001.10575&sharefrom=mp_manage_link
一、数据准备与预处理
1. 模拟/加载基因表达数据
首先生成模拟的基因表达数据(或加载真实数据,如GEO数据库下载的.txt/.csv文件):
matlab
% ===================== 步骤1:生成模拟基因表达数据 =====================
rng(1); % 固定随机种子
n_samples = 50; % 50个样本(如患者/对照组)
n_genes = 1000; % 1000个基因(高维特征)
% 分组:20个对照组(Control)、30个处理组(Treatment)
group = categorical([repmat('Control',n_samples*0.4,1); repmat('Treatment',n_samples*0.6,1)]);
% 生成表达矩阵:处理组部分基因上调/下调,模拟差异表达
expr_matrix = randn(n_samples, n_genes); % 基础表达(正态分布)
% 前50个基因在处理组中上调(倍数2)
expr_matrix(group=='Treatment', 1:50) = expr_matrix(group=='Treatment', 1:50) + 2;
% 51-100个基因在处理组中下调(倍数2)
expr_matrix(group=='Treatment', 51:100) = expr_matrix(group=='Treatment', 51:100) - 2;
% ===================== 步骤2:数据预处理(关键!) =====================
% 1. 过滤低表达基因(去除表达量接近0的基因,减少噪声)
expr_filtered = expr_matrix(:, mean(expr_matrix)>0.1); % 保留均值>0.1的基因
% 2. 标准化(z-score,消除基因间量纲差异)
expr_norm = zscore(expr_filtered);
% 3. 处理缺失值(如存在NaN,用均值填充)
expr_norm(isnan(expr_norm)) = 0; % 简化处理,实际可⽤knnimpute
二、高维基因表达数据降维可视化
基因表达数据维度极高(上千/上万基因),需通过降维映射到2D/3D空间,展示样本聚类:
matlab
% ===================== 步骤3:降维(UMAP/PCA/t-SNE) =====================
% 方法1:PCA(快速看全局分布)
[coeff, score, ~, ~, explained] = pca(expr_norm);
X_pca = score(:,1:2); % 前2主成分
% 方法2:UMAP(兼顾全局+局部,推荐基因数据)
X_umap = umap(expr_norm, 'NumDimensions', 2, 'NumNeighbors', 10);
% 方法3:t-SNE(聚焦局部聚类)
X_tsne = tsne(expr_norm, 'Perplexity', 20, 'Algorithm','barnes-hut');
% ===================== 步骤4:可视化对比 =====================
figure('Color','w','Position',[100,100,1200,400]);
tiledlayout(1,3,'Padding','compact');
% 子图1:PCA结果
nexttile;
gscatter(X_pca(:,1), X_pca(:,2), group, [0.2 0.6 0.8; 0.8 0.2 0.4], 'os', 8);
xlabel(['PC1 (解释方差: ', num2str(explained(1),2), '%)']);
ylabel(['PC2 (解释方差: ', num2str(explained(2),2), '%)']);
title('PCA降维:基因表达样本分布');
grid on; legend('Location','best');
% 子图2:UMAP结果
nexttile;
gscatter(X_umap(:,1), X_umap(:,2), group, [0.2 0.6 0.8; 0.8 0.2 0.4], 'os', 8);
xlabel('UMAP维度1'); ylabel('UMAP维度2');
title('UMAP降维:基因表达样本分布');
grid on; legend('Location','best');
% 子图3:t-SNE结果
nexttile;
gscatter(X_tsne(:,1), X_tsne(:,2), group, [0.2 0.6 0.8; 0.8 0.2 0.4], 'os', 8);
xlabel('t-SNE维度1'); ylabel('t-SNE维度2');
title('t-SNE降维:基因表达样本分布');
grid on; legend('Location','best');
sgtitle('基因表达高维数据降维可视化','FontSize',14,'FontWeight','bold');
结果分析:
- PCA 能看到两组样本的大致分离,但因基因表达的非线性特征,可能存在重叠;
- UMAP 完全分离对照组/处理组,且保留样本间的全局相对关系(推荐基因数据);
- t-SNE 局部聚类更紧凑,但全局结构可能失真。
三、差异表达基因分析与可视化
识别两组间表达量显著差异的基因,并可视化其表达模式:
matlab
% ===================== 步骤5:差异表达基因筛选(t检验) =====================
% 分组提取表达数据
expr_control = expr_norm(group=='Control', :);
expr_treatment = expr_norm(group=='Treatment', :);
% 双样本t检验(计算p值)
[p_val, ~] = ttest2(expr_control, expr_treatment);
% 校正p值(多重检验校正,Benjamini-Hochberg)
p_adjust = mafdr(p_val, 'BHFDR', true);
% 筛选差异基因:校正p值<0.05 且 表达量差异>1.5倍
fold_change = mean(expr_treatment) - mean(expr_control); % 差异倍数
diff_genes_idx = (p_adjust < 0.05) & (abs(fold_change) > 1.5);
diff_genes_expr = expr_norm(:, diff_genes_idx); % 差异基因表达矩阵
fprintf('筛选出 %d 个差异表达基因\n', sum(diff_genes_idx));
% ===================== 步骤6:差异基因可视化 =====================
% 1. 火山图(展示p值 vs 差异倍数)
figure('Color','w');
scatter(fold_change, -log10(p_adjust), 30, 'k', 'filled');
hold on;
% 标记显著差异基因(红色:上调,绿色:下调)
scatter(fold_change(diff_genes_idx), -log10(p_adjust(diff_genes_idx)), ...
50, fold_change(diff_genes_idx)>0, 'filled');
colormap([0.8 0.2 0.2; 0.2 0.8 0.2]); % 红=上调,绿=下调
% 添加阈值线
plot([-1.5, -1.5], [0, max(-log10(p_adjust))], 'k--');
plot([1.5, 1.5], [0, max(-log10(p_adjust))], 'k--');
plot([min(fold_change), max(fold_change)], [-log10(0.05), -log10(0.05)], 'k--');
xlabel('差异倍数(Treatment - Control)');
ylabel('-log10(校正p值)');
title('基因表达火山图');
grid on; colorbar('Ticks',[0,1],'TickLabels',{'下调','上调'});
% 2. 热图(展示差异基因的表达模式聚类)
figure('Color','w');
% 对差异基因表达矩阵归一化(每行归一化,突出样本间模式)
diff_genes_norm = zscore(diff_genes_expr, 0, 1);
% 绘制热图
heatmap(diff_genes_norm, 'RowLabels',group, 'Colormap',parula, ...
'Title','差异表达基因热图(样本×基因)');
结果分析:
- 火山图中,红色点为上调基因、绿色点为下调基因,虚线为筛选阈值;
- 热图可清晰看到:对照组/处理组的差异基因表达模式完全分离,验证筛选有效性。
四、基因表达时序数据可视化(扩展)
若为时序基因表达数据(如不同时间点的表达量),可可视化基因表达趋势:
matlab
% ===================== 模拟时序基因表达数据 =====================
time_points = 0:2:10; % 0/2/4/6/8/10小时
n_time = length(time_points);
n_genes = 5; % 选5个核心差异基因
% 模拟5个基因的时序表达趋势
expr_time = zeros(n_time, n_genes);
expr_time(:,1) = 1 + sin(time_points/2); % 正弦趋势
expr_time(:,2) = linspace(0, 3, n_time); % 线性上调
expr_time(:,3) = linspace(3, 0, n_time); % 线性下调
expr_time(:,4) = 2 + randn(size(time_points))*0.1; % 稳定表达
expr_time(:,5) = 0.5*cos(time_points) + 1; % 余弦趋势
% ===================== 时序趋势可视化 =====================
figure('Color','w');
plot(time_points, expr_time, 'o-', 'LineWidth',1.5, 'MarkerSize',8);
xlabel('时间(小时)'); ylabel('标准化表达量');
title('基因表达时序趋势');
legend({'基因1','基因2','基因3','基因4','基因5'}, 'Location','best');
grid on;
五、关键技巧与注意事项
-
数据预处理核心:
- 过滤低表达基因:避免噪声基因干扰降维和差异分析;
- 标准化:基因表达量范围差异大,z-score是基础操作;
- 缺失值处理:推荐用
knnimpute(K近邻填充)替代简单均值填充。
-
降维方法选型:
- 基因数据优先选 UMAP(兼顾全局/局部,速度快);
- 快速探索用PCA,聚焦局部聚类用t-SNE;
- 大数据(>1000样本):先PCA降维到50维,再用UMAP/t-SNE(减少计算量)。
-
差异分析优化:
- 小样本用非参数检验(如
ranksum)替代t检验; - 批量数据用
edgeR/DESeq2(MATLAB可调用R包,需安装Statistics and Machine Learning Toolbox)。
- 小样本用非参数检验(如
-
可视化优化:
- 热图行/列聚类:
heatmap可添加'ClusterRows',true,'ClusterColumns',true; - 火山图标注关键基因:用
text函数标注高差异倍数的基因名。
- 热图行/列聚类:
六、真实数据加载示例
若从GEO数据库下载了基因表达数据(.txt格式),加载代码:
matlab
% 加载真实基因表达数据(样本×基因,第一列是分组标签)
data = readtable('GSExxxx_expr.txt', 'TextType','string');
group = categorical(data(:,1)); % 分组标签
expr_matrix = table2array(data(:,2:end)); % 表达矩阵
% 后续预处理/降维/可视化同上述案例
如需针对特定基因表达分析场景(如单细胞RNA-seq、加权基因共表达网络分析WGCNA)的定制化代码,可补充说明,我会进一步细化!