
Dynamic-state indicators and classification for flow trajectories
Source:R/sniff_trajectory_dynamics.R
sniff_trajectory_dynamics.RdCharacterizes each sniff_trajectory_braid() trajectory along the evolutionary
states of the method (emergence, convergence, divergence, dormancy), grounding
the four emergence pillars (novelty, growth, community, persistence) in two
complementary lenses tied to the flow model.
Usage
sniff_trajectory_dynamics(
flow,
thresholds = NULL,
k = 1,
growth_window = 3,
novelty_window = 5,
winsorize = 3,
cct = NULL,
entropy = NULL,
hubs = NULL
)Arguments
- flow
A
sniff_trajectory_braid()object.- thresholds
A
fixed_state_thresholds()-shaped list.NULL(default) derives the cut points from the data viadata_state_thresholds()with thekbelow, so the classification adapts to the dataset; passfixed_state_thresholds()to force the fixed constants instead. The thresholds actually used are attached to the result asattr(result, "state_thresholds"), which the plots read back.- k
Robust deviations for the data-driven thresholds when
thresholdsisNULL(default 1); seedata_state_thresholds(). Ignored when an explicitthresholdslist is supplied.- growth_window
Curve points over which
growth_rateis fitted (default 3).- novelty_window
Years counted as recent for
novelty(default 5).- winsorize
Cap each pillar's robust z-score at
c(-winsorize, +winsorize)before summing intoemergence_index, so no single extreme pillar (e.g. a young core 18 MADs out on growth) dominates the ranking. Default3(near the Iglewicz–Hoaglin modified-z outlier boundary of 3.5);NULLleaves the robust z-scores uncapped.- cct
Optional
sniff_trajectory_cct()output (one row pertraj_id), left-joined to add thecctlist-column (per-year renewal-pace series);NULL(default) omits it.- entropy
Optional
sniff_trajectory_entropy()output (one row pertraj_id), left-joined to add thekeyword_entropylist-column (per-year keyword-diversity series);NULL(default) omits it.- hubs
Optional
sniff_trajectory_hubs()output (one row pertraj_id), left-joined to add the hub-role columns;NULL(default) omits them.
Value
A tibble, one row per trajectory, sorted by descending
emergence_index (absorbed last): traj_id, type, group, start, end,
age, size, growth_rate, doubling_time, novelty, recruitment,
emergence_density, attraction_inflow, dest_entropy, dormant_share,
phase, fate,
state, emergence_index, emergence_index_intensive (the same index
without the extensive recruitment pillar), reach_ratio, plus any
cct / keyword_entropy (per-year list-columns) and hubs columns.
Details
Forward lens (all trajectories). growth_rate and doubling_time (an
exponential fit of the recent size curve), novelty (share of documents that
arrived recently), recruitment (net documents gained over the lifespan, the
power of attraction), emergence_density (staying power: the share of the
lineage's year-steps still growing at the emergence rate, after Carley et al.
2017), and age/size (persistence and community).
Backward lens (absorbed trajectories only). Where the terminal cohort goes,
via sniff_trajectory_destination(): dest_entropy (normalized Shannon
entropy of the destination split) and dormant_share (share dropping out).
Inflow lens (central trajectories only). attraction_inflow, the documents
of the final community delivered by absorbed tributaries (the consolidating side
of convergence), from sniff_trajectory_self_sufficiency().
Reach lens (all trajectories). reach_ratio, the share of the future field
a lineage's origin seeds – its birth node's forward temporal reach in the DAG
over all nodes born later (after the temporal-reachability of Marino & Silva
2023). Structural downstream influence, distinct from size and, via the ratio,
from age.
Classification uses two axes: a life-cycle phase for living (central)
trajectories – emergence / maturity / dormancy(stall) by growth and novelty –
and a terminal fate for declining (absorbed) ones – convergence /
divergence / dormancy(death) by destination. state is phase for centrals and
fate for absorbed; phase and fate are kept separate so the two senses of
dormancy (a stalled living core vs a dead cohort) stay distinguishable. The
emergence_index (a within-central combination of growth, novelty and
recruitment) is computed for living trajectories only, so an absorbed lineage
that grew before dying is never ranked as emerging. Because recruitment is an
extensive (size-carrying) pillar, the full index partly tracks community size;
emergence_index_intensive drops it (growth and novelty only) for a rate-based
ranking that does not reward a large core for its volume alone.
See also
sniff_trajectory_braid(), sniff_trajectory_destination(),
sniff_trajectory_self_sufficiency(), sniff_trajectory_cct(),
sniff_trajectory_entropy(), sniff_trajectory_hubs(),
fixed_state_thresholds()
Other trajectory analysis:
sniff_trajectory_cct(),
sniff_trajectory_community(),
sniff_trajectory_confluence(),
sniff_trajectory_contribution(),
sniff_trajectory_destination(),
sniff_trajectory_emergence_owners(),
sniff_trajectory_entropy(),
sniff_trajectory_formation(),
sniff_trajectory_hubs(),
sniff_trajectory_self_sufficiency()