确认从LDA对象scaling提取排序影响最大变量的方法是否正确
问题
我对数据做了LDA分析,想提取对排序影响最大的变量。我知道可以从LDA对象的scaling组件获取相关信息,脚本里用了lda_variable_impact <- as.data.frame(novaseqmod$scaling),请帮忙确认这个方法对不对?
补充信息
- 输入文件
full:列对应样本,行对应细菌属,存储各样本中细菌的百分比计数 metadata文件:将每个样本与对应实验条件关联
代码示例
# 查看full数据前4行4列 full[1:4,1:4] # 输出结果: # 1 # Bacteria;Acidobacteriota;Blastocatellia;Blastocatellales;Blastocatellaceae;Stenotrophobacter 0.14613673 # Bacteria;Planctomycetota;Planctomycetes;Gemmatales;Gemmataceae;Fimbriiglobus 0.09421973 # Bacteria;Proteobacteria;Gammaproteobacteria;Burkholderiales;Comamonadaceae;Ideonella 0.00000000 # Bacteria;Proteobacteria;Alphaproteobacteria;Rhodobacterales;Rhodobacteraceae;Rhodobacter 0.02412305 # 2 # Bacteria;Acidobacteriota;Blastocatellia;Blastocatellales;Blastocatellaceae;Stenotrophobacter 0.13213317 # Bacteria;Planctomycetota;Planctomycetes;Gemmatales;Gemmataceae;Fimbriiglobus 0.04552392 # Bacteria;Proteobacteria;Gammaproteobacteria;Burkholderiales;Comamonadaceae;Ideonella 0.02481054 # Bacteria;Proteobacteria;Alphaproteobacteria;Rhodobacterales;Rhodobacteraceae;Rhodobacter 0.03015960 # 3 # Bacteria;Acidobacteriota;Blastocatellia;Blastocatellales;Blastocatellaceae;Stenotrophobacter 0.06054529 # Bacteria;Planctomycetota;Planctomycetes;Gemmatales;Gemmataceae;Fimbriiglobus 0.14525729 # Bacteria;Proteobacteria;Gammaproteobacteria;Burkholderiales;Comamonadaceae;Ideonella 0.01825357 # Bacteria;Proteobacteria;Alphaproteobacteria;Rhodobacterales;Rhodobacteraceae;Rhodobacter 0.03187948 # 4 # Bacteria;Acidobacteriota;Blastocatellia;Blastocatellales;Blastocatellaceae;Stenotrophobacter 0.09844844 # Bacteria;Planctomycetota;Planctomycetes;Gemmatales;Gemmataceae;Fimbriiglobus 0.02838332 # Bacteria;Proteobacteria;Gammaproteobacteria;Burkholderiales;Comamonadaceae;Ideonella 0.00000000 # Bacteria;Proteobacteria;Alphaproteobacteria;Rhodobacterales;Rhodobacteraceae;Rhodobacter 0.04247574 # LDA分析流程 nrep <- 1000 ldares <- data.frame(novaseq = rep(NA, nrep)) for (aaa in 1:nrep) { cat("Replicate", aaa, "out of", nrep, "\n") # 转置并标准化数据 scalenovaseq <- data.frame(scale(t(full))) scalenovaseq$type <- metadata[, myvar][match(row.names(scalenovaseq), metadata$Sample_name)] scalenovaseq <- scalenovaseq[order(as.numeric(row.names(scalenovaseq))), ] # 划分训练集和测试集 chooseme <- sample(c(TRUE, FALSE), nrow(scalenovaseq), replace = TRUE, prob = c(0.7, 0.3)) trainnovaseq <- scalenovaseq[chooseme, ] testnovaseq <- scalenovaseq[!chooseme, ] # 移除低变异变量 sdnovaseq <- apply(trainnovaseq[, !names(trainnovaseq) %in% "type"], 2, sd) removeme <- sdnovaseq < 0.01 trainnovaseq <- trainnovaseq[, !removeme] testnovaseq <- testnovaseq[, !removeme] # 构建LDA模型 novaseqmod <- lda(type ~ ., data = trainnovaseq) novaseqpredicted <- predict(novaseqmod, testnovaseq) ldares[aaa, "novaseq"] <- mean(novaseqpredicted$class == testnovaseq$type) } # 计算各判别轴的解释方差 explained_variance <- novaseqmod$svd^2 / sum(novaseqmod$svd^2) # 提取变量载荷 lda_variable_impact <- as.data.frame(novaseqmod$scaling)
回答
方法正确性确认
你使用novaseqmod$scaling提取变量对排序的影响是完全正确的。在MASS包的lda()函数返回的模型对象中,scaling组件本质是线性判别式的载荷矩阵:
- 每一列对应一个判别轴(如LD1、LD2)
- 每一行的数值代表对应细菌属变量对该判别轴的贡献程度,绝对值越大,说明该变量对样本在该判别轴上的排序影响越强
关键注意事项
- 重复抽样的结果利用:你的代码做了1000次重复抽样,但最后仅保留了最后一次循环的模型结果。如果要得到更稳健的变量重要性结论,建议在每次循环中保存
scaling数据,最终通过取均值、计算置信区间或统计显著性来综合所有重复的结果,避免单次抽样的随机性干扰。 - 低变异变量过滤:你移除标准差<0.01的变量是合理的,能有效过滤无生物学意义的噪声,但阈值可根据数据的实际分布调整(比如如果整体变异都偏低,可适当降低阈值)。
- 结合解释方差解读:优先关注解释方差占比高的判别轴(你计算的
explained_variance),比如若LD1解释了80%的组间差异,那么LD1列载荷绝对值大的变量就是对排序影响最大的核心类群。 - 直观筛选top变量:可以对载荷矩阵按绝对值排序,快速定位关键变量,示例代码:
# 添加特征列名 lda_variable_impact$feature <- rownames(lda_variable_impact) # 按LD1载荷绝对值降序排序 lda_sorted <- lda_variable_impact[order(-abs(lda_variable_impact$LD1)), ] # 查看top10变量 head(lda_sorted, 10)
内容的提问来源于stack exchange,提问作者mgs3
相关产品推荐
相关产品推荐

