TSQCA Reproducible Code (English)

This document provides reproducible code for TSQCA analyses.
It is designed to be inserted directly into a research article’s appendix
or provided as supplementary analysis documentation. All code is fully executable and ordered for reproducibility.


1. Load Packages

library(TSQCA)
library(QCA)
#> Warning: package 'QCA' was built under R version 4.4.3
#> Loading required package: admisc
#> Warning: package 'admisc' was built under R version 4.4.3
#> 
#> To cite package QCA in publications, please use:
#>   Dusa, Adrian (2019) QCA with R. A Comprehensive Resource.
#>   Springer International Publishing.
#> 
#> To run the graphical user interface, use: runGUI()

2. Load Data

# Adjust the file name as needed
library(TSQCA)
data("sample_data")
dat <- sample_data

# Outcome and conditions
Yvar  <- "Y"
Xvars <- c("X1", "X2", "X3")

# Quick inspection
str(dat)
#> 'data.frame':    80 obs. of  4 variables:
#>  $ Y : int  8 4 5 7 2 2 7 5 3 8 ...
#>  $ X1: int  7 2 6 8 8 9 8 8 1 5 ...
#>  $ X2: int  7 5 8 4 0 5 8 4 4 2 ...
#>  $ X3: int  1 6 6 5 3 4 5 3 6 8 ...
summary(dat)
#>        Y                X1               X2              X3        
#>  Min.   : 0.000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.000  
#>  1st Qu.: 3.000   1st Qu.: 3.000   1st Qu.: 3.00   1st Qu.: 3.000  
#>  Median : 5.000   Median : 5.500   Median : 5.00   Median : 5.000  
#>  Mean   : 5.513   Mean   : 5.237   Mean   : 5.05   Mean   : 4.925  
#>  3rd Qu.: 7.250   3rd Qu.: 8.000   3rd Qu.: 7.25   3rd Qu.: 7.000  
#>  Max.   :10.000   Max.   :10.000   Max.   :10.00   Max.   :10.000

3. Baseline Thresholds

thrY_base <- 7
thrX_base <- 7

# Fixed X thresholds (for OTS–QCA)
thrX_vec <- c(
  X1 = thrX_base,
  X2 = thrX_base,
  X3 = thrX_base
)
thrX_vec
#> X1 X2 X3 
#>  7  7  7

4. CTS–QCA (ctSweepS)

Sweep a single condition X (example: X3).

sweep_var   <- "X3"   # Condition (X) whose threshold is swept
sweep_range <- 6:9    # Candidate threshold values to evaluate
thrY         <- 7     # Outcome (Y) threshold (fixed)
thrX_default <- 7     # Threshold for other X conditions (fixed)

res_cts <- ctSweepS(
  dat            = dat,
  Yvar           = "Y",
  Xvars          = c("X1", "X2", "X3"),
  sweep_var      = "X3",
  sweep_range    = 6:9,
  thrY           = 7,
  thrX_default   = 7,
  dir.exp        = 1,
  return_details = FALSE
)

head(res_cts)
#>   threshold  expression inclS covS
#> 1         6 No solution    NA   NA
#> 2         7 No solution    NA   NA
#> 3         8 No solution    NA   NA
#> 4         9 No solution    NA   NA

Export:

write.csv(res_cts, file = "TSQCA_CTS_results.csv", row.names = FALSE)

5. MCTS–QCA (ctSweepM)

Sweep multiple X thresholds simultaneously.

res_mcts <- ctSweepM(
  dat            = dat,
  Yvar           = "Y",
  Xvars          = c("X1", "X2", "X3"),
  sweep_vars     = c("X2", "X3"),
  sweep_range    = 6:9,
  thrY           = 7,
  thrX_default   = 7,
  dir.exp        = 1,
  return_details = FALSE
)
#> Error in ctSweepM(dat = dat, Yvar = "Y", Xvars = c("X1", "X2", "X3"), : unused arguments (sweep_vars = c("X2", "X3"), sweep_range = 6:9, thrX_default = 7)

head(res_mcts)
#> Error: object 'res_mcts' not found

Export:

write.csv(res_mcts, file = "TSQCA_MCTS_results.csv", row.names = FALSE)

6. OTS–QCA (otSweep)

Sweep only the outcome threshold (Y).

sweep_range_ots <- 6:9

res_ots <- otSweep(
  dat            = dat,
  Yvar           = "Y",
  Xvars          = c("X1", "X2", "X3"),
  sweep_range    = sweep_range_ots,
  thrX           = thrX_vec,
  dir.exp        = 1,
  return_details = FALSE
)

res_ots
#>   thrY  expression inclS covS
#> 1    6 No solution    NA   NA
#> 2    7 No solution    NA   NA
#> 3    8 No solution    NA   NA
#> 4    9 No solution    NA   NA

Export:

write.csv(res_ots, file = "TSQCA_OTS_results.csv", row.names = FALSE)

7. DTS–QCA (dtSweep)

Two-dimensional sweep: X thresholds × Y thresholds.

sweep_list_dts_X <- list(
  X1 = 6:8,
  X2 = 6:8,
  X3 = 6:8
)

sweep_range_dts_Y <- 6:8

res_dts <- dtSweep(
  dat            = dat,
  Yvar           = "Y",
  Xvars          = c("X1", "X2", "X3"),
  sweep_list_X   = sweep_list_dts_X,
  sweep_range_Y  = sweep_range_dts_Y,
  dir.exp        = 1,
  return_details = FALSE
)

res_dts
#>    combo_id thrY             thrX  expression inclS covS
#> 1         1    6 X1=6, X2=6, X3=6 No solution    NA   NA
#> 2         1    7 X1=6, X2=6, X3=6 No solution    NA   NA
#> 3         1    8 X1=6, X2=6, X3=6 No solution    NA   NA
#> 4         2    6 X1=7, X2=6, X3=6 No solution    NA   NA
#> 5         2    7 X1=7, X2=6, X3=6 No solution    NA   NA
#> 6         2    8 X1=7, X2=6, X3=6 No solution    NA   NA
#> 7         3    6 X1=8, X2=6, X3=6 No solution    NA   NA
#> 8         3    7 X1=8, X2=6, X3=6 No solution    NA   NA
#> 9         3    8 X1=8, X2=6, X3=6 No solution    NA   NA
#> 10        4    6 X1=6, X2=7, X3=6 No solution    NA   NA
#> 11        4    7 X1=6, X2=7, X3=6 No solution    NA   NA
#> 12        4    8 X1=6, X2=7, X3=6 No solution    NA   NA
#> 13        5    6 X1=7, X2=7, X3=6 No solution    NA   NA
#> 14        5    7 X1=7, X2=7, X3=6 No solution    NA   NA
#> 15        5    8 X1=7, X2=7, X3=6 No solution    NA   NA
#> 16        6    6 X1=8, X2=7, X3=6 No solution    NA   NA
#> 17        6    7 X1=8, X2=7, X3=6 No solution    NA   NA
#> 18        6    8 X1=8, X2=7, X3=6 No solution    NA   NA
#> 19        7    6 X1=6, X2=8, X3=6 No solution    NA   NA
#> 20        7    7 X1=6, X2=8, X3=6 No solution    NA   NA
#> 21        7    8 X1=6, X2=8, X3=6 No solution    NA   NA
#> 22        8    6 X1=7, X2=8, X3=6 No solution    NA   NA
#> 23        8    7 X1=7, X2=8, X3=6 No solution    NA   NA
#> 24        8    8 X1=7, X2=8, X3=6 No solution    NA   NA
#> 25        9    6 X1=8, X2=8, X3=6 No solution    NA   NA
#> 26        9    7 X1=8, X2=8, X3=6 No solution    NA   NA
#> 27        9    8 X1=8, X2=8, X3=6 No solution    NA   NA
#> 28       10    6 X1=6, X2=6, X3=7 No solution    NA   NA
#> 29       10    7 X1=6, X2=6, X3=7 No solution    NA   NA
#> 30       10    8 X1=6, X2=6, X3=7 No solution    NA   NA
#> 31       11    6 X1=7, X2=6, X3=7 No solution    NA   NA
#> 32       11    7 X1=7, X2=6, X3=7 No solution    NA   NA
#> 33       11    8 X1=7, X2=6, X3=7 No solution    NA   NA
#> 34       12    6 X1=8, X2=6, X3=7 No solution    NA   NA
#> 35       12    7 X1=8, X2=6, X3=7 No solution    NA   NA
#> 36       12    8 X1=8, X2=6, X3=7 No solution    NA   NA
#> 37       13    6 X1=6, X2=7, X3=7 No solution    NA   NA
#> 38       13    7 X1=6, X2=7, X3=7 No solution    NA   NA
#> 39       13    8 X1=6, X2=7, X3=7 No solution    NA   NA
#> 40       14    6 X1=7, X2=7, X3=7 No solution    NA   NA
#> 41       14    7 X1=7, X2=7, X3=7 No solution    NA   NA
#> 42       14    8 X1=7, X2=7, X3=7 No solution    NA   NA
#> 43       15    6 X1=8, X2=7, X3=7 No solution    NA   NA
#> 44       15    7 X1=8, X2=7, X3=7 No solution    NA   NA
#> 45       15    8 X1=8, X2=7, X3=7 No solution    NA   NA
#> 46       16    6 X1=6, X2=8, X3=7 No solution    NA   NA
#> 47       16    7 X1=6, X2=8, X3=7 No solution    NA   NA
#> 48       16    8 X1=6, X2=8, X3=7 No solution    NA   NA
#> 49       17    6 X1=7, X2=8, X3=7 No solution    NA   NA
#> 50       17    7 X1=7, X2=8, X3=7 No solution    NA   NA
#> 51       17    8 X1=7, X2=8, X3=7 No solution    NA   NA
#> 52       18    6 X1=8, X2=8, X3=7 No solution    NA   NA
#> 53       18    7 X1=8, X2=8, X3=7 No solution    NA   NA
#> 54       18    8 X1=8, X2=8, X3=7 No solution    NA   NA
#> 55       19    6 X1=6, X2=6, X3=8 No solution    NA   NA
#> 56       19    7 X1=6, X2=6, X3=8 No solution    NA   NA
#> 57       19    8 X1=6, X2=6, X3=8 No solution    NA   NA
#> 58       20    6 X1=7, X2=6, X3=8 No solution    NA   NA
#> 59       20    7 X1=7, X2=6, X3=8 No solution    NA   NA
#> 60       20    8 X1=7, X2=6, X3=8 No solution    NA   NA
#> 61       21    6 X1=8, X2=6, X3=8 No solution    NA   NA
#> 62       21    7 X1=8, X2=6, X3=8 No solution    NA   NA
#> 63       21    8 X1=8, X2=6, X3=8 No solution    NA   NA
#> 64       22    6 X1=6, X2=7, X3=8 No solution    NA   NA
#> 65       22    7 X1=6, X2=7, X3=8 No solution    NA   NA
#> 66       22    8 X1=6, X2=7, X3=8 No solution    NA   NA
#> 67       23    6 X1=7, X2=7, X3=8 No solution    NA   NA
#> 68       23    7 X1=7, X2=7, X3=8 No solution    NA   NA
#> 69       23    8 X1=7, X2=7, X3=8 No solution    NA   NA
#> 70       24    6 X1=8, X2=7, X3=8 No solution    NA   NA
#> 71       24    7 X1=8, X2=7, X3=8 No solution    NA   NA
#> 72       24    8 X1=8, X2=7, X3=8 No solution    NA   NA
#> 73       25    6 X1=6, X2=8, X3=8 No solution    NA   NA
#> 74       25    7 X1=6, X2=8, X3=8 No solution    NA   NA
#> 75       25    8 X1=6, X2=8, X3=8 No solution    NA   NA
#> 76       26    6 X1=7, X2=8, X3=8 No solution    NA   NA
#> 77       26    7 X1=7, X2=8, X3=8 No solution    NA   NA
#> 78       26    8 X1=7, X2=8, X3=8 No solution    NA   NA
#> 79       27    6 X1=8, X2=8, X3=8 No solution    NA   NA
#> 80       27    7 X1=8, X2=8, X3=8 No solution    NA   NA
#> 81       27    8 X1=8, X2=8, X3=8 No solution    NA   NA

Export:

write.csv(res_dts, file = "TSQCA_DTS_results.csv", row.names = FALSE)

References

For more information on TS-QCA methodology, see:

8. Session Information

sessionInfo()
#> R version 4.4.1 (2024-06-14 ucrt)
#> Platform: x86_64-w64-mingw32/x64
#> Running under: Windows 11 x64 (build 26200)
#> 
#> Matrix products: default
#> 
#> 
#> locale:
#> [1] LC_COLLATE=C                    LC_CTYPE=Japanese_Japan.utf8   
#> [3] LC_MONETARY=Japanese_Japan.utf8 LC_NUMERIC=C                   
#> [5] LC_TIME=Japanese_Japan.utf8    
#> 
#> time zone: Asia/Tokyo
#> tzcode source: internal
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] QCA_3.23    admisc_0.39 TSQCA_0.1.2
#> 
#> loaded via a namespace (and not attached):
#>  [1] cli_3.6.5         knitr_1.50        rlang_1.1.6       xfun_0.52        
#>  [5] otel_0.2.0        promises_1.5.0    shiny_1.12.1      jsonlite_2.0.0   
#>  [9] xtable_1.8-4      htmltools_0.5.9   httpuv_1.6.16     sass_0.4.10      
#> [13] lpSolve_5.6.23    rmarkdown_2.29    evaluate_1.0.4    jquerylib_0.1.4  
#> [17] fastmap_1.2.0     yaml_2.3.10       lifecycle_1.0.4   compiler_4.4.1   
#> [21] Rcpp_1.1.0        rstudioapi_0.17.1 later_1.4.4       digest_0.6.39    
#> [25] R6_2.6.1          magrittr_2.0.4    bslib_0.9.0       declared_0.25    
#> [29] tools_4.4.1       mime_0.13         venn_1.12         cachem_1.1.0