% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/mcml.R
\name{as_tna}
\alias{as_tna}
\alias{as_tna.mcml}
\alias{as_tna.default}
\title{Convert cluster_summary to tna Objects}
\usage{
as_tna(x)

\method{as_tna}{mcml}(x)

\method{as_tna}{default}(x)
}
\arguments{
\item{x}{A \code{cluster_summary} object created by
\code{\link{cluster_summary}}. The aggregated weights are passed to
\code{tna::tna()}, which row-normalises them as needed.}
}
\value{
A \code{cluster_tna} object (S3 class) containing:
\describe{
\item{between}{A tna object representing cluster-level transitions.
Contains \code{$weights} (k x k transition matrix), \code{$inits}
(initial distribution), and \code{$labels} (cluster names).
Use this for analyzing how learners/entities move between high-level
groups or phases.}
\item{within}{Named list of tna objects, one per cluster. Each tna object
represents internal transitions within that cluster. Contains
\code{$weights} (n_i x n_i matrix), \code{$inits} (initial distribution),
and \code{$labels} (node labels). Clusters with single nodes or zero-row
nodes are excluded (tna requires positive row sums).}
}

A \code{netobject_group} with data preserved from each sub-network.

A \code{tna} object constructed from the input.
}
\description{
Converts a \code{cluster_summary} object to proper tna objects that can be
used with all functions from the tna package. Creates both a between-cluster
tna model (cluster-level transitions) and within-cluster tna models (internal
transitions within each cluster).
}
\details{
This is the final step in the MCML workflow, enabling full integration with
the tna package for centrality analysis, bootstrap validation, permutation
tests, and visualization.
\subsection{Requirements}{

The tna package must be installed. If not available, the function throws
an error with installation instructions.
}

\subsection{Workflow}{

\preformatted{
# Full MCML workflow
net <- build_network(data, method = "relative")
net$nodes$clusters <- group_assignments
cs <- cluster_summary(net)
tna_models <- as_tna(cs)

# Now use tna package functions
plot(tna_models$macro)
tna::centralities(tna_models$macro)
tna::bootstrap(tna_models$macro, iter = 1000)

# Analyze within-cluster patterns
plot(tna_models$clusters$ClusterA)
tna::centralities(tna_models$clusters$ClusterA)
}
}

\subsection{Zero-out-degree (sink) nodes}{

Every cluster is returned, regardless of its row sums. A node with zero
outgoing weight is a legitimate sink (a terminal state); its row in the
wrapped network is left all-zero. This holds for both
\code{net_method = "relative"} and \code{"frequency"} -- the stored
weights are never re-normalised, so a sink row needs no special handling.
Inspect \code{rowSums(x$clusters[[cl]]$weights)} to find sink nodes.
}
}
\examples{
mat <- matrix(runif(36), 6, 6)
rownames(mat) <- colnames(mat) <- LETTERS[1:6]
clusters <- list(G1 = c("A", "B"), G2 = c("C", "D"), G3 = c("E", "F"))
cs <- cluster_summary(mat, clusters)
tna_models <- as_tna(cs)
tna_models
tna_models$macro$weights
}
\seealso{
\code{\link{cluster_summary}} to create the input object,
\code{plot()} for visualization without conversion,
\code{tna::tna} for the underlying tna constructor
}
