我正在尝试制作一个NMDS图,说明OTU如何随土壤类型而变化。
以下是我在OTU表和元数据文件中读取后的代码部分:
# Calculate distance for NMDS
sol=metaMDS(DATA1)
# NMDS data frame
NMDS = data.frame(MDS1 = sol$points[,1], MDS2 = sol$points[,2],group=meta$Soil.type)
NMDS.mean=aggregate(NMDS[,1:2],list(group=meta$Soil.type),mean)
# Vegan Cov Ellipse function
veganCovEllipse<-function (cov, center = c(0, 0), scale = 1, npoints = 100)
{
theta <- (0:npoints) * 2 * pi/npoints
Circle <- cbind(cos(theta), sin(theta))
t(center + scale * t(Circle %*% chol(cov)))
}
df_ell <- data.frame()
for(g in levels(NMDS$group)){
df_ell <- rbind(df_ell, cbind(as.data.frame(with(NMDS[NMDS$group==g,],
veganCovEllipse(cov.wt(cbind(MDS1,MDS2),wt=rep(1/length(MDS1),length(MDS1)))$cov,center=c(mean(MDS1),mean(MDS2)))))
,group=g))
}
此时,我收到以下错误:
Error in cov.wt(cbind(MDS1, MDS2), wt = rep(1/length(MDS1), length(MDS1))) :
weights must be non-negative and not all zero
以下是我的NMDS数据框的子集:
MDS1 MDS2 group
B1_02 -0.01562695 -0.39211505 Sandy clay in valleys
B1_0210 -0.83751037 -0.17452227 Sandy clay in valleys
B1_1020 -0.49050044 -0.19169209 Sandy clay in valleys
B1_Litt 0.69079105 -0.07051786 Sandy clay in valleys
B2_0210 -0.75019323 0.30193393 Sandy clay in valleys
B2_1020 -1.21495108 0.01854564 Sandy clay in valleys
B2_Litt 0.75491704 -0.08715606 Sandy clay in valleys
我在使用不同的元数据和OTU文件之前运行了这段代码,所以我认为代码应该没问题。问题必须出在我这次使用的文件上。我不理解错误,但我猜测它是指我的NMDS数据框中的负MDS1和MDS2值。
我没有在网上找到关于如何处理问题的信息,而且我不知所措。
有没有办法让我的代码即使使用负值也能正常工作?