如何用Python对带标签的纵向基因数据进行聚类分析?
Python实现基因谱聚类与样本关联分析
步骤1:数据预处理——将纵向数据转换为谱特征矩阵
首先需要把每个(gene_id, sample)组合的value按position排序后提取成特征向量,保证每个谱的特征顺序一致:
import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 加载并初始化数据 data = { 'gene_id': ['gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3'], 'position': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5], 'value': [5.1, 5.5, 5.7, 6.0, 6.3, 6.3, 6.5, 6.7, 6.8, 5.1, 2.3, 2.5, 2.7, 3.0, 3.1, 3.1, 3.2, 3.3, 3.4, 2.3, 3.7, 3.8, 3.9, 4.0, 4.0, 4.0, 4.1, 4.2, 4.3, 3.7], 'sample': ['sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A'] } df = pd.DataFrame(data) # 按position排序,确保特征顺序一致 df_sorted = df.sort_values(['gene_id', 'sample', 'position']) # 分组提取每个(gene_id, sample)的value序列 feature_df = df_sorted.groupby(['gene_id', 'sample'])['value'].apply(list).reset_index() # 将序列拆分为对应position的特征列 feature_matrix = pd.DataFrame(feature_df['value'].tolist(), columns=[f'pos_{i}' for i in range(1,6)]) # 合并元信息 feature_matrix = pd.concat([feature_df[['gene_id', 'sample']], feature_matrix], axis=1) # 提取用于聚类的数值特征矩阵 X = feature_matrix.iloc[:, 2:]
步骤2:KMeans聚类分析
使用KMeans对谱特征进行聚类,同时关联样本信息:
# 初始化KMeans模型,这里设k=2(可根据肘部法则调整) kmeans = KMeans(n_clusters=2, random_state=42) # 拟合模型并添加聚类标签 feature_matrix['cluster_label'] = kmeans.fit_predict(X) # 输出聚类与样本的分布统计 cluster_sample_stats = feature_matrix.groupby(['cluster_label', 'sample']).size().unstack(fill_value=0) print("聚类-样本分布统计:") print(cluster_sample_stats)
步骤3:可视化聚类空间(PCA降维)
通过PCA将高维特征降至2维,直观展示聚类与样本的分布关系:
# PCA降维到2维 pca = PCA(n_components=2, random_state=42) X_pca = pca.fit_transform(X) feature_matrix['pca_x'] = X_pca[:, 0] feature_matrix['pca_y'] = X_pca[:, 1] # 绘制聚类散点图 plt.figure(figsize=(8,6)) for cluster in feature_matrix['cluster_label'].unique(): cluster_data = feature_matrix[feature_matrix['cluster_label'] == cluster] for sample in cluster_data['sample'].unique(): sample_data = cluster_data[cluster_data['sample'] == sample] plt.scatter(sample_data['pca_x'], sample_data['pca_y'], label=f"Cluster {cluster} - {sample}", alpha=0.7, s=100) plt.xlabel("PCA Component 1") plt.ylabel("PCA Component 2") plt.title("Gene Spectra Clustering (PCA Reduced) with Sample Labels") plt.legend() plt.grid(True) plt.show()
步骤4:验证聚类的谱曲线特征
绘制每个聚类的平均谱曲线,验证聚类是否符合形状与幅度的预期:
plt.figure(figsize=(8,6)) positions = [1,2,3,4,5] for cluster in feature_matrix['cluster_label'].unique(): cluster_features = X[feature_matrix['cluster_label'] == cluster] mean_values = cluster_features.mean(axis=0).values plt.plot(positions, mean_values, label=f"Cluster {cluster} Mean Spectrum", linewidth=2) plt.xlabel("Position") plt.ylabel("Value") plt.title("Mean Spectrum of Each Cluster") plt.legend() plt.grid(True) plt.show()
关键提示
- 特征一致性:必须保证每个谱的
position排序一致,否则聚类特征会混乱。 - k值选择:若不确定最优聚类数,可绘制肘部曲线(
inertia随k变化的曲线)选择拐点处的k值。 - 幅度处理:如果需要忽略幅度只关注形状,可先对特征做标准化(
StandardScaler)。
内容的提问来源于stack exchange,提问作者donkey
相关产品推荐
相关产品推荐

