This vignette demonstrates complete workflows for Temporal Network Analysis using Saqrlab and the tna package. We cover:
# Generate sequences with metacognitive learning states
sequences <- simulate_sequences(
n_sequences = 200,
seq_length = 25,
n_states = 6,
categories = c("metacognitive", "cognitive"),
seed = 42
)
head(sequences)
#> V1 V2 V3 V4 V5 V6 V7 V8
#> 1 Plan Reason Judge Process Memorize Process Plan Reason
#> 2 Retrieve Retrieve Memorize Process Plan Process Process Process
#> 3 Plan Plan Memorize Reason Plan Judge Reason Judge
#> 4 Memorize Judge Reason Judge Reason Plan Plan Process
#> 5 Retrieve Memorize Retrieve Memorize Retrieve Memorize Retrieve Memorize
#> 6 Process Process Judge Reason Process Process Judge Reason
#> V9 V10 V11 V12 V13 V14 V15 V16
#> 1 Retrieve Judge Retrieve Memorize Reason Reason Judge Reason
#> 2 Plan Reason Reason Reason Judge Reason Judge Reason
#> 3 Process Plan Judge Retrieve Memorize Retrieve Memorize Reason
#> 4 Process Judge Process Process Process Judge Retrieve Judge
#> 5 Memorize Reason Judge Retrieve Judge Reason Judge Reason
#> 6 Reason Process Process Process Memorize Process Process Memorize
#> V17 V18 V19 V20 V21 V22 V23 V24 V25
#> 1 Judge Process Plan Memorize Retrieve Reason Judge Reason Process
#> 2 Judge Reason Judge Process Judge Reason Judge Reason Judge
#> 3 Judge Reason Judge Reason Reason Judge Process Plan Judge
#> 4 Reason Reason Retrieve Judge Reason Reason Plan Process Plan
#> 5 Judge Reason Reason Judge Reason Judge Reason Plan Process
#> 6 Retrieve Reason Retrieve Memorize Reason Judge Reason Retrieve Memorize
dim(sequences)
#> [1] 200 25Saqrlab supports multiple TNA model variants:
| Model | Description |
|---|---|
tna |
Standard Temporal Network Analysis |
ftna |
Filtered TNA (removes weak edges) |
ctna |
Conditional TNA (time-varying) |
atna |
Aggregated TNA |
# Generate sequences
sequences <- simulate_sequences(
n_sequences = 200,
seq_length = 30,
n_states = 6,
seed = 42
)
# Fit all model types
models <- list(
tna = fit_network_model(sequences, "tna"),
ftna = fit_network_model(sequences, "ftna"),
ctna = fit_network_model(sequences, "ctna"),
atna = fit_network_model(sequences, "atna")
)# Compare each model to TNA as reference
ref_model <- models$tna
comparisons <- lapply(names(models)[-1], function(m) {
comp <- compare_networks(ref_model, models[[m]])
data.frame(
model = m,
correlation = comp$metrics$correlation,
rmse = comp$metrics$rmse,
edge_diff = comp$metrics$edge_diff
)
})
do.call(rbind, comparisons)compare_networks()Compare two networks with multiple metrics:
# Generate two different networks
net1 <- simulate_tna_networks(1, n_states = 6, n_sequences = 150, seed = 42)
net2 <- simulate_tna_networks(1, n_states = 6, n_sequences = 150, seed = 123)
# Compare
comparison <- compare_networks(
model1 = net1$network_1$model,
model2 = net2$network_1$model,
metrics = c("correlation", "rmse", "mae", "edge_diff", "cosine"),
scaling = "none",
include_self = TRUE,
threshold = 0.05
)
# View metrics
comparison$metrics
# View edge-level comparison
head(comparison$edge_comparison)
# Print summary
cat(comparison$summary)compare_centralities()Compare centrality profiles between networks:
compare_edge_recovery()Evaluate edge recovery performance:
recovery <- compare_edge_recovery(
original = net1$network_1$model,
simulated = net2$network_1$model,
threshold = 0.05,
return_edges = TRUE
)
# Classification metrics
cat("Precision:", recovery$precision, "\n")
cat("Recall:", recovery$recall, "\n")
cat("F1 Score:", recovery$f1_score, "\n")
cat("Accuracy:", recovery$accuracy, "\n")
# Confusion matrix
cat("\nConfusion Matrix:\n")
cat("TP:", recovery$true_positives, "\n")
cat("FP:", recovery$false_positives, "\n")
cat("FN:", recovery$false_negatives, "\n")
cat("TN:", recovery$true_negatives, "\n")Process multiple datasets efficiently:
# Generate 20 datasets
datasets <- lapply(1:20, function(i) {
simulate_sequences(
n_sequences = 100,
seq_length = 20,
n_states = 5,
seed = i
)
})
# Fit models in parallel
models <- batch_fit_models(
data_list = datasets,
model_type = "tna",
parallel = TRUE,
cores = 4,
progress = TRUE
)
length(models)# Extract all transition matrices
trans_matrices <- batch_apply(
object_list = models,
fun = extract_transition_matrix,
parallel = TRUE
)
# Get network densities
densities <- batch_apply(
models,
function(m) {
mat <- extract_transition_matrix(m)
sum(mat > 0.05) / length(mat)
},
simplify = TRUE
)
summary(densities)# Summarize multiple network models
network_summary <- summarize_networks(
model_list = models,
include = c("density", "centrality", "edges"),
threshold = 0.01,
centrality_measures = c("OutStrength", "InStrength")
)
# Per-network statistics
network_summary$summary_table
# Aggregate statistics
network_summary$aggregateThis example simulates a complete study of network recovery across sample sizes:
library(Saqrlab)
library(tna)
# 1. Create ground truth network
true_probs <- generate_probabilities(n_states = 5, seed = 42)
# 2. Test different sample sizes
sample_sizes <- c(25, 50, 100, 200, 500)
results <- list()
for (n in sample_sizes) {
# Run 20 replications
replications <- lapply(1:20, function(rep) {
# Generate sequences from true parameters
seqs <- simulate_sequences(
trans_matrix = true_probs$transition_matrix,
init_probs = true_probs$initial_probs,
n_sequences = n,
seq_length = 25,
seed = rep * 1000 + n
)
# Fit model
model <- fit_network_model(seqs, "tna")
# Compare to true matrix
estimated_mat <- extract_transition_matrix(model, type = "scaled")
cor(as.vector(true_probs$transition_matrix), as.vector(estimated_mat))
})
results[[as.character(n)]] <- unlist(replications)
}
# 3. Summarize
summary_df <- data.frame(
sample_size = sample_sizes,
mean_correlation = sapply(results, mean),
sd_correlation = sapply(results, sd)
)
print(summary_df)generate_probabilities() to create ground truthparallel = TRUE in batch functionsinclude_params = TRUE when simulating| Workflow | Key Functions |
|---|---|
| Basic TNA | simulate_sequences(), fit_network_model(),
extract_*() |
| Model comparison | fit_network_model() with different types |
| Network metrics | compare_networks(),
compare_centralities() |
| Batch processing | batch_fit_models(), batch_apply() |
| Grid simulation | generate_param_grid(),
run_grid_simulation() |
| Summarizing | summarize_simulation(),
summarize_networks() |