## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 4) library(simOutrank) ## ----base--------------------------------------------------------------------- traces <- as_traces(illustrative_log, "case_id", "activity", "timestamp") criteria <- function(activity_sim = 0.8, activity_indiff = 0.7, w_activity = 0.2) { list( crit_activity_profile(weight = w_activity, indifference = activity_indiff, similarity = activity_sim, veto = 0.4), crit_edit_distance(weight = 0.2, similarity = 2, indifference = 3, veto = 6), crit_nominal("status", weight = 0.3), crit_nominal("satisfaction", weight = 0.3) ) } ## ----rand--------------------------------------------------------------------- rand_index <- function(a, b) { agree <- 0L; n <- length(a) for (i in seq_len(n - 1L)) for (j in (i + 1L):n) { agree <- agree + ((a[i] == a[j]) == (b[i] == b[j])) } agree / choose(n, 2) } baseline <- cluster_traces(outrank_similarity(traces, criteria()), k = 4, seed = 42)$memberships ## ----quantile----------------------------------------------------------------- crit_fixed <- crit_activity_profile(0.2, indifference = 0.7, similarity = 0.8) crit_quantile <- crit_activity_profile(0.2, indifference = as_quantile(0.5), similarity = as_quantile(0.8)) crit_quantile ## ----threshold-sweep---------------------------------------------------------- grid <- seq(0.75, 0.95, by = 0.05) # kept above the indifference of 0.70 sens <- t(vapply(grid, function(s) { sim <- outrank_similarity(traces, criteria(activity_sim = s)) memb <- cluster_traces(sim, k = 4, seed = 42)$memberships c(mean_S = mean(sim$S[upper.tri(sim$S)]), rand = rand_index(memb, baseline)) }, numeric(2))) data.frame(similarity = grid, sens) ## ----weight-sweep------------------------------------------------------------- weights <- c(0.05, 0.2, 0.5, 1) w_sens <- vapply(weights, function(w) { sim <- suppressMessages(outrank_similarity(traces, criteria(w_activity = w))) rand_index(cluster_traces(sim, k = 4, seed = 42)$memberships, baseline) }, numeric(1)) data.frame(w_activity = weights, rand = w_sens) ## ----eigengap----------------------------------------------------------------- sim <- outrank_similarity(traces, criteria()) gaps <- eigengap(sim, k_max = 8) gaps[which.max(gaps$gap), ] ## ----kvalidity---------------------------------------------------------------- if (requireNamespace("clValid", quietly = TRUE)) { t(vapply(2:6, function(k) { cl <- cluster_traces(sim, k = k, seed = 42) c(k = k, validate_clusters(cl)) }, numeric(3))) }