Подсчет совпадений по подмножеству членства и длины группового алфавита
Есть ли способ в R для подсчета шаблонов одновременного появления состояний в последовательностях, т. Е. Для работы с группами, где порядок элементов не обязательно важен? Цель состоит в том, чтобы выяснить, насколько часто встречаются более крупные подгруппы в еще более длинных группах.
Например, набор входных данных будет выглядеть примерно так ("реальные" последовательности данных будут иметь ширину до ~10 столбцов и глубину до 1000 с) ...
a,b,c,d
b,c,d,a
c,d,b,a
a,b,c,d,e
b,c,d,a,e
a,b,c
...
и результат, возможно, покажет...
abcd, abcd*
как набор или класс, с подсчетом, указывающим количество вхождений, например, * указывает на подмножество или категорию "членство в другом месте" и балл на основе length()
,
Результаты также показали бы...
abcde
как другой и немного более редкий набор или класс, с более высоким счетом, отражающим более длинный length()
,
И наконец...
abc*
будет иметь более высокий счет, но ниже length()
Гол.
Нечто подобное Traminer, которое работает с неупорядоченными (неупорядоченными?) Группами, было бы превосходно. Я отмечаю, что могут быть проблемы с вычислительной нагрузкой, но я учту это (то есть какой-то порог тривиальности), если мне нужно порезаться, когда пишу программу.
1 ответ
Вот функция, которая сортирует в алфавитном порядке элементы в каждой последовательности, а затем извлекает последовательные различные состояния отсортированных последовательностей.
dssort <- function(seqdata){
ssort <- t(apply(seqdata, MARGIN=1, sort))
ssort.seq <- seqdef(ssort, states=alphabet(seqdata), labels=stlab(seqdata))
sdss <- seqdef(seqdss(ssort.seq), missing="%")
sdss
}
Используя результат этой функции, вы можете получить частоты различных наборов элементов, которые образуют последовательности. Например, с
library(TraMineR)
data(mvad)
shortlab <- c("EM", "FE", "HE", "JL", "SC", "TR")
mvad.seq <- seqdef(mvad[,17:86], states=shortlab)
set <- dssort(mvad.seq)
seqtab(set, tlim=1:3)
ты получаешь
Freq Percent
EM/1-FE/1 94 13
EM/1-TR/1 84 12
EM/1-JL/1-TR/1 57 8
Итак, вы знаете, что 94 последовательности содержат элементы FE
а также EM
и только эти двое, 84 имеют EM
а также TR
и нет другого государства, и 57 имеют EM
, JL
а также TR
,
Вы также можете построить частые наборы с seqfplot(set)
,
Не уверен, что это то, что вы ищете, но надеюсь, что это поможет.
====
Вот как можно избавиться от бесполезного "/1"
tf <- seqtab(set, tlim=1:3, format="STS")
t <- attr(tf,"freq")
rownames(t) <- gsub("-\\*","",rownames(t))
t
это дает
Freq Percent
EM-FE 94 13.202247
EM-TR 84 11.797753
EM-JL-TR 57 8.005618