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. The summary component is for
stability scores across all draws. 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.