Introducing ThSQCA: threshold-sweep QCA in R

ThSQCA is an R package that reruns a QCA analysis across a range of thresholds and records how the sufficiency solutions change.
ThSQCA
Author

Yuki Toyoda

Published

October 2, 2026

In qualitative comparative analysis (QCA), the thresholds that turn continuous scores into set memberships are usually fixed before the analysis. The resulting solution is then an answer to one specific definition, such as “usage intention is high” meaning a score of 7 or above. ThSQCA is an R package that makes the threshold itself an object of analysis: it repeats the same QCA analysis over a range of thresholds, under identical settings, and records how the sufficiency solution changes.

The idea

Changing a threshold changes which cases belong to a set. That can change the truth table, the fit measures, and the Boolean minimization. The relationship between a threshold t and the sufficiency solution S is therefore better described as a mapping, t → S(t), than as a single solution.

This is not the same question as a robustness check, which asks whether a favored solution survives alternative settings. It is also different from a search for the best threshold. Threshold-sweep QCA asks a descriptive question: how are sufficiency structures distributed across threshold definitions, and where do they persist, appear, or disappear? The methodology is developed in the paper below.

What the package does

ThSQCA does not implement its own minimization algorithm. Truth table construction and minimization are delegated to the QCA package, so the computational core is the same as in a standard analysis. ThSQCA adds the workflow around it:

  • the same consistency threshold, frequency threshold, solution type, and directional expectations are applied at every step of the sweep;
  • product terms, solution consistency, and coverage are collected into one common format;
  • cases with no solution or with multiple minimal solutions are recorded rather than lost;
  • results can be shown as tables and configuration charts, and written out as a Markdown report; the summary table can also be plotted with ordinary R graphics.

Four sweep functions

Question Function Threshold varied
How does the solution change as the target outcome level changes? otSweep() Outcome
How does it change as the criterion for one condition changes? ctSweepS() One condition
What happens when the criteria for several conditions change together? ctSweepM() Several conditions
How does it change when outcome and condition criteria change together? dtSweep() Outcome and conditions

Getting started

install.packages("ThSQCA")
library(ThSQCA)

The package includes a small example data set, sample_data, with an outcome Y and three conditions X1, X2, and X3, all scored from 0 to 10. The following is a minimal outcome-threshold sweep that runs as it is:

library(ThSQCA)

head(sample_data)

res <- otSweep(
  dat         = sample_data,
  outcome     = "Y",
  conditions  = c("X1", "X2", "X3"),
  sweep_range = 6:9,
  thrX        = c(X1 = 7, X2 = 7, X3 = 7)
)

summary(res)

This sweep asks how the sufficiency solution changes when “high outcome” is defined as Y >= 6, Y >= 7, Y >= 8, and Y >= 9. Each condition counts as “high” when its score is 7 or above. If you want a slower, step-by-step explanation of every row and of how to read the result table, see part 1 of the beginner’s series.

Running it prints a table like this (only the result part is shown):

 thrY                  expression inclS  covS n_solutions
    6 ~X1*X3 + ~X2*X3 + X1*X2*~X3 0.906 0.853           1
    7 ~X1*X3 + ~X2*X3 + X1*X2*~X3 0.906 0.879           1
    8                 No solution    NA    NA           0
    9                 No solution    NA    NA           0

Each row is one outcome threshold. In the expression column, * means AND, + means OR, and ~ means NOT. At Y >= 6 and Y >= 7, the same three sufficient paths appear. At Y >= 8 and Y >= 9, no solution meets the consistency requirement. A single-threshold analysis cannot show where an answer stops holding; a sweep can.

The package vignette covers all four functions with worked examples.

A note on use

ThSQCA is not a device for finding the threshold that gives the most appealing result. The range of thresholds should be justified in advance by the meaning of the scale, theory, and practical goals, and the range explored should be reported in full. The generate_report() function is designed to keep that record.