Пустой фрейм данных при вычислении данных эллипса с помощью обычного веганского слова для ggplot

Я пытаюсь сгруппировать точки данных NMDS в ggplot, добавив эллипсы, используя ordiellipse Следуйте полезному совету из этого поста. Однако, хотя я не получаю никаких сообщений об ошибках или предупреждений, вычисление данных эллипса создает пустой фрейм данных. Набор данных доступен здесь, и мой код выглядит следующим образом:

library(vegan)
library(ggplot2)

setwd("C:")
veg_matrix <- read.csv("161019_vegetation_matrix.csv",header=T); veg_matrix[2:123] <- lapply(veg_matrix[2:123],as.character); veg_matrix[2:123] <- lapply(veg_matrix[2:123],as.numeric)
rownames(veg_matrix) <- veg_matrix[,1]; veg_matrix <- veg_matrix[,-1] # remove non-numeric rownames (=plot codes) from dataset
speciescomp_NMDS = metaMDS(veg_matrix, k=2, trymax=100, distance="raup", na.rm=T)
plot(speciescomp_NMDS,display="sites",type="n")

# add grouping data
plot_scores <- as.data.frame(scores(speciescomp_NMDS))
plot_scores$plot <- rownames(plot_scores);plot_scores <- cbind(plot_scores,data.frame(matrix(unlist(strsplit(plot_scores$plot,"_")),nrow=24,byrow=T)))[,-3]; colnames(plot_scores)[c(3,4)] <- c("summit","aspect")
plot_scores$group <- ""
plot_scores$group[plot_scores$summit=="BUF"|plot_scores$summit=="SES"] <- "low"
plot_scores$group[plot_scores$summit=="CHA"|plot_scores$summit=="MIN"] <- "intermediate"
plot_scores$group[plot_scores$summit=="CUO"|plot_scores$summit=="GAJ"] <- "high"
plot_scores$group <- transform(plot_scores, as.factor(plot_scores$group))

# compute ellipse data
ord <- ordiellipse(speciescomp_NMDS,plot_scores$group,display = "sites", kind = "sd", conf = .95, label=T)

f_ellipse <- 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_level <- data.frame()
for(g in levels(plot_scores$group)){
  if(is.null(ord[[g]])) next
  df_ell_level <- rbind(df_ell_level,
                  cbind(as.data.frame(with(plot_scores[plot_scores$group==g,],
                                           f_ellipse(ord[[g]]$cov,ord[[g]]$center,ord[[g]]$scale)))
                        ,level=group))
}

Любые идеи о том, как справиться с этим, будут тепло оценены!

1 ответ

Решение

Первый конвертировать group к фактору

plot_scores <- transform(plot_scores, group = as.factor(group))

Если мы теперь исправим ваш цикл так:

df_ell_level <- data.frame()
for(g in levels(plot_scores$group)){
  if(is.null(ord[[g]])) next
  df_ell_level <- 
    rbind(df_ell_level,
          cbind(as.data.frame(f_ellipse(ord[[g]]$cov, ord[[g]]$center, ord[[g]]$scale)),
                level=g)
         )
}

Затем я получаю фрейм данных с 301 строк. Но я вырезал много вашего ненужного кода из звонка, и вы действительно не хотите быть rbind()кадры данных вместе в цикле, как это.

Другие вопросы по тегам