Как определить последовательности внутри каждого кластера?
Использование набора данных biofam, входящего в состав TraMineR
:
library(TraMineR)
data(biofam)
lab <- c("P","L","M","LM","C","LC","LMC","D")
biofam.seq <- seqdef(biofam[,10:25], states=lab)
head(biofam.seq)
Sequence
1167 P-P-P-P-P-P-P-P-P-LM-LMC-LMC-LMC-LMC-LMC-LMC
514 P-L-L-L-L-L-L-L-L-L-L-LM-LMC-LMC-LMC-LMC
1013 P-P-P-P-P-P-P-L-L-L-L-L-LM-LMC-LMC-LMC
275 P-P-P-P-P-L-L-L-L-L-L-L-L-L-L-L
2580 P-P-P-P-P-L-L-L-L-L-L-L-L-LMC-LMC-LMC
773 P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P
Я могу выполнить кластерный анализ:
library(cluster)
couts <- seqsubm(biofam.seq, method = "TRATE")
biofam.om <- seqdist(biofam.seq, method = "OM", indel = 3, sm = couts)
clusterward <- agnes(biofam.om, diss = TRUE, method = "ward")
cluster3 <- cutree(clusterward, k = 3)
cluster3 <- factor(cluster3, labels = c("Type 1", "Type 2", "Type 3"))
Однако в этом процессе уникальный идентификатор от biofam.seq были заменены списком чисел от 1 до N:
head(cluster3, 10)
[1] Type 1 Type 2 Type 2 Type 2 Type 2 Type 3 Type 3 Type 2 Type 1
[10] Type 2
Levels: Type 1 Type 2 Type 3
Теперь я хочу знать, какие последовательности находятся внутри каждого кластера,чтобы я мог применить другие функции для получения средней длины, энтропии, подпоследовательности, несходства и т. д. внутри каждого кластера. Что мне нужно сделать, так это:
- карта старого идентификаторы для новых идентификаторов
- вставьте последовательности в каждом кластере в отдельные объекты последовательности
- запустите статистику, которую я хочу для каждого из новых объектов последовательности
Как я могу выполнить 2 и 3 в приведенном выше списке?
2 ответа:
Объект последовательности состояний для первого кластера, например, можно просто получить с помощью
bio1.seq <- biofam.seq[cluster3=="Type 1",] summary(bio1.seq)
Я думаю, что это ответит на ваши вопросы. Я использовал код, который нашел здесь http://www.bristol.ac.uk/cmm/software/support/workshops/materials/solutions-to-r.pdf чтобы создать
biofam.seq
, поскольку ни одно из того, что вы предлагали, не работало на меня.# create data library(TraMineR) data(biofam) bf.states <- c("Parent", "Left", "Married", "Left/Married", "Child", "Left/Child", "Left/Married/Child", "Divorced") bf.shortlab <- c("P","L","M","LM","C","LC", "LMC", "D") biofam.seq <- seqdef(biofam[, 10:25], states = bf.shortlab, labels = bf.states) # cluster library(cluster) couts <- seqsubm(biofam.seq, method = "TRATE") biofam.om <- seqdist(biofam.seq, method = "OM", indel = 3, sm = couts) clusterward <- agnes(biofam.om, diss = TRUE, method = "ward") cluster3 <- cutree(clusterward, k = 3) cluster3 <- factor(cluster3, labels = c("Type 1", "Type 2", "Type 3"))
Сначала я использую
split
для создания списка индексов для каждого кластера, который затем я использую в циклеlapply
для создания списка под-последовательностей изbiofam.seq
:# create a list of sequences idx.list <- split(seq_len(nrow(biofam)), cluster3) seq.list <- lapply(idx.list, function(idx)biofam.seq[idx, ])
Наконец, вы можете запустить аналитику для каждой подпоследовательности с помощью
lapply
илиsapply
# compute statistics on each sub-sequence (just an example) cluster.sizes <- sapply(seq.list, FUN = nrow)
Где
FUN
может быть любая функция, которую вы обычно запускаете на одной последовательности.