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

确认从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:00:04