qcaERT functions are designed as siblings. The details differ by test, but the main returned-object structure is intentionally shared.
The code fragments in this vignette use object names such as
incl_out, calib_out, and
cluster_out. The getting-started vignette shows how to
create those objects in a normal QCA workflow.
Most robustness objects contain:
results: the clean tablediagnostics: the detailed table for inspection and
troubleshootingsettings: the arguments and derived settings used in
the runbaseline,
bounds, by_direction, by_case,
by_run, by_draw, or summaryMain summaries are:
print(x) gives a concise summary.
as.data.frame(x) returns the clean table.
x$diagnostics is where to look when you need to understand
a specific run, case, draw, or stopping reason.
incl.test(), ncut.test(), and
calib.test() are boundary tests. They move a quantity away
from the baseline until either the monitored solution changes, an error
occurs, or the search reaches a limit.
as.data.frame(incl_out)
incl_out$diagnostics
incl_out$bounds
as.data.frame(ncut_out)
ncut_out$diagnostics
ncut_out$bounds
as.data.frame(calib_out)
calib_out$diagnostics
calib_out$boundsThe clean table answers the practical question: how far did the value move before the result stopped being stable?
The diagnostics table preserves the path-level detail.
loo.test() gives one row per removed case.
subsample.test() gives one row per subsample run.
as.data.frame(loo_out)
loo_out$diagnostics
loo_out$by_case
as.data.frame(subsample_out)
subsample_out$diagnostics
subsample_out$by_run
subsample_out$summaryUse the clean table to find cases or runs that changed the solution. Use the supporting list components when you need the full run object for a specific case or replication.
altset.test() gives one row per random draw. The result
object also stores the draw-level run details and aggregate scores.
The clean table is for scanning. In it, n_fit_deltas = 0
means that fit was compared and no difference exceeded
fit_tol; n_fit_deltas = NA means that no
like-for-like fit comparison was available. The printed summary
separates attempted draws, formula-comparable draws, and fit-comparable
draws so each preservation rate retains its denominator. When
calibration is part of the sampled draw, changed_sets names
the perturbed calibrated sets and changed_roles records
whether those sets were conditions, the outcome, or both.
cluster.test() and theory.test() are the
deliberate structured-result exceptions. For
cluster.test(), results is a list:
overviewclustersunitscluster_out$results$overview
cluster_out$results$clusters
cluster_out$results$units
as.data.frame(cluster_out)
cluster_out$diagnosticsFor cluster.test(),
as.data.frame(cluster_out) returns
cluster_out$results$overview.
theory.test() is also structured because comparative
theory testing has three natural clean tables:
modelssolutionspairwiseas.data.frame(theory_out)
theory_out$results$models
theory_out$results$solutions
theory_out$results$pairwise
theory_out$diagnostics
theory_out$by_theoryFor theory.test(),
as.data.frame(theory_out) returns
theory_out$results$models. Inspect
results$solutions when the question is which terms were
selected, and inspect results$pairwise when the question is
how far selected solution memberships differ across theories.
sol.df() returns a regular data frame directly.
Use sol.df() when you want to report or inspect QCA
minimization output in a compact table.
In normal use, inspect objects in this order:
as.data.frame(x) for the clean table.x$summary if the function has one.x$diagnostics only when you need the full
detail.cluster.test(), inspect
x$results$clusters and x$results$units after
checking the overview.theory.test(), inspect
x$results$solutions and x$results$pairwise
after checking the model table.The same conventions are described formally in
?qcaERT_conventions.