基于16S菌群数据的CCA分析:vif.cca出NA及ordistep报错求助
16S微生物组CCA分析常见问题解决
问题1:vif.cca返回部分变量VIF为NA
当用全变量构建CCA模型后,调用vif.cca()计算方差膨胀因子时,部分变量返回NA,但单独用这些变量建模时能得到有效VIF值。
相关代码与输出
全变量模型构建及VIF计算:
ccamodel <- cca(dat.ra~., metadata[,c(5:18)]) vif.cca(ccamodel)
输出:
C.Al C.As C.Cd C.Co C.Cu C.Fe C.Mn C.Mo 8209.10944 62.45001 29.47413 1858.44566 1183.49583 2680.69957 547.19467 151.96578 C.Ni C.Pb C.Se C.Sn C.V C.Zn 130.85638 NA NA NA NA NA
单独用NA变量构建模型:
ccamodel2 <- cca(dat.ra~., metadata[,c(14:18)]) #仅使用之前返回NA的变量 vif.cca(ccamodel2)
输出:
C.Pb C.Se C.Sn C.V C.Zn 49.31645 22.68222 37.62568 23.85968 16.42651
原因与解决
原因:变量间存在严重共线性,当多个高度相关的变量同时纳入模型时,部分变量的信息被其他变量完全覆盖,导致无法计算有效VIF值;单独建模时无强干扰变量,因此能正常计算。
解决方法:
- 先做变量相关性分析:用
cor(metadata[,c(5:18)])计算变量间相关系数,移除相关系数绝对值>0.7的变量; - 用逐步回归筛选变量:通过
ordistep()自动筛选对模型贡献显著的变量,减少共线性影响; - 正则化约束:若必须保留所有变量,可使用带LASSO约束的冗余分析(
rda()结合glmnet)。
问题2:ordistep函数触发报错
一组数据运行ordistep()正常,另一组运行时提示upper scope包含模型中不存在的NA项。
相关代码与报错
正常运行的代码:
finalmodel<- ordistep(ccamodel, scope=formula(ccamodel)) vif.cca(finalmodel)
输出与首次vif.cca()结果一致。
报错的代码:
geofinalmodel<- ordistep(ccamodel, scope=formula(geoccamodel))
报错信息:
Error in factor.scope(ffac, list(add = fadd, drop = fdrop)) : upper scope has terms ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’, ‘NA’ not included in model
原因与解决
原因:geoccamodel的公式中存在无效变量(如缺失列名、变量不存在于metadata),导致formula(geoccamodel)解析出NA值,而ordistep()的scope要求上下限模型的变量必须全部包含在初始模型ccamodel中。
解决方法:
- 检查
geoccamodel的构建:确认模型中所有变量都存在于metadata且无缺失值; - 手动指定
scope:避免直接调用formula(geoccamodel),手动列出所有需要纳入筛选的变量,例如:geofinalmodel <- ordistep(ccamodel, scope = list( lower = ~1, upper = ~C.Al + C.As + C.Cd + C.Co + C.Cu + C.Fe + C.Mn + C.Mo + C.Ni + C.Pb + C.Se + C.Sn + C.V + C.Zn )) - 清理无效模型:先移除
geoccamodel中的无效变量,再提取公式用于scope参数。
内容的提问来源于stack exchange,提问作者Faith B
相关产品推荐
相关产品推荐

