Цикл по набору данных для расчета диверсий - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть такой набор данных:

 set.seed(1345)
 df<-data.frame(month= c(rep(1,10), rep(2, 10), rep(3, 10)), 
           species=sample(LETTERS[1:10], 30, replace= TRUE))

Я хотел бы просмотреть каждый месяц и рассчитать разнообразие видов.Мне известны такие функции, как diversity в library("vegan"), и я знаю решения моего вопроса, используя этот маршрут (код приведен ниже), но в качестве упражнения для себя с циклами я пытаюсь создать for loop или функцию, которая показываетконкретные расчеты для разнообразия Шеннона и Симпсона, так что расчеты для каждого индекса не являются загадочными.Они рассчитываются по следующим формулам:

enter image description here

До сих пор я пробовал следующее для Симпсонов:

df <- 
 df %>% 
  group_by(month, species) %>% 
  summarise(freq = n()) 

div<-NA
 for (i in length(unique(df$month))) {
 sum<- sum(df$freq)
 for (i in unique (df$freq)){
 p<- df$freq /sum
 p.sqrd<-p*p
 div[i]<-1/sum(p.sqrd)
   }}

Иследующие для Шеннона:

df <- 
 df %>% 
  group_by(month, species) %>% 
  summarise(freq = n()) 

div<-NA
 for (i in length(unique(df$month))) {
 sum<- sum(df$freq)
 for (i in unique (df$freq)){
 p<- df$freq /sum
 log.p<-ln(p)
 div[i]<- sum(p[i]*ln(p[i]))
   }}

Я не создаю успешный цикл и хотел бы помочь правильно проиндексировать этот цикл и создать наиболее эффективный (т.е. включающий df <- df %>% group_by(month, species) %>% summarise(freq = n()) в цикл) и цикл for, которыйчетко иллюстрирует уравнение в цикле.

Используя функцию diversity, вы найдете ответы для разнообразия Симпсона:

library("tidyverse")
df <- 
 df %>% 
 group_by(month, species) %>% 
 summarise(freq = n()) 

# Cast dataframe of interaction frequencies into a matrix
library("reshape2")
ph_mat<- dcast(df,  month~ species)
ph_mat[is.na(ph_mat)] <- 0 #changes 

library("vegan")
df<- data.frame(div=diversity(ph_mat, index="simpson"), 
               month=unique(ph_mat$month))

А для Шеннона:

library("vegan")
df<- data.frame(div=diversity(ph_mat, index="shannon"), 
               month=unique(ph_mat$month))

1 Ответ

0 голосов
/ 29 ноября 2018

У меня есть решение, которое не включает циклы, но где я определяю и объясняю функцию для расчета каждого индекса (не загадка!). Она рассчитывает каждую метрику разнесения для каждого месяца.Он использует функции group_by() и summarize() из dplyr.

set.seed(1345)
df<-data.frame(month= c(rep(1,10), rep(2, 10), rep(3, 10)), 
               species=sample(LETTERS[1:10], 30, replace= TRUE))

calc_shannon <- function(community) {
  p <- table(community)/length(community) # Find proportions
  p <- p[p > 0] # Get rid of zero proportions (log zero is undefined)
  -sum(p * log(p)) # Calculate index
}

calc_simpson <- function(community) {
  p <- table(community)/length(community) # Find proportions
  1 / sum(p^2) # Calculate index
}

diversity_metrics <- 
  df %>% 
  group_by(month) %>% 
  summarize(shannon = calc_shannon(species),
            simpson = calc_simpson(species))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...