You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含大量空值的医疗代谢组数据如何在Python中应用PCA?

针对含大量空值的高维度代谢物数据应用PCA的实操步骤

你的数据是典型的代谢组学场景:样本量小(200行)、特征维度极高(5300列)、大量随机/非随机缺失值,直接跑PCA肯定行不通,得按以下步骤逐步处理:

第一步:先做特征级空值过滤,砍掉无效特征

先统计每列(代谢物)的空值占比,直接删掉空值过多的特征——比如如果某代谢物的非空值样本数不足总样本的30%(200行里仅60个以内有效值),留着只会引入噪音,没有实际分析价值。

用Pandas实现的代码:

import pandas as pd

# 读取数据,先分离目标变量与特征
df = pd.read_excel("你的代谢物数据.xlsx")
target = df['disease_status']
features = df.drop('disease_status', axis=1)

# 过滤掉非空值少于60个的特征(阈值可根据数据情况调整)
filtered_features = features.dropna(thresh=60, axis=1)

第二步:填充剩余特征的空值

代谢组数据的空值不能随便用均值填充(大多代谢物数据呈偏态分布),优先选用以下两种更贴合场景的方法:

方法1:K近邻填充(KNN Imputer)

利用样本间的相似性,用最相似的几个样本的对应代谢物值填充空值,更符合代谢组数据的生物学逻辑:

from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)  # 选5个最相似样本,数量可调整
imputed_features = pd.DataFrame(imputer.fit_transform(filtered_features), 
                                columns=filtered_features.columns)

方法2:迭代填充(Iterative Imputer)

如果你的数据特征间相关性较强,用迭代填充更合适——它会用其他特征作为输入,训练回归模型来预测每个空值:

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

imputer = IterativeImputer(random_state=42, max_iter=10)
imputed_features = pd.DataFrame(imputer.fit_transform(filtered_features), 
                                columns=filtered_features.columns)

第三步:数据标准化(PCA的必备前置操作)

PCA对特征尺度非常敏感,比如某代谢物数值范围是0-100,另一个是0-10000,不标准化的话,PCA会被大尺度特征主导,完全偏离真实变异结构。必须用标准化把所有特征转成均值为0、方差为1的分布:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_features = scaler.fit_transform(imputed_features)

第四步:执行PCA,选择合适的主成分数

因为你的特征数仍可能较多,不用手动指定主成分数量,直接设置保留95%的总方差,让算法自动选择最优数量:

from sklearn.decomposition import PCA

# 保留95%的方差,自动确定主成分数
pca = PCA(n_components=0.95, random_state=42)
pca_results = pca.fit_transform(scaled_features)

# 查看各主成分的方差解释情况
print("各主成分方差解释率:", pca.explained_variance_ratio_)
print("总方差解释率:", sum(pca.explained_variance_ratio_))

额外优化建议(针对小样本高维度数据)

因为你的样本数(200)远小于特征数(即使过滤后仍可能有数千),可以在空值处理前先做低方差过滤,删掉那些几乎没有变异的特征(比如所有样本值都相近的代谢物),进一步减少噪音:

# 过滤掉方差低于0.1的特征(阈值可根据数据调整)
low_var_mask = filtered_features.var() < 0.1
filtered_features = filtered_features.drop(filtered_features.columns[low_var_mask], axis=1)

内容的提问来源于stack exchange,提问作者arin1409

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:06:25