Я пытаюсь составить график 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файлы, поэтому я думаю, что код должен быть в порядке.Проблема должна быть с файлами, которые я использую на этот раз.Я не понимаю ошибку, но я предполагаю, что она относится к отрицательным значениям MDS1 и MDS2 в моем фрейме данных NMDS.
В Интернете я ничего не нашел о том, как справиться с проблемой, и я 'м в недоумении.
Есть ли способ заставить этот код работать даже с отрицательными значениями?