Создайте цикл, который итеративно агрегирует данные для последовательно больших кластеров - PullRequest
0 голосов
/ 20 сентября 2019

Во-первых, данные существ в формате фрейма данных df.Я преобразовал df в вид по матрице заговора mat (полагая, что из этого формата будет легче работать).Виды - это строки, а графики - это столбцы.Клетки представляют частоту, с которой вид был обнаружен на этом участке.

set.seed(3421)
df<-data.frame(plot= as.factor(c(rep(1,4),rep(2,4),rep(3,3),rep(4,2),
                   rep(5,6),rep(6,7))),
           species= sample(letters[1:26], size= 26, replace=TRUE))

library("tidyverse")
df<- 
  df%>%
  group_by(plot, species)%>%
  summarize(freq= length(species))
mat<- dcast(df , species~plot, value.var = "freq", fill=0 )
mat<- matrix(c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,
           2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
           0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
           0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
           0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,
           1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0), nrow=16, ncol=6)
dimnames(mat)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1", "2", "3", "4", "5", "6"))

Я хотел бы создать цикл, который выполняет итерацию по df для создания списка матриц для каждого размера кластера, так что матрица для каждого размера кластера включает в себя несколько уникальных агрегатов графиков.Учитывая мой примерный фрейм данных, размеры кластеров могут варьироваться от агрегации 1 графика до всех 6 графиков вместе взятых.Например, для размера кластера = 1, один график является его собственным кластером, поэтому результаты - это просто частота каждого вида на этом графике.Для кластера размером = 2 кластер определяется как объединение двух графиков.Результаты будут суммой частот для каждого вида на двух агрегированных участках.Аналогично, для кластера размером = 3 кластер определяется как агрегация ТРИ графиков, а результаты представляют собой суммы частот для каждого вида на ТРИ агрегированных графиках.

Для n размеров кластеров графики можно агрегировать i раз, чтобы получить кластер такого размера.Например, в кластере размером 2 мы можем агрегировать: график 1 и график 2, график 2 и график 3, график 5 и график 10.

Я хочу кластеризовать, используя метод движущегося окна.Таким образом, для размера кластера 2 графики будут агрегированы следующим образом: 1 и 2, 2 и 3, 3 и 4, 4 и 5 ..... 11 и 12.

Я полагаю, что способ сделать это состоит в том, чтобы перебрать исходный кадр данных или матрицу и вывести новую матрицу для каждого размера кластера.Ниже я приведу примеры выходных матриц для размеров кластеров 1-3 для приведенного выше примера кадра данных.

Пример выходных матриц для размера кластера 1: Агрегаты 1 участка

mat1<- matrix(c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0), nrow=16, ncol=1)
dimnames(mat1)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))
mat2<- matrix(c(2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0), nrow=16)
dimnames(mat2)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))
mat3<- matrix(c(0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0), nrow=16)
dimnames(mat3)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))
mat4<- matrix(c(0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0), nrow=16)
dimnames(mat4)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))
mat5<- matrix(c(0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1), nrow=16)
dimnames(mat5)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))
mat6<- matrix(c(1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0), nrow=16)
dimnames(mat6)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1"))

Пример выходной матрицы для размера кластера 2: Агрегаты 2 участков

mat7<- matrix( c(3,0,0,0,1,0,1,0,0,0,0,0,0,0,2,0,
             2,0,1,1,2,0,0,0,0,0,0,0,0,0,1,0,
             0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
             0,1,0,0,1,1,0,1,0,1,1,0,0,1,0,1,
             1,1,0,0,1,0,0,1,1,1,2,2,1,1,0,1), nrow=16)
dimnames(mat7)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1_2", "2_3", "3_4", "4_5", "5_6"))

Пример выходной матрицы для размера кластера 3: агрегаты из 3 графиков

mat8<- matrix( c(3,0,1,1,2,0,1,0,0,0,0,0,0,0,3,0,
             2,1,1,1,2,1,0,0,0,0,0,0,0,0,1,0,
             0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,
             1,2,0,0,1,1,0,1,1,1,2,2,1,1,0,1), nrow=16)
dimnames(mat8)<- list(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 
                  c("1_2_3", "2_3_4", "3_4_5", "4_5_6"))

Обратите внимание, что в каждой матрице строки представляют виды, а столбцы "«движущееся окно» кластеров совокупностей графиков для указанного размера кластеров.Я назвал заголовки столбцов соответственно, чтобы указать, какие графики объединяются для достижения этого размера кластера.В идеале цикл также должен указывать эту информацию.Клетки - это частота каждого вида для уникальной совокупности из n участков.Поскольку размер кластера ограничивает количество возможных агрегаций графика, результирующие матрицы будут различаться по длине измерения.

Все матрицы могут быть сохранены в списке.Мне в первую очередь нужна помощь до этого шага.

mat_list<- list(mat1, mat2, mat3, mat4, mat5, mat6, mat7, mat8 )

Дополнительный шаг, который я хотел бы включить в цикл, заключается в применении ряда функций к каждой матрице в списке.Результат для каждой функции можно добавить как новый столбец в матрицу.Функции, которые мне нужно рассчитать для каждой кластерной матрицы:

  1. Рассчитать частоту для каждого вида среди всех агрегатов (т. Е. Итоги строк).

  2. Рассчитать среднюю частоту для каждого вида среди всех агрегатов (т. Е. Общее количество строк / длина строки)

  3. Рассчитать общую площадь для каждого кластераразмер, здесь определяется как произведение размера кластера * pi * 25

  4. Рассчитайте частоту на область.Разделите среднюю частоту / область

Фрейм выходных данных для этих трех кластеров будет выглядеть следующим образом: result_df:

#df for cluster size 1
result_df1<- data.frame(cluster_size= rep("1", 96), 
                    aggregate_ID= c(rep("1",16), rep("2", 16), rep("3", 16), rep("4", 16), rep("5", 16), rep("6",16)), 
                    species= rep(c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"), 6), 
                    freq= c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,
                    2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
                    0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
                    0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
                    0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,
                    1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0), 
mean_freq=c(1,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,
        2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,
        0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
        0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,1,0,0,1,0,1,1,0,0,1,0,1,
        1,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0),
area= rep(78.54, 96))
result_df1$freq_per_area<- result_df1$mean_freq/78.54               

#df for cluster size 2                                          
result_df2<- data.frame( cluster_size= rep("2",80), 
                     aggregate_ID= c(rep("1_2",16), rep("2_3",16), rep("3_4",16), rep("4_5",16), rep("5_6",16)),
                     species= c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"),
                     freq=c(6,3,2,2,6,2,1,2,1,2,3,2,1,2,3,2),
                     mean_freq=(c(6,3,2,2,6,2,1,2,1,2,3,2,1,2,3,2)/5), 
                     area= rep(157.08, 16))
result_df2$freq_per_area<- result_df2$mean_freq/157.08              

#df for cluster size 3
result_df3<- data.frame( cluster_size= rep("3",64), 
                     aggregate_ID= c(rep("1_2_3",16), rep("2_3_4",16), rep("3_4_5",16), rep("4_5_6",16)),
                     species= c("a", "c", "f", "h", "i", "j", "l", "m", "p", "q", "s", "t", "u", "v","x", "z"),
                     freq=c(6,4,3,3,7,3,1,2,1,2,3,2,1,2,4,2),
                     mean_freq=(c(6,4,3,3,7,3,1,2,1,2,3,2,1,2,4,2)/5), 
                     area= rep(157.08, 16))
 result_df3$freq_per_area<- result_df3$mean_freq/235.62

 result_df<- rbind(result_df1,result_df2,result_df3) 

Обратите внимание, что result_df включает результаты дляразмер кластера до трех, но для этого примера размеры кластеров фрейма данных будут большими как 6, поэтому цикл должен будет повторяться до максимального размера кластера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...