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
в 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]
Надеюсь это поможет.