JTNA v1.7.1 — a step-by-step, point-and-click walkthrough of the JTNA jamovi module.
Scope. Every conceptual explanation in this tutorial
is drawn from the reference R-package tutorial: Saqr, M., &
López-Pernas, S. (2026). An Updated Comprehensive Tutorial on
Transition Network Analysis (TNA) — sonsoleslp.github.io/posts/tna-tutorial.
JTNA is a jamovi wrapper for the tna R package (Tikka,
López-Pernas, & Saqr, 2025), so the behaviour of each analysis
option is the behaviour described in that tutorial. Where JTNA exposes
features that fall outside that tutorial’s scope (for example Group TNA
comparisons or sequence clustering), we describe what each control does
at the widget level and point you to the dedicated companion tutorials —
tna-group and tna-clustering —
rather than attempting to re-explain those methods here.
How this tutorial is laid out. Each top-level section is collapsible — click its heading, or use the Expand / Collapse all pill at the bottom-right, to hide sections you don’t need. The floating table of contents on the left keeps you oriented; clicking a TOC entry scrolls to and opens the target section automatically.
Transition Network Analysis (TNA) is a framework for modelling sequential processes as weighted directed networks. It combines the temporal resolution of stochastic process mining with the structural analytic capacity of graph theory (Saqr, López-Pernas, Törmänen, et al., 2025). The framework supports several model types — first-order Markov models, frequency-based transition models, co-occurrence models, and attention-based models — each suited to different data characteristics and research questions.
What distinguishes TNA from earlier approaches to sequential and process data is that every level of analysis is subject to confirmatory testing:
In the network, nodes are the unique states or actions, arrows are the transitions from one state to another (thicker arrows = higher transition probability), and the coloured rim around each node shows the initial probability of starting in that state.
The framework is implemented in the tna R package
(Tikka, López-Pernas, & Saqr, 2025), with companion interfaces in
jamovi (this module, JTNA) and a Shiny web application.
Download jamovi from jamovi.org and install it for your operating system.
Option A — jamovi library (recommended):
Option B — sideload the .jmo file:
JTNA_1.7.1.jmo from the JTNA GitHub
repository..jmo file.Throughout this tutorial we use the bundled Regulation_long dataset, a long-format event log of coded collaborative-regulation behaviours.
| Property | Value |
|---|---|
| Rows | 13,767 events |
| Actors | 2,000 individuals |
| Actions (9 states) | adapt, cohesion, consensus, coregulate, discuss, emotion, monitor, plan, synthesis |
| Groups (3) | A, B, C |
| Columns | Actor, Achievers (High/Low),
Group (A/B/C), Time_Posix,
Action, Time_Unix |
Each row is one event: one actor performed one action at one time.
The data is already in long format — exactly the shape
JTNA (and the underlying prepare_data() function)
expects.
Open Analyses → JTNA → TNA.
The left-hand options panel is organised top-to-bottom into the following sections, which this tutorial walks through in order:
━━ Network Analysis ━━ — Visualization Settings,
Centrality Analysis, Edge Betweenness, Community Detection, Clique
Analysis━━ Confirmatory Testing ━━ — Bootstrap Analysis,
Centrality Stability━━ Sequence Analysis ━━ — Sequence Analysis, Pattern
Discovery, Sequence IndicesThe variable supplier at the top has four target slots.
| Slot | Column to drag in | Notes |
|---|---|---|
| Action | Action |
Required. Each unique value becomes a node in the network. |
| Actor | Actor |
Optional but strongly recommended — it tells JTNA to build one sequence per person. Without it the function treats the whole data frame as one long sequence, chaining actor A’s last event directly into actor B’s first event, which makes no substantive sense. |
| Time | Time_Unix |
Optional. Within each actor, events are sorted by timestamp; also, two consecutive events from the same actor more than 15 minutes apart (the default) are treated as belonging to different sequences. |
| Order | (leave empty) | Optional. Use this instead of Time when you only have a step counter, not a timestamp. If both are supplied, Time sorts first and Order breaks ties. |
Any column in the data that is not assigned to one of these slots
(for example Achievers, Group) is preserved as
metadata and is available later as a grouping variable in Group TNA.
Drag Action → Action, Actor → Actor, Time_Unix → Time.
As soon as Action is assigned, JTNA builds the model and starts producing output on the right.
| Option | Description |
|---|---|
| Relative (default) | First-order Markov transition-probability model (default). Rows of
the transition matrix sum to 1; each cell [i, j] is the
probability of transitioning from state i to state
j. |
| Frequency | Frequency-based transition model (raw counts) |
| Attention | Attention-based model. The decay rate is controlled by the Lambda field (only enabled when Attention is selected). |
When ticked, JTNA shows the full transition matrix. Each cell
[i, j] is the probability of transitioning from state
i to state j, and rows sum to 1.
Four options: No Scaling (default), MinMax,
Max, Rank. We recommend leaving this at No Scaling. See
the tna R-package documentation if you need to apply a
non-default scaling.
This is the session-splitting threshold in seconds —
the time_threshold argument of prepare_data()
in the reference tutorial. Its default (900 = 15 minutes) means that if
two consecutive events from the same actor are more than 15 minutes
apart, JTNA treats them as belonging to different sequences. A
transition from the last event before a break to the first event after a
break is not a real transition — there is a gap in between where the
process stopped. Adjust this to match your data: a chat corpus might use
2 minutes (120), a weekly longitudinal study might use one day
(86400).
| Checkbox | What it shows | Reference-tutorial equivalent |
|---|---|---|
| TNA plot (on by default) | The main transition-network plot. | plot(model, minimum = ..., cut = ...) |
| Histogram | Distribution of all transition probabilities. Useful for choosing a pruning threshold. | hist(model) |
| Frequencies plot | Bar chart of how often each state appears in the data (raw frequency, not transition probability). | plot_frequencies(model) |
| Mosaic plot | Mosaic-plot view of transition frequencies. Not covered in the reference tutorial — use only if you specifically want a mosaic visualisation. |
The two parameters the reference tutorial explains explicitly are
Cut value and Minimum value. They map
onto plot(model, minimum = , cut = ) as follows:
| Parameter | Default | Meaning (from reference tutorial) |
|---|---|---|
| Minimum value | 0.05 | Edges with weight below this value are hidden entirely but are retained in all analysis. |
| Cut value | 0.1 | Edges with weight below this value appear faded/thinner. |
| Edge label size | 1 | Size of the numeric label on each arrow (cosmetic). |
| Node size | 8 | Size of each node (cosmetic). |
| Node label size | 1 | Size of the state-name labels (cosmetic). |
| Layout | Circle | Node-placement algorithm. 14 options are available; the reference tutorial uses the default. |
| Digits | 1 | Decimal places for mosaic-plot labels. |
Important: lowering the Minimum value does not change any analysis — it only affects what appears on the plot. All edges remain in the model and are used by every downstream statistic.
Centrality measures reduce each state to a single number capturing its structural importance in the network. Different measures answer different questions: which states are the most common destinations (InStrength), the most common origins (OutStrength), the key bridges between other states (Betweenness), or the most influential in spreading activation (Diffusion).
| Measure | Interpretation |
|---|---|
| OutStrength | Total outgoing weight. Frequent origin state. |
| InStrength | Total incoming weight. “Attractor” in the process. |
| Closeness | Overall connectedness. |
| ClosenessIn / ClosenessOut | Reachability from/to other states. |
| Betweenness | Bridge/bottleneck between other states. |
| BetweennessRSP | Robust betweenness via randomized shortest paths. |
| Clustering | Whether neighbours are also connected to each other. |
| Diffusion | Spread of activation through the network. |
loops = TRUE).normalize = TRUE).While node centrality summarises the importance of individual states, edge betweenness identifies the most critical transitions — the connections that serve as bridges between different parts of the process. Transitions with high edge betweenness lie on many shortest paths and therefore play a key structural role.
This corresponds to the reference tutorial’s
betweenness_network(model) →
plot(..., cut = 0.1).
The Plot Parameters (Cut, Minimum value, Edge label size, Node size, Node label size, Layout) behave exactly as in Section 4.3.
Communities are groups of states that are more densely connected to each other than to the rest of the network. Unlike cliques (which require every pair to be mutually connected), community-detection algorithms use modularity-based criteria to reveal the modular structure and functional subsystems within the transition network.
In the reference tutorial, communities(model) runs seven
algorithms and prints how many communities each one detected, together
with the assignment of each state to a community under each
algorithm.
| Method | Logic |
|---|---|
| leading_eigen | Leading eigenvector of the modularity matrix. |
| walktrap | Random walks; nodes visited together belong together. |
| fast_greedy | Greedy modularity optimisation. |
| spinglass | Spin-glass model for fine-grained structure. |
| infomap | Description-length minimisation for directed flow. |
| label_prop, edge_betweenness | Additional algorithms supported by the underlying tna
package. |
JTNA default: Spinglass. The reference R-tutorial uses leading_eigen by default. Either is fine — compare the assignments across several methods rather than relying on a single algorithm.
A clique is a fully connected subnetwork where every state has strong mutual transitions to every other state in the group. Cliques reveal self-reinforcing behavioural loops — for example, a ‘plan → monitor → adapt → plan’ cycle where each state frequently transitions to each of the others. These are substantively interesting because they represent behavioural patterns that sustain themselves: once a learner enters a clique, the transition probabilities keep them cycling within it.
| Parameter | Meaning |
|---|---|
| Size | Number of states in each clique (2 = dyads, 3 = triads, 4 = quads, …). |
| Threshold | Minimum transition probability that every edge in the clique must meet. |
Practical guidance from the reference tutorial:
lower the threshold as clique size increases, because fully
mutual connections become increasingly unlikely. The reference tutorial
uses threshold = 0.1 for dyads, 0.05 for
triads, 0.03 for quads.
The transition probabilities estimated by tna() are
descriptive estimates derived from a particular sample of sequences.
Without further validation, there is no basis for determining which of
these estimates reflect stable properties of the underlying process and
which are artifacts of sampling variability. Bootstrapping addresses
this directly by resampling sequences with replacement and
reconstructing the transition matrix across a large number of iterations
… Edges that do not consistently exceed a defined threshold or that
deviate beyond an acceptable consistency range are identified as
non-significant. The bootstrap is therefore not an optional diagnostic —
it is a confirmatory step that determines whether the network structure
warrants substantive interpretation.”
| JTNA field | Default | Reference-tutorial argument |
|---|---|---|
| Iteration | 1000 | iter = 1000 |
| Level | 0.05 | level = 0.05 |
| Method → Stability (default) | — | method = "stability" |
| Method → Threshold | — | method = "threshold" |
| Lower / Upper (under Method Parameters, Stability) | 0.75 / 1.25 | consistency_range = c(0.75, 1.25) |
| Threshold (under Method Parameters, Threshold method) | 0.1 | edge-weight threshold |
| Column | Meaning |
|---|---|
from, to |
Source and target state. |
weight |
Original observed transition probability. |
p_value |
Proportion of inconsistent resamples. |
sig |
Whether the edge is significant at the chosen level. |
cr_lower, cr_upper |
Consistency-range bounds. |
ci_lower, ci_upper |
Bootstrap confidence-interval bounds. |
sig = TRUE) —
appeared consistently across bootstrap resamples. These transitions are
stable properties of the data and warrant substantive
interpretation.sig = FALSE) —
unstable under resampling. Their presence in the original model may
reflect sampling noise rather than a genuine transition pathway.sig = TRUE edges.Centrality measures are among the most frequently interpreted yet least frequently validated quantities in network-based analyses. The case-dropping bootstrap systematically removes increasing proportions of sequences, recomputes centrality at each step, and quantifies how much the original ranking is preserved — via the Correlation Stability (CS) coefficient (Epskamp, Borsboom, & Fried, 2018). The CS coefficient is the maximum proportion of cases that can be dropped while maintaining a correlation of at least 0.7 with the original centrality ordering.
| CS coefficient | Interpretation |
|---|---|
| ≥ 0.7 | Excellent — centrality rankings are robust and can be interpreted with confidence. |
| 0.5 – 0.7 | Acceptable — rankings are reasonably stable but should be interpreted with some caution. |
| < 0.5 | Poor — rankings are unreliable and should not serve as the basis for substantive conclusions. |
“A CS coefficient below 0.5 indicates that the centrality ordering is not sufficiently stable … the appropriate response is to collect additional data or to refrain from interpreting centrality rankings altogether.”
InStrength, OutStrength, Betweenness (the three on by default).
The sections above all work with the transition network, where each edge represents how often one state follows another across all sequences. Sequence analysis works with the raw sequences directly, before they get collapsed into a transition matrix. It provides a complementary perspective: the full temporal unfolding of individual sequences and the overall distribution of states across sequence positions.
This corresponds to the reference tutorial’s
plot_sequences(prepared_data).
This section lets JTNA mine your sequences for recurring
sub-sequences (n-grams, gapped patterns, repeated patterns) using the
codyna package.
| Control | Effect |
|---|---|
| Show patterns table | Toggles the table on. |
| Pattern Type | N-gram (consecutive), Gapped (with gaps), Repeated (repeated within an individual). |
| Min Length / Max Length | Length range for N-gram and Repeated patterns. |
| Min Gap / Max Gap | Gap range, only used when Pattern Type = Gapped. |
| Min Support / Min Count | Minimum proportion of actors, and minimum absolute count, required for a pattern to be reported. |
| Starts with / Ends with / Contains | String filters applied to the pattern. |
| Max rows / Show all rows | Table paging. |
Refer to the codyna package documentation for the
substantive interpretation of these measures.
Computes per-actor summary statistics about each individual’s sequence (for example entropy and diversity measures).
| Control | Effect |
|---|---|
| Show indices table | Toggles the table on. |
| Favorable State | Pick one action from the dropdown to compute indices related to time spent in that state. |
| Omega (default 1) | Weighting parameter for the favorable-state indices. |
| Max rows / Show all rows | Table paging. |
Refer to the package documentation for formulas and interpretation.
Open Analyses → JTNA → Group TNA.
Group TNA builds a separate transition network for every level of a grouping variable and adds comparison and permutation-testing tools. In the reference R-tutorial, group comparisons are covered in a dedicated companion tutorial (tna-group). This section walks through the JTNA UI and grounds each shared feature in the reference tutorial; for the group-comparison-specific tools it describes the widgets only and points you to the companion tutorial for the conceptual treatment.
Group TNA adds one new slot on top of the four TNA slots:
| Slot | Column |
|---|---|
| Action | Action |
| Actor | Actor |
| Time | Time_Unix |
| Order | (leave empty) |
| Group | Group |
Drag Group into the Group slot. JTNA will detect levels
A, B, C and build one network per level.
The sections that follow are identical in meaning to the TNA module — they simply produce one result per group.
Absent from Group TNA. Edge Betweenness, Centrality Stability and Pattern Discovery are exposed only in the TNA module — they do not appear in Group TNA’s panel.
Permutation testing assesses whether observed differences in transition probabilities between two groups exceed what would be expected under a random reassignment of group labels. This feature is described in detail in the companion tutorial (tna-group) — we describe only the widget here.
| JTNA field | Default | Notes |
|---|---|---|
| Iter | 1000 | Number of random permutations. |
| Level | 0.05 | Significance threshold. |
| Paired | off | Tick when groups are naturally paired (e.g. pre/post on the same actors). |
| Text / Plot | off | Output toggles. |
| Max rows / Show all rows | 20 / off | Table paging. |
Produces a single network plot colouring each edge by which group has the stronger transition. See the companion tutorial for interpretation. The Plot Parameters (Cut, Min value, Edge label size, Node size, Node label size, Layout) behave as described in Section 4.3.
Widget-level description only — consult the companion tutorial for methodology.
Tests whether specific short action sub-sequences differ in frequency between groups. Widget-level description only.
| Control | Default | Notes |
|---|---|---|
| Sub Min / Sub Max | 2 / 4 | Range of sub-sequence lengths to test. |
| Minimum Frequency | 20 | Sub-sequences below this total count are ignored. |
| Correction Method | Bonferroni | Also available: Holm, Hochberg, BH (FDR), BY, None. |
| Max rows / Show all rows | 20 / off | Table paging. |
Open Analyses → JTNA → Cluster TNA.
Cluster TNA is for situations where you do not have a pre-defined grouping variable. It clusters actors based on the similarity of their sequences, then builds a separate transition network for each discovered cluster. The underlying clustering methodology is covered in a separate companion tutorial (tna-clustering) — as with Group TNA, this section walks through the JTNA UI and grounds shared features in the reference tutorial, while describing clustering-specific controls only at the widget level.
The four standard slots (Action, Actor, Time, Order) — no Group slot, because clusters are discovered from the data.
The first section in the Cluster TNA panel is Clustering Parameters (expanded by default). This is where Cluster TNA differs from the other two modules.
| Control | Default | Notes |
|---|---|---|
| Distance Measure | Hamming | Also: Optimal String Alignment (OSA), Levenshtein, Longest Common Substring (LCS), Jaccard, Jaro-Winkler. |
| Clustering Method | PAM | Also: Ward (D2), Complete, Average, Single. |
| Number of Clusters (k) | 2 | Integer, 2–20. |
| Run Clustering | off | Must be ticked for clustering to run. |
Clustering can be computationally expensive on large datasets, which is why the Run Clustering checkbox has to be ticked explicitly. See the clustering companion tutorial for guidance on picking a distance measure and k.
Once clustering completes, everything below is produced per-cluster. These sections behave exactly as in the TNA module:
The comparison tools are the same as in Group TNA, with two UI differences:
Everything else — Permutation Analysis, Network Difference Plot, Compare Network Properties, Compare Sequences — mirrors Sections 5.3–5.6. See the clustering companion tutorial for interpretation.
JTNA exposes the same end-to-end analysis pipeline that the reference R-tutorial describes:
| Step | Reference-tutorial R call | JTNA equivalent |
|---|---|---|
| Prepare data | prepare_data(df, action=, actor=, time=, time_threshold=900) |
Variable slots (Action / Actor / Time / Order) + Parameters → Threshold (900). |
| Build model | tna(prepared) |
Happens automatically once Action is assigned. Pick a Type. |
| Visualise | plot(model, minimum=0.05, cut=0.1) |
Visualization Settings → TNA plot (Minimum value = 0.05, Cut value = 0.1). |
| Inspect distributions | hist(model); plot_frequencies(model) |
Visualization Settings → Histogram; Frequencies plot. |
| Cliques | cliques(model, size=k, threshold=t) |
Clique Analysis (Size, Threshold). |
| Node centrality | centralities(model) |
Centrality Analysis. |
| Edge centrality | betweenness_network(model) |
Edge Betweenness. |
| Communities | communities(model, methods=…) |
Community Detection (Methods). |
| Bootstrap | bootstrap(model, iter=1000, level=0.05) |
Bootstrap Analysis (Iteration, Level, Method, Range). |
| Centrality stability | estimate_centrality_stability(model) |
Centrality Stability. |
| Raw sequences | plot_sequences(prepared) |
Sequence Analysis. |
For group-level and cluster-level comparisons (Permutation Analysis, Compare Network Properties, Compare Sequences, Network Difference Plot), consult the companion tutorials tna-group and tna-clustering — they ground those features in the same way this tutorial grounds the TNA module.
López-Pernas, S., Girault, D., Tikka, S., & Saqr, M. (2026). JTNA: A Desktop Software for Transition Network Analysis. Proceedings of ICSLE 2025. The Changing Landscape of Smart Learning Environments: Pedagogy, Collaborative Intelligence, and Ethics. LNET.
prepare_data() tutorial: https://sonsoles.me/posts/tna-data/Tutorial written for JTNA v1.7.1. If you are using a different version some options or defaults may differ.