Подсчет совпадений по подмножеству членства и длины группового алфавита

Есть ли способ в 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
Другие вопросы по тегам