====== Transforming event sequence into network ======
25. november 2023
===== Reading =====
Event sequence is described in a CSV file. It starts with a header line. Each other line contains a quadruple (ID, s, f, S): ID - actor ID, s - starting time, f - finishing time, S - state (category). s and f determine the time interval [s,f).
[[https://raw.githubusercontent.com/bavla/TQ/master/trajectories/test/tra1.csv|tra1.csv]]
> wdir <- "C:/Users/vlado/docs/papers/2024/Trajectories/test"
> setwd(wdir)
> E <- read.csv("https://raw.githubusercontent.com/bavla/TQ/master/trajectories/test/tra1.csv",sep="")
> E
ID s f S
1 ab 1 5 P
2 ab 1 7 K
3 ab 5 10 Q
4 ab 5 11 M
5 cd 2 12 Q
6 cd 1 3 M
7 cd 9 11 P
8 ef 5 9 K
9 ef 2 7 Q
10 ef 7 12 P
11 ef 1 4 M
12 ef 9 12 K
13 gh 3 5 P
14 gh 5 8 M
===== Transforming =====
To speed up the transformation of longer sequences we reorder the data in lexicographic order of intervals.
> I <- order(E$s,E$f)
> E[I,]
ID s f S
6 cd 1 3 M
11 ef 1 4 M
1 ab 1 5 P
2 ab 1 7 K
9 ef 2 7 Q
5 cd 2 12 Q
13 gh 3 5 P
14 gh 5 8 M
8 ef 5 9 K
3 ab 5 10 Q
4 ab 5 11 M
10 ef 7 12 P
7 cd 9 11 P
12 ef 9 12 K
A test code with trace.
> n <- length(I); k <- 0
> for(p in 1:(n-1)){i <- I[p]; tm <- E$f[i]
+ for(q in (p+1):n){j <- I[q]; k <- k+1
+ if(E$s[j]>tm) break
+ if(E$S[i]==E$S[j]){
+ fm <- min(E$f[i],E$f[j]); sM <- max(E$s[i],E$s[j]); T <- fm - sM
+ if(T>0) cat(format(c(k,p,q,E$ID[i],E$ID[j],sM,fm,T,E$S[i]),width=3),"\n")
+ }
+ }
+ }
1 1 2 cd ef 1 3 2 M
17 3 7 ab gh 3 5 2 P
27 4 9 ab ef 5 7 2 K
32 5 6 ef cd 2 7 5 Q
36 5 10 ef ab 5 7 2 Q
43 6 10 cd ab 5 10 5 Q
55 8 11 gh ab 5 8 3 M
70 12 13 ef cd 9 11 2 P
===== Creating Pajek network file =====
> source("https://raw.githubusercontent.com/bavla/Rnet/master/R/Pajek.R")
> n <- length(I); k <- 0; N <- data.frame(stringsAsFactors=FALSE)
> for(p in 1:(n-1)){i <- I[p]; tm <- E$f[i]
+ for(q in (p+1):n){j <- I[q]; k <- k+1
+ if(E$s[j]>tm) break
+ if(E$S[i]==E$S[j]){
+ fm <- min(E$f[i],E$f[j]); sM <- max(E$s[i],E$s[j]); T <- fm - sM
+ if(T>0) N <- rbind(N,list(u=E$ID[i],v=E$ID[j],s=sM,f=fm,rel=E$S[i]))
+ }
+ }
+ }
> cat("density =",2*k/n/(n-1),"\n")
density = 0.7912088
> N
u v s f rel
1 cd ef 1 3 M
2 ab gh 3 5 P
3 ab ef 5 7 K
4 ef cd 2 7 Q
5 ef ab 5 7 Q
6 cd ab 5 10 Q
7 gh ab 5 8 M
8 ef cd 9 11 P
> sf <- as.matrix(N[,c("s","f")])
> uvrwt2net(N$u,N$v,w=N$f-N$s,r=N$rel,t=sf,directed=FALSE,Net="tra1.net")
[[https://github.com/bavla/TQ/blob/master/trajectories/test/tra1.net|tra1.net]]
{{https://github.com/bavla/TQ/blob/master/trajectories/test/tra1.svg}}
===== Visualization in Pajek =====
In Pajek
[Draw] Options/Colors/Arcs/Relation number
[Draw] Options/Colors/Edges/Relation number
[Draw] Export/2D/SVG/Multiple relations network