ТраМинеР: Могу ли я получить полную последовательность, если я дам подпоследовательность события?

#r #traminer

#r #traminer

Вопрос:

У меня есть набор данных последовательности, как показано ниже:

 customerid    flag  0   1   2   3   4   5   6   7   8   9   10  11
abc234          1   3   4   3   4   5   8   4   3   3   2   14  14
abc233          0   4   4   4   4   4   4   4   4   4   4   4   4
qpr81           0   9   8   7   8   8   7   8   8   7   8   8   7
qnr94           0   14  14  14  2   14  14  14  14  14  14  14  14
  

Значения в столбце 0 to 11 — это последовательности. Есть два набора клиентов с флагом = 1 и флагом = 0, у меня есть различные последовательности событий для обоих наборов. (Здесь показаны только частоты и остатки для 2 групп)

 Subsequence Freq.0      Freq.1     Resid.0       Resid.1
(3>4)       0.19208177  0.0753386   5.540793    -21.43304
(4>5)       0.15752553  0.059960497 5.115241    -19.78691
(5>4)       0.15950556  0.062782167 5.037413    -19.48586
  

Я хочу найти идентификаторы клиентов и флаги, для которых совпадают последовательности событий.

Должен ли я написать скрипт на python для обхода транзакций или есть какой-то прямой метод в R для этого?

`

 CODE
--------------

library(TraMineR)

custid=c(a1,a2,a3,b4,b5,c6,c7,d8,d9)#sample customer ids
flag=c(0,0,0,1,0,1,1,0,1)#flag
col1=c(14,14,14,14,14,5,14,14,2)
col2=c(14,14,3,14,3,14,6,3,3)
col3=c(14,2,2,14,2,14,2,2,2)
col4=c(14,2,2,14,2,14,2,2,14)
df=data.frame(custid,flag,col1,col2,col3,col4)#dataframe generation
print(df)
#Defining sequence from col1 to col4
df.s<-seqdef(df,3:6)
print(df.s)
#finding the transitions
transition<-seqetm(df.s,method='transition')
print(transition)
#converting to TSE format
df.tse=seqformat(df.s,from='SPS',to='TSE',tevent = transition)
print(df.tse)
#Event sequence generation
df.seqe=seqecreate(id=df.tse$id,timestamp=df.tse$time,event=df.tse$event)
print(df.seqe)
#subsequences
fsubseq <- seqefsub(df.seqe, pMinSupport = 0.01)
print(fsubseq)
groups <- factor(df$flag>0,labels=c(1,0))
#finding differentiating event sequences based on flag using ChiSquare test
diff <- seqecmpgroup(fsubseq, group = df$flag, method = "chisq")

#Using seqeapplysub for finding the presence of subsequences?
presence=seqeapplysub(fsubseq,method="presence")
print(presence[1:3,3:1])
  

`

Спасибо

Ответ №1:

Насколько я понимаю, у вас есть последовательности состояний, и вы преобразовали их в последовательности событий, используя seqecreate функцию TraMineR . События, которые вы рассматриваете, — это изменения состояния. Таким образом, (3>4) означает подпоследовательность только с одним событием, а именно событие 3>4 (переключение с 3 на 4). Затем вы определяете подпоследовательности событий, которые наилучшим образом различают ваши два флага, используя функции seqefsub и seqecmpgroup .

Если это правильно, то вы можете идентифицировать последовательности, содержащие каждую подпоследовательность, с помощью seqeapplysub функции. Я не могу проиллюстрировать здесь, потому что вы не предоставили никакого кода в своем вопросе. Посмотрите онлайн-справку по seqeapplysub функции.

======= обновление, относящееся к добавленному вами коду =======

Вот как вы получаете идентификаторы последовательностей, которые содержат наиболее различимую подпоследовательность.

Сначала мы извлекаем первые три наиболее различимые последовательности из вашего diff объекта. Во-вторых, мы вычисляем presence матрицу, которая предоставляет столбец для каждой извлеченной подпоследовательности с 1 в отношении последовательностей, содержащих подпоследовательность, и 0 в противном случае.

 diffseq <- seqefsub(df.seqe, strsubseq = paste(diff$subseq[1:3]))
(presence=seqeapplysub(diffseq, method="presence"))
  

Теперь вы получаете идентификаторы для первой подпоследовательности с

 custid[presence[,1]==1]
  

Для второго это было бы custid[presence[,2]==1] и т.д.

Аналогично вы получаете флаг с

 flag[presence[,1]==1]
  

Надеюсь, это поможет.

Комментарии:

1. Спасибо, Гилберт! Я посмотрел на seqeapplysub функцию. Для меня важнее получить идентификатор клиента и флаг. Я смотрю на index поле, заданное seqecmpgroup методом. Кстати, я добавил код.