<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Yuki Toyoda&#39;s Blog</title>
<link>https://im-research-yt.github.io/</link>
<atom:link href="https://im-research-yt.github.io/index.xml" rel="self" type="application/rss+xml"/>
<description>Threshold-sweep QCA, marketing science, and data analysis tools</description>
<image>
<url>https://im-research-yt.github.io/thumbnail-site.png</url>
<title>Yuki Toyoda&#39;s Blog</title>
<link>https://im-research-yt.github.io/</link>
<height>76</height>
<width>144</width>
</image>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Thu, 05 Nov 2026 15:00:00 GMT</lastBuildDate>
<item>
  <title>Trying ThS-QCA (2) MUJI with UNIQLO’s Conditions</title>
  <link>https://im-research-yt.github.io/posts/thsqca-case-muji-same-conditions/</link>
  <description><![CDATA[ 





<p><em>Series part 2. Written to be read on its own.</em></p>
<p>In part 1, I moved the “recommend” level from 9 down to 5 for UNIQLO. At 7 or 8 or higher, the sufficient condition was that, with the brand not seen as basic, price, quality and versatility all hold. What happens if we apply <strong>UNIQLO’s conditions</strong> to MUJI unchanged?</p>
<section id="method-and-data-common-to-the-series" class="level2">
<h2 class="anchored" data-anchor-id="method-and-data-common-to-the-series">Method and data (common to the series)</h2>
<ul>
<li><strong>Method</strong>: Threshold-Sweep QCA (ThS-QCA). I move the cut-off (threshold) on “how strongly would you recommend this brand to friends and acquaintances” (0 to 10; 0 = would not recommend at all, 10 = would definitely recommend) and list the <strong>sufficient conditions</strong> at each cut-off (combinations of conditions whose holders mostly end up recommending the brand; Toyoda, 2026, <em>Quality &amp; Quantity</em>). It does not search for one optimal threshold.</li>
<li><strong>Data</strong>: A casual fashion survey (N = 300) that I ran in June 2026 for the lecture “Marketing 2” at the Graduate School of Innovation Management, Hosei University, fielded by Freeasy; part of it is released for these case studies. Respondents had not answered “not conscious at all” about choosing casual fashion brands in the screening survey, so the sample does not represent consumers in general. The analysis uses the respondents who rated each brand (“don’t know” is excluded).</li>
<li><strong>Cases</strong>: 251 respondents who rated MUJI.</li>
<li><strong>Conditions (X)</strong>: the same four perceptions as for UNIQLO (“affordable price range,” “good quality,” “easy to mix and match,” and “offers products that downplay trends” (hereafter, basic)). For each brand, respondents ticked every item they thought applied, and I split the cases into ticked and not ticked. The four conditions used here are <strong>an example of how to use the method</strong>. I picked them after looking at results, because they suit an illustration. In a real analysis, conditions must be set in advance, based on hypotheses or prior research.</li>
<li><strong>Consistency</strong>: among people holding a combination, the share who recommend (threshold 0.80 or higher). <strong>Coverage</strong>: among people who recommend, the share explained by the combination.</li>
<li><strong>Settings</strong> (same at every level): minimum number of cases 4; <strong>intermediate solution</strong> (for logical remainders, I assume that each perception contributes toward recommending, except “basic”, for which I assume no direction).</li>
</ul>
</section>
<section id="results-same-conditions-same-level-moving" class="level2">
<h2 class="anchored" data-anchor-id="results-same-conditions-same-level-moving">Results: same conditions, same level moving</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>Recommend if score is</th>
<th>MUJI share (UNIQLO)</th>
<th>Sufficient conditions for MUJI</th>
<th>Consistency</th>
<th>Coverage</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>9 or higher</td>
<td>14% (18%)</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="even">
<td>8 or higher</td>
<td>29% (41%)</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="odd">
<td>7 or higher</td>
<td>46% (58%)</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="even">
<td>6 or higher</td>
<td>58% (67%)</td>
<td>not price × quality × not versatile / price × quality × versatile × not basic</td>
<td>0.87</td>
<td>0.28</td>
</tr>
<tr class="odd">
<td>5 or higher</td>
<td>79% (86%)</td>
<td>basic / price × versatile / quality × not versatile</td>
<td>0.93</td>
<td>0.40</td>
</tr>
</tbody>
</table>
<p>(“/” means “or”. “Not X” means X was not ticked. Consistency and coverage in the table are values for the whole solution joined by “/”.)</p>
<ul>
<li><strong>For MUJI, sufficient conditions appear only down to 6 or higher.</strong> For UNIQLO they appeared from 8 or higher.</li>
<li>For UNIQLO, at 7 or 8 or higher the sufficient condition was “price × quality × versatile × not basic.” For MUJI, this pattern first appears at 6 or higher.</li>
<li>The other pattern at 6 or higher is “quality holds while neither price nor versatility is ticked.” Many people recommend on quality alone, even without a price perception.</li>
<li>Perceptions are distributed differently too: 44% of UNIQLO raters ticked “affordable price range,” against 30% for MUJI.</li>
</ul>
<p>In short, with the four shared conditions, <strong>no solution met the criterion for MUJI at 7 or higher</strong>. The share of respondents at 7 or higher also differs (58% for UNIQLO, 46% for MUJI). With the same conditions and settings, the solutions obtained differed by brand.</p>
</section>
<section id="a-marketing-reading-as-hypotheses" class="level2">
<h2 class="anchored" data-anchor-id="a-marketing-reading-as-hypotheses">A marketing reading (as hypotheses)</h2>
<p>What the results show is only which combinations of perceptions are held by people who recommend at each level. What follows is marketing interpretation drawn from that, and it remains a hypothesis.</p>
<ol type="1">
<li><strong>Even with the same conditions and settings, how solutions emerge differs.</strong> For UNIQLO, solutions appeared from 8 or higher. For MUJI, they appear only from 6 or higher. A view centered on price, quality and versatility, which fit UNIQLO’s recommendations, cannot simply be carried over to MUJI.</li>
<li><strong>The way price is perceived differs.</strong> The share who ticked “affordable price range” is 44% for UNIQLO and 30% for MUJI. At 6 or higher, a pattern also appears in which quality is enough when price is not ticked. However, this is a difference in shares. It does not mean that people who recommend MUJI ignore price.</li>
<li><strong>How “basic” appears at 5 or higher differs between UNIQLO and MUJI.</strong> The UNIQLO solutions contained “not basic.” The MUJI solution at 5 or higher contains “basic” itself. However, few MUJI respondents ticked basic (8%; UNIQLO 11%). Part 3 looks at this point again.</li>
</ol>
</section>
<section id="cautions" class="level2">
<h2 class="anchored" data-anchor-id="cautions">Cautions</h2>
<ul>
<li>These four conditions were chosen as an example for the UNIQLO analysis. With other conditions, the results for MUJI would change.</li>
<li>“No sufficient condition” does not mean “no reason exists.”</li>
<li>This is an online survey run as part of a lecture (N = 300), and the sample does not represent consumers in general.</li>
</ul>
</section>
<section id="reproducible-code-r" class="level2">
<h2 class="anchored" data-anchor-id="reproducible-code-r">Reproducible code (R)</h2>
<p>Data (same folder): <a href="fashion_muji.csv">fashion_muji.csv</a></p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(QCA); <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb1-2">dat   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read.csv</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fashion_muji.csv"</span>)</span>
<span id="cb1-3">conds <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRICE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUALITY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"VERSATILE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>)</span>
<span id="cb1-4">res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> dat, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"REC"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> conds,</span>
<span id="cb1-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb1-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setNames</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">length</span>(conds)), conds),</span>
<span id="cb1-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dir.exp =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(conds <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span>),</span>
<span id="cb1-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.80</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb1-9">res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"thrY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"expression"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"inclS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"covS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n_solutions"</span>)]</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  thrY                                                 expression     inclS
1    5               BASIC + PRICE*VERSATILE + QUALITY*~VERSATILE 0.9302326
2    6 ~PRICE*QUALITY*~VERSATILE + PRICE*QUALITY*VERSATILE*~BASIC 0.8723404
3    7                                                No solution        NA
4    8                                                No solution        NA
5    9                                                No solution        NA
       covS n_solutions
1 0.4020101           1
2 0.2827586           1
3        NA           0
4        NA           0
5        NA           0</code></pre>
</div>
</div>
<p>Paper: Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. https://doi.org/10.1007/s11135-026-03092-3</p>
</section>
<section id="what-to-read-next" class="level2">
<h2 class="anchored" data-anchor-id="what-to-read-next">What to read next</h2>
<ul>
<li><a href="../../posts/thsqca-case-uniqlo/index.html">Part 1: UNIQLO</a></li>
<li><a href="../../posts/thsqca-case-muji-swap/index.html">Part 3: Swapping conditions with the same MUJI data</a></li>
<li><a href="../../posts/thsqca-case-overview/index.html">Begin here: ThS-QCA Case Study</a></li>
</ul>
</section>
<section id="r-environment-for-this-page" class="level2">
<h2 class="anchored" data-anchor-id="r-environment-for-this-page">R environment for this page</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sessionInfo</span>()</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>R version 4.6.1 (2026-06-24 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26300)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=Japanese_Japan.utf8  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] ThSQCA_2.0.9 QCA_3.25.5   admisc_0.41 

loaded via a namespace (and not attached):
 [1] digest_0.6.39     fastmap_1.2.0     xfun_0.60         knitr_1.52       
 [5] htmltools_0.5.9   rmarkdown_2.32    cli_3.6.6         venn_1.13        
 [9] declared_0.27     compiler_4.6.1    rstudioapi_0.19.0 tools_4.6.1      
[13] evaluate_1.0.5    yaml_2.3.12       otel_0.2.0        rlang_1.3.0      
[17] jsonlite_2.0.0    htmlwidgets_1.6.4</code></pre>
</div>
</div>


</section>

 ]]></description>
  <category>marketing</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-case-muji-same-conditions/</guid>
  <pubDate>Thu, 05 Nov 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-case-muji-same-conditions/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Trying ThS-QCA (3) Swapping the Conditions with the Same MUJI Data</title>
  <link>https://im-research-yt.github.io/posts/thsqca-case-muji-swap/</link>
  <description><![CDATA[ 





<p><em>Series part 3. Written to be read on its own.</em></p>
<p>In part 1, UNIQLO’s recommendations were explained by “price × quality × versatile × not basic.” In part 2, with the same conditions, no solution met the criterion for MUJI at 7 or higher. This time, I <strong>swap the conditions entered into the analysis, using the same 251 MUJI respondents</strong>, and check how the combinations we see change.</p>
<section id="method-and-data-common-to-the-series" class="level2">
<h2 class="anchored" data-anchor-id="method-and-data-common-to-the-series">Method and data (common to the series)</h2>
<ul>
<li><strong>Method</strong>: Threshold-Sweep QCA (ThS-QCA). I move the cut-off (threshold) on “how strongly would you recommend this brand to friends and acquaintances” (0 to 10; 0 = would not recommend at all, 10 = would definitely recommend) and list the <strong>sufficient conditions</strong> at each cut-off (combinations of conditions whose holders mostly end up recommending the brand; Toyoda, 2026, <em>Quality &amp; Quantity</em>). It does not search for one optimal threshold.</li>
<li><strong>Data</strong>: A casual fashion survey (N = 300) that I ran in June 2026 for the lecture “Marketing 2” at the Graduate School of Innovation Management, Hosei University, fielded by Freeasy; part of it is released for these case studies. Respondents had not answered “not conscious at all” about choosing casual fashion brands in the screening survey, so the sample does not represent consumers in general. The analysis uses the respondents who rated each brand (“don’t know” is excluded).</li>
<li><strong>Cases</strong>: 251 respondents who rated MUJI.</li>
<li><strong>Conditions (X)</strong>: brand perceptions (“good quality,” “easy to mix and match,” “easy to walk into a physical store,” and “offers products that downplay trends” (hereafter, basic)). I selected them, from combinations that yield a solution at 7 or higher in MUJI’s data. Compared with part 2, “price” is dropped and “easy to walk into a physical store” is added. For each brand, respondents ticked every item they thought applied, and I split the cases into ticked and not ticked. The four conditions used here are <strong>an example of how to use the method</strong>. I picked them after looking at results, because they suit an illustration. In a real analysis, conditions must be set in advance, based on hypotheses or prior research.</li>
<li><strong>Consistency</strong>: among people holding a combination, the share who recommend (threshold 0.80 or higher). <strong>Coverage</strong>: among people who recommend, the share explained by the combination.</li>
<li><strong>Settings</strong> (same at every level): minimum number of cases 4; <strong>intermediate solution</strong> (for logical remainders, I assume that each perception contributes toward recommending, except “basic”, for which I assume no direction).</li>
<li><strong>Note</strong>: Beyond the items used here, I tried other combinations of four conditions, using other survey items as well. At 9 or higher, no combination yielded a sufficient condition. At 8 or higher, some combinations have an overall solution consistency of 0.80 or higher, but they explain very few people (6 or fewer of 72). This search used items that are not in the public CSV, so it cannot be reproduced with the public CSV.</li>
</ul>
</section>
<section id="results-sufficient-conditions-with-the-swapped-conditions" class="level2">
<h2 class="anchored" data-anchor-id="results-sufficient-conditions-with-the-swapped-conditions">Results: sufficient conditions with the swapped conditions</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>Recommend if score is</th>
<th>Share of respondents</th>
<th>Sufficient conditions</th>
<th>Consistency</th>
<th>Coverage</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>9 or higher</td>
<td>14%</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="even">
<td>8 or higher</td>
<td>29%</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="odd">
<td>7 or higher</td>
<td>46%</td>
<td>quality × basic / quality × versatile × easy store</td>
<td>0.82</td>
<td>0.16</td>
</tr>
<tr class="even">
<td>6 or higher</td>
<td>58%</td>
<td>quality × not versatile × not easy store / quality × versatile × easy store × not basic</td>
<td>0.85</td>
<td>0.24</td>
</tr>
<tr class="odd">
<td>5 or higher</td>
<td>79%</td>
<td>quality / basic / versatile × easy store</td>
<td>0.90</td>
<td>0.43</td>
</tr>
</tbody>
</table>
<p>(“/” means “or”. “Not X” means X was not ticked. Consistency and coverage in the table are values for the whole solution joined by “/”.) “Easy store” means “easy to walk into a physical store.”</p>
<ul>
<li>With the same 251 MUJI respondents, replacing “price” with “easy to walk into a physical store” produced a sufficient condition <strong>at 7 or higher</strong>, which part 2 could not. Note that this set of conditions was selected from the same data as one that yields a solution at 7 or higher.</li>
<li>Every sufficient condition at 7 or higher contains <strong>quality</strong>: a route in which quality is joined by the basic selection, and a route in which quality is joined by versatility and easy to walk into.</li>
<li>At 5 or higher, quality alone is sufficient.</li>
</ul>
</section>
<section id="a-marketing-reading-as-hypotheses" class="level2">
<h2 class="anchored" data-anchor-id="a-marketing-reading-as-hypotheses">A marketing reading (as hypotheses)</h2>
<p>What the results show is only which combinations of perceptions are held by people who recommend at each level. What follows is marketing interpretation drawn from that, and it remains a hypothesis.</p>
<ol type="1">
<li><strong>Swapping conditions changes the combinations we see.</strong> With part 2’s four conditions, no solution appeared at 7 or higher. After the swap, two routes containing quality appeared at 7 or higher. What we put into the analysis changes what we see.</li>
<li><strong>How “basic” appears differs by solution.</strong> The UNIQLO solutions contained “not basic,” and part of the MUJI solutions contains “basic.” However, the conditions entered differ, so a direct comparison is not possible. Few respondents ticked basic even for MUJI (8%). Also, the survey asked whether the brand “offers products that downplay trends,” and this survey alone cannot tell what that says about the brand.</li>
<li><strong>In practice, conditions are set in advance, based on your own hypotheses.</strong> Here I use conditions chosen after seeing results, to show that swapping conditions changes the results. In a real analysis, you would run the analysis with conditions set beforehand and show how results differ when conditions change, as a sensitivity analysis.</li>
<li><strong>A sufficient condition covers only “part” of the routes to recommendation.</strong> 22 respondents hold one of the solution’s routes, and 18 of them score 7 or higher (consistency 0.82). On the other hand, of the 116 respondents who score 7 or higher, only 18 hold one of these routes (about 16%, coverage 0.16).</li>
</ol>
</section>
<section id="cautions" class="level2">
<h2 class="anchored" data-anchor-id="cautions">Cautions</h2>
<ul>
<li>The conditions are an example chosen after seeing MUJI’s results. Until checked on other data, the findings remain hypotheses.</li>
<li>“No sufficient condition” does not mean “no reason exists.”</li>
<li>This is an online survey run as part of a lecture (N = 300), and the sample does not represent consumers in general.</li>
</ul>
</section>
<section id="reproducible-code-r" class="level2">
<h2 class="anchored" data-anchor-id="reproducible-code-r">Reproducible code (R)</h2>
<p>Data (same folder): <a href="fashion_muji.csv">fashion_muji.csv</a></p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(QCA); <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb1-2">dat   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read.csv</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fashion_muji.csv"</span>)</span>
<span id="cb1-3">conds <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUALITY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"VERSATILE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EASYSTORE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>)</span>
<span id="cb1-4">res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> dat, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"REC"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> conds,</span>
<span id="cb1-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb1-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setNames</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">length</span>(conds)), conds),</span>
<span id="cb1-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dir.exp =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(conds <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span>),</span>
<span id="cb1-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.80</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb1-9">res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"thrY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"expression"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"inclS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"covS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n_solutions"</span>)]</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  thrY                                                         expression
1    5                              QUALITY + BASIC + VERSATILE*EASYSTORE
2    6 QUALITY*~VERSATILE*~EASYSTORE + QUALITY*VERSATILE*EASYSTORE*~BASIC
3    7                        QUALITY*BASIC + QUALITY*VERSATILE*EASYSTORE
4    8                                                        No solution
5    9                                                        No solution
      inclS      covS n_solutions
1 0.9042553 0.4271357           1
2 0.8536585 0.2413793           1
3 0.8181818 0.1551724           1
4        NA        NA           0
5        NA        NA           0</code></pre>
</div>
</div>
<p>Paper: Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. https://doi.org/10.1007/s11135-026-03092-3</p>
</section>
<section id="what-to-read-next" class="level2">
<h2 class="anchored" data-anchor-id="what-to-read-next">What to read next</h2>
<ul>
<li><a href="../../posts/thsqca-case-muji-same-conditions/index.html">Part 2: MUJI with UNIQLO’s conditions</a></li>
<li><a href="../../posts/thsqca-case-overview/index.html">Begin here: ThS-QCA Case Study</a></li>
</ul>
</section>
<section id="r-environment-for-this-page" class="level2">
<h2 class="anchored" data-anchor-id="r-environment-for-this-page">R environment for this page</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sessionInfo</span>()</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>R version 4.6.1 (2026-06-24 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26300)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=Japanese_Japan.utf8  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] ThSQCA_2.0.9 QCA_3.25.5   admisc_0.41 

loaded via a namespace (and not attached):
 [1] digest_0.6.39     fastmap_1.2.0     xfun_0.60         knitr_1.52       
 [5] htmltools_0.5.9   rmarkdown_2.32    cli_3.6.6         venn_1.13        
 [9] declared_0.27     compiler_4.6.1    rstudioapi_0.19.0 tools_4.6.1      
[13] evaluate_1.0.5    yaml_2.3.12       otel_0.2.0        rlang_1.3.0      
[17] jsonlite_2.0.0    htmlwidgets_1.6.4</code></pre>
</div>
</div>


</section>

 ]]></description>
  <category>marketing</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-case-muji-swap/</guid>
  <pubDate>Thu, 05 Nov 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-case-muji-swap/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>ThS-QCA Case Study: Sufficient Conditions by “Recommend” Level for UNIQLO and MUJI (Begin Here)</title>
  <link>https://im-research-yt.github.io/posts/thsqca-case-overview/</link>
  <description><![CDATA[ 





<p><em>Start with this article. Each part can be read from the links below.</em></p>
<p>How many points out of 10 should count as “I recommend this brand to friends and acquaintances”? The Net Promoter Score uses 9 or higher, but when this cut-off moves, the combinations of conditions that lead to recommendation (sufficient conditions) change. This series shows that with survey data on UNIQLO and MUJI.</p>
<section id="what-is-ths-qca" class="level2">
<h2 class="anchored" data-anchor-id="what-is-ths-qca">What is ThS-QCA?</h2>
<p>Qualitative Comparative Analysis (QCA) asks which combinations of conditions are sufficient for an outcome. Threshold-Sweep QCA (ThS-QCA) moves the cut-off for the outcome (here, how strongly people would recommend the brand) step by step and lists the sufficient conditions at each step (Toyoda, 2026, <em>Quality &amp; Quantity</em>). In this series, I use ThS-QCA to move the threshold on the outcome side. It does not look for one optimal threshold; it shows how the picture changes with the threshold. It runs with the R package ThSQCA (available on CRAN).</p>
</section>
<section id="data" class="level2">
<h2 class="anchored" data-anchor-id="data">Data</h2>
<ul>
<li>A casual fashion survey (N = 300) that I ran in June 2026 for the lecture “Marketing 2” at the Graduate School of Innovation Management, Hosei University, fielded by Freeasy. Part of it is released for these case studies (reproducible CSVs: <code>fashion_uniqlo.csv</code>, <code>fashion_muji.csv</code>).</li>
<li>Respondents had not answered “not conscious at all” about choosing casual fashion brands in the screening survey. The sample does not represent consumers in general.</li>
<li>Outcome (Y): “How strongly would you recommend this brand to friends and acquaintances?” (0 = would not recommend at all, 10 = would definitely recommend).</li>
<li>Conditions (X): from items where respondents ticked every item they thought applied to each brand, I take five: “affordable price range,” “good quality,” “easy to mix and match,” “easy to walk into a physical store,” and “offers products that downplay trends” (hereafter, basic). Each analysis uses four of them. Parts 1 and 2 use price, quality, versatility and basic. Part 3 drops price and adds easy to walk into a physical store, so it uses quality, versatility, easy store and basic.</li>
</ul>
</section>
<section id="an-important-note-on-conditions" class="level2">
<h2 class="anchored" data-anchor-id="an-important-note-on-conditions">An important note on conditions</h2>
<p>The survey has other items, but here I take five items as an example of how to use the method, and each analysis uses four of them. I picked them after looking at results, because they suit an illustration. <strong>In a real analysis, conditions must be set in advance, based on hypotheses or prior research.</strong></p>
</section>
<section id="the-parts" class="level2">
<h2 class="anchored" data-anchor-id="the-parts">The parts</h2>
<ol type="1">
<li><strong><a href="../../posts/thsqca-case-uniqlo/index.html">Part 1, UNIQLO</a></strong>: move the “recommend” level from 9 down to 5 and list the sufficient conditions.</li>
<li><strong><a href="../../posts/thsqca-case-muji-same-conditions/index.html">Part 2, MUJI with UNIQLO’s conditions</a></strong>: change only the brand, with the same conditions and settings.</li>
<li><strong><a href="../../posts/thsqca-case-muji-swap/index.html">Part 3, swapping conditions with the same MUJI data</a></strong>: fix the brand and swap the conditions entered into the analysis.</li>
</ol>
</section>
<section id="two-findings" class="level2">
<h2 class="anchored" data-anchor-id="two-findings">Two findings</h2>
<ol type="1">
<li><strong>Changing the recommendation level changes the solution.</strong> For UNIQLO, the solutions at 8 or higher contain price, quality and versatility together. When the level is lowered to 5 or higher, shorter combinations appear.</li>
<li><strong>Changing the conditions entered into the analysis changes the solution.</strong> With the four shared conditions, no solution met the criterion for MUJI at 7 or higher. With the same 251 respondents, replacing price with “easy to walk into a physical store” produced two routes containing quality at 7 or higher.</li>
</ol>
<p>At 9 or higher, the conditions tried here yield no sufficient condition. This does not mean nothing can be done; the chosen conditions may simply not include the drivers of the highest ratings.</p>
</section>
<section id="settings" class="level2">
<h2 class="anchored" data-anchor-id="settings">Settings</h2>
<p>Minimum number of cases 4; consistency threshold 0.80; intermediate solution (no directional assumption for “basic”).</p>
<p>Paper: Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. https://doi.org/10.1007/s11135-026-03092-3</p>


</section>

 ]]></description>
  <category>marketing</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-case-overview/</guid>
  <pubDate>Thu, 05 Nov 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-case-overview/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Trying ThS-QCA (1) UNIQLO: Moving the “Recommend” Level from 9 Down to 5</title>
  <link>https://im-research-yt.github.io/posts/thsqca-case-uniqlo/</link>
  <description><![CDATA[ 





<p><em>Series part 1. Written to be read on its own.</em></p>
<p>In the Net Promoter Score, people who give 9 or higher on a 0 to 10 recommendation scale are called “promoters.” What happens to the sufficient conditions for recommending UNIQLO if we move this level to 8, 7, 6 and 5?</p>
<section id="method-and-data-common-to-the-series" class="level2">
<h2 class="anchored" data-anchor-id="method-and-data-common-to-the-series">Method and data (common to the series)</h2>
<ul>
<li><strong>Method</strong>: Threshold-Sweep QCA (ThS-QCA). I move the cut-off (threshold) on “how strongly would you recommend this brand to friends and acquaintances” (0 to 10; 0 = would not recommend at all, 10 = would definitely recommend) and list the <strong>sufficient conditions</strong> at each cut-off (combinations of conditions whose holders mostly end up recommending the brand; Toyoda, 2026, <em>Quality &amp; Quantity</em>). It does not search for one optimal threshold.</li>
<li><strong>Data</strong>: A casual fashion survey (N = 300) that I ran in June 2026 for the lecture “Marketing 2” at the Graduate School of Innovation Management, Hosei University, fielded by Freeasy; part of it is released for these case studies. Respondents had not answered “not conscious at all” about choosing casual fashion brands in the screening survey, so the sample does not represent consumers in general. The analysis uses the respondents who rated each brand (“don’t know” is excluded).</li>
<li><strong>Cases</strong>: 267 respondents who rated UNIQLO.</li>
<li><strong>Conditions (X)</strong>: brand perceptions (“affordable price range,” “good quality,” “easy to mix and match,” and “offers products that downplay trends” (hereafter, basic)). For each brand, respondents ticked every item they thought applied, and I split the cases into ticked and not ticked. The four conditions used here are <strong>an example of how to use the method</strong>. I picked them after looking at results, because they suit an illustration. In a real analysis, conditions must be set in advance, based on hypotheses or prior research.</li>
<li><strong>Consistency</strong>: among people holding a combination, the share who recommend (threshold 0.80 or higher). <strong>Coverage</strong>: among people who recommend, the share explained by the combination.</li>
<li><strong>Settings</strong> (same at every level): minimum number of cases 4; <strong>intermediate solution</strong> (for logical remainders, I assume that each perception contributes toward recommending, except “basic”, for which I assume no direction).</li>
</ul>
</section>
<section id="results-sufficient-conditions-from-9-down-to-5" class="level2">
<h2 class="anchored" data-anchor-id="results-sufficient-conditions-from-9-down-to-5">Results: sufficient conditions from 9 down to 5</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>Recommend if score is</th>
<th>Share of respondents</th>
<th>Sufficient conditions</th>
<th>Consistency</th>
<th>Coverage</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>9 or higher</td>
<td>18%</td>
<td>none</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr class="even">
<td>8 or higher</td>
<td>41%</td>
<td>price × quality × versatile × not basic</td>
<td>0.81</td>
<td>0.19</td>
</tr>
<tr class="odd">
<td>7 or higher</td>
<td>58%</td>
<td>price × quality × versatile × not basic</td>
<td>0.88</td>
<td>0.15</td>
</tr>
<tr class="even">
<td>6 or higher</td>
<td>67%</td>
<td>price × versatile × not basic / quality × not versatile × not basic</td>
<td>0.89</td>
<td>0.39</td>
</tr>
<tr class="odd">
<td>5 or higher</td>
<td>86%</td>
<td>price × not basic / quality × not basic / versatile × not basic / price × quality × versatile</td>
<td>0.93</td>
<td>0.66</td>
</tr>
</tbody>
</table>
<p>(“/” means “or”. “Not X” means X was not ticked. Consistency and coverage in the table are values for the whole solution joined by “/”.) “Not basic” means that “offers products that downplay trends” was not ticked.</p>
<ul>
<li>At 5 or higher, as long as the brand is not seen as basic, any one of price, quality or versatility is enough (when all three hold together, basic does not matter). The conditions are loose and take many forms.</li>
<li>At 7 or 8 or higher, the sufficient condition is that, with the brand not seen as basic, <strong>price, quality and versatility all hold</strong>.</li>
<li>At 9 or higher, these four conditions yield no sufficient condition.</li>
</ul>
<p>The higher the target, the stricter the sufficient condition becomes: from “any one of them” to “several together.”</p>
</section>
<section id="a-marketing-reading-as-hypotheses" class="level2">
<h2 class="anchored" data-anchor-id="a-marketing-reading-as-hypotheses">A marketing reading (as hypotheses)</h2>
<p>What the results show is only which combinations of perceptions are held by people who recommend at each level. What follows is marketing interpretation drawn from that, and it remains a hypothesis.</p>
<ol type="1">
<li><strong>The lower the level, the shorter the combinations that appear in the solution.</strong> The solutions at 8 or higher (41% of respondents) contained price, quality and versatility together. When the level is defined as 5 or higher (86%), shorter combinations appear: with the brand not seen as basic, any one of price, quality or versatility is part of a solution. People who recommend at high scores appear to hold several perceptions at once.</li>
<li><strong>“Not basic” appears in the solutions at every level.</strong> Not ticking “offers products that downplay trends” is part of every solution. However, this survey alone cannot tell what not ticking this item says about how people see the brand. It cannot be read as “they feel novelty or trendiness.”</li>
<li><strong>A sufficient condition covers only “part” of the routes to recommendation.</strong> 26 respondents hold “price × quality × versatile × not basic,” and 23 of them score 7 or higher (consistency 0.88). On the other hand, of the 154 respondents (58%) who score 7 or higher, only 23 hold this combination (about 15%, coverage 0.15). Most people who score 7 or higher recommend through other routes. Actions that only satisfy this combination will not necessarily increase recommenders by much.</li>
</ol>
</section>
<section id="cautions" class="level2">
<h2 class="anchored" data-anchor-id="cautions">Cautions</h2>
<ul>
<li>“No sufficient condition” does not mean “no reason exists.” The chosen conditions may simply not include the drivers of the highest ratings. With other conditions, the results would change.</li>
<li>The four conditions are an example (in a real analysis they are set in advance, as noted above).</li>
<li>This is an online survey run as part of a lecture (N = 300), and the sample does not represent consumers in general.</li>
</ul>
</section>
<section id="reproducible-code-r" class="level2">
<h2 class="anchored" data-anchor-id="reproducible-code-r">Reproducible code (R)</h2>
<p>Data (same folder): <a href="fashion_uniqlo.csv">fashion_uniqlo.csv</a></p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(QCA); <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb1-2">dat   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">read.csv</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fashion_uniqlo.csv"</span>)</span>
<span id="cb1-3">conds <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRICE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUALITY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"VERSATILE"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>)</span>
<span id="cb1-4">res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> dat, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"REC"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> conds,</span>
<span id="cb1-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb1-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">setNames</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">length</span>(conds)), conds),</span>
<span id="cb1-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dir.exp =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(conds <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"BASIC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1"</span>),</span>
<span id="cb1-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.80</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb1-9">res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"thrY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"expression"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"inclS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"covS"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n_solutions"</span>)]</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  thrY
1    5
2    6
3    7
4    8
5    9
                                                                  expression
1 PRICE*~BASIC + QUALITY*~BASIC + VERSATILE*~BASIC + PRICE*QUALITY*VERSATILE
2                         PRICE*VERSATILE*~BASIC + QUALITY*~VERSATILE*~BASIC
3                                             PRICE*QUALITY*VERSATILE*~BASIC
4                                             PRICE*QUALITY*VERSATILE*~BASIC
5                                                                No solution
      inclS      covS n_solutions
1 0.9263804 0.6565217           1
2 0.8860759 0.3888889           1
3 0.8846154 0.1493506           1
4 0.8076923 0.1926606           1
5        NA        NA           0</code></pre>
</div>
</div>
<p>Paper: Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. https://doi.org/10.1007/s11135-026-03092-3</p>
</section>
<section id="what-to-read-next" class="level2">
<h2 class="anchored" data-anchor-id="what-to-read-next">What to read next</h2>
<ul>
<li><a href="../../posts/thsqca-case-muji-same-conditions/index.html">Part 2: MUJI with UNIQLO’s conditions</a></li>
<li><a href="../../posts/thsqca-case-overview/index.html">Begin here: ThS-QCA Case Study</a></li>
</ul>
</section>
<section id="r-environment-for-this-page" class="level2">
<h2 class="anchored" data-anchor-id="r-environment-for-this-page">R environment for this page</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sessionInfo</span>()</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>R version 4.6.1 (2026-06-24 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26300)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=Japanese_Japan.utf8  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] ThSQCA_2.0.9 QCA_3.25.5   admisc_0.41 

loaded via a namespace (and not attached):
 [1] digest_0.6.39     fastmap_1.2.0     xfun_0.60         knitr_1.52       
 [5] htmltools_0.5.9   rmarkdown_2.32    cli_3.6.6         venn_1.13        
 [9] declared_0.27     compiler_4.6.1    rstudioapi_0.19.0 tools_4.6.1      
[13] evaluate_1.0.5    yaml_2.3.12       otel_0.2.0        rlang_1.3.0      
[17] jsonlite_2.0.0    htmlwidgets_1.6.4</code></pre>
</div>
</div>


</section>

 ]]></description>
  <category>marketing</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-case-uniqlo/</guid>
  <pubDate>Thu, 05 Nov 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-case-uniqlo/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Before adding latent variables: what scale building and path analysis can do</title>
  <link>https://im-research-yt.github.io/posts/before-latent-variables/</link>
  <description><![CDATA[ 





<!--
Publishing notes (delete before publishing; HTML comments do not appear on the page)
1. The two videos are placed in Section 3. Move them if you prefer another position.
2. categories is a proposal: [marketing, notes]. Do not add R (this article has no R code and is not for R-bloggers).
3. The slug is a proposal: before-latent-variables.
-->
<p>The previous article, “From survey items to a scale, then on to regression and QCA: a step-by-step guide,” described a path from several survey items through factor analysis, Cronbach’s alpha, and subscale scores to regression analysis. This article is its sequel.</p>
<p>For some time, graduate students and other researchers have asked me the same kind of question: “If we are working with constructs, shouldn’t we use SEM with latent variables (rather than regression or path analysis) instead of first building factor scores or subscales through factor analysis?” Sometimes the question comes from someone who understands the mathematics. In what I have seen and heard, however, a common reason is a non-essential one, such as “SEM looks cooler” (a person who really understands SEM would not ask the question in the first place). I also hear of cases where, in graduate supervision, a student was simply told, “Let’s go with SEM (with latent variables) for now.”</p>
<p>This article is <strong>my own answer</strong> to that question. My position can be summarized in one point.</p>
<blockquote class="blockquote">
<p><strong>A model with latent variables is not a “higher version” of analysis. There are questions that only latent variables can answer, but they also bring more assumptions, more judgment calls, and more responsibility in estimation. Therefore, I think such a model should be used when it is needed.</strong></p>
</blockquote>
<p>Of course, this does not mean “do not use models with latent variables.” It means that if you use one, you should be able to explain in your own words why you are using it. The more advanced the method, the more serious a mistake made without understanding the reasoning tends to be.</p>
<p>If you do not include latent variables and use subscale scores instead, the measurement error contained in the scores can make the coefficients in the structural part smaller than they should be, or biased. I am aware of this. I still recommend that beginners start with scale building. The reason is that adding latent variables increases the assumptions, the judgments, and the responsibility in estimation, and that using such a model without being able to explain these brings a different kind of problem. I do acknowledge that a latent-variable model is one answer to the problem of measurement error. What I would like readers to do is check, against their own research question, whether that answer is needed (Question A in Section 4). That is the point of this article.</p>
<p>There are many opinions about how to use SEM. Please read every claim below as meaning “I (Toyoda) think that …”.</p>
<hr>
<section id="terms-the-issue-is-not-sem-or-not" class="level2">
<h2 class="anchored" data-anchor-id="terms-the-issue-is-not-sem-or-not">1. Terms: the issue is not “SEM or not”</h2>
<p>First, let me align the terms. If they stay vague, the later discussion will not connect.</p>
<p><strong>SEM (structural equation modeling)</strong> is the name of a broad framework that expresses and estimates the relations among several variables as one unified model. Several kinds of models belong to it.</p>
<ul>
<li><strong>Models with observed variables only (path analysis):</strong> These use only variables that were actually measured (including subscale scores built from them) and estimate the relations among them. (Multiple regression can be seen as a special case of path analysis.) In other words, path analysis is also part of SEM in the broad sense.</li>
<li><strong>Models with latent variables:</strong> A construct that cannot be measured directly is placed in the model as a “latent variable,” and several observed items are assumed to measure it. The part of the model that links items to a latent variable is called the <strong>measurement model</strong>. When relations among latent variables are added, we also handle the <strong>structural model</strong> (the part that describes the relations among constructs).</li>
<li><strong>Confirmatory factor analysis (CFA)</strong> is one kind of latent-variable model. It contains latent variables, but it may have no structural model.</li>
</ul>
<p>For this reason, I avoid the phrase “use SEM or not” in this article. Saying it invites the fair objection that path analysis is also a kind of SEM. The issue of this article is one point.</p>
<blockquote class="blockquote">
<p><strong>Whether to put latent variables into the model.</strong></p>
</blockquote>
<p>A method that builds scales in advance and then runs regression or path analysis with subscale scores does not put latent variables into the model. In this article I call it the “observed-variable model.” A method that does put latent variables in is called the “latent-variable model.”</p>
<p>Note that “not putting latent variables in” does not mean that factor analysis is not used when you examine a scale. Factor analysis itself is a latent-variable model. The article distinguishes two things. One is a method in which factor analysis and similar tools are used at the measurement stage to build a scale, and the resulting scores are then treated as observed variables in regression or path analysis. The other is a method in which the measurement model is built into the structural model, and the relations among latent variables are estimated.</p>
<p>In this article I also write “association” for the links between variables. Arrows in path analysis and regression coefficients do not show causal relations when the data are cross-sectional survey data (observational data). This is the same whether the model has latent variables or only observed variables.</p>
<hr>
</section>
<section id="why-does-latent-variables-for-everything-happen-so-easily" class="level2">
<h2 class="anchored" data-anchor-id="why-does-latent-variables-for-everything-happen-so-easily">2. Why does “latent variables for everything” happen so easily?</h2>
<p>From what I have seen and heard, I think the reasons fall roughly into the following three (this is my observation, not the result of a survey).</p>
<ol type="1">
<li><strong>Because you see it in papers.</strong> Academic papers often use models with latent variables. They look like “proper academic analysis,” so people want to imitate them.</li>
<li><strong>Because you think that constructs exist.</strong> You are dealing with a concept such as “brand trust,” so making it a latent variable feels natural. But having a construct and using a latent variable in the analysis are different things. As the previous article explained, defining a construct first, measuring it with several items, checking reliability, and using subscale scores is also a way of taking constructs seriously.</li>
<li><strong>Because software makes it easy.</strong> With software such as AMOS, you draw a diagram, press a button, and get results. (If you wrote out the structural equations, you would see the complexity, but drawing the model as a diagram makes it look simple.) Being able to run a model and being able to explain its results are different things.</li>
</ol>
<p>None of these reasons comes from the research question. The method comes first. I would like the order to be the opposite: first the question, then the conditions of measurement, and only after that the choice of method.</p>
<hr>
</section>
<section id="what-increases-when-latent-variables-are-added" class="level2">
<h2 class="anchored" data-anchor-id="what-increases-when-latent-variables-are-added">3. What increases when latent variables are added?</h2>
<p>Adding latent variables increases the expressive power of the model. At the same time, <strong>the number of things you must judge yourself increases.</strong></p>
<section id="an-analogy-think-of-arrows-as-springs" class="level3">
<h3 class="anchored" data-anchor-id="an-analogy-think-of-arrows-as-springs">An analogy: think of arrows as springs</h3>
<p>To understand models with latent variables intuitively, I use the following analogy (in lectures I sometimes say that the springs go “boing,” stretching and shrinking). It is only an image, not a rigorous explanation.</p>
<p>Think of each arrow in the model as a <strong>spring</strong>. Each spring represents a relation between variables. The strength of the spring is the estimate. When many springs are connected, changing the strength of one spring pulls on the others, and the whole system readjusts. The system then settles at a <strong>balanced position</strong> (the position where the computation settles). That position is the estimate that is finally reported.</p>
<video controls="" preload="metadata" playsinline="" style="width:100%;max-width:100%;height:auto;">
  <source src="spring_1_observed_en.mp4" type="video/mp4">
</video>
<p><em>Video 1: a model with observed variables only. The numbers and the motion are illustrative.</em></p>
<p>As the springs increase and tangle with one another, a poorly specified part at one place can pass its distortion on to the other springs, and the system can <strong>balance at an unexpected position</strong>. Because it is balanced, the result looks “settled and plausible.”</p>
<p>In real models, something close to this happens in the following forms.</p>
<ul>
<li>When the specification of the structural part changes, the estimates in the measurement part can move too (interpretational confounding; Burt, 1976).</li>
<li>Estimation does not converge, or an improper solution such as a negative variance appears.</li>
<li>Other models of a different form fit equally well (equivalent models; MacCallum et al., 1993).</li>
</ul>
<p>Let me separate three things here: “the computation settling (convergence),” “fitting the data well (fit),” and “being theoretically valid.” They are different things. Even if the springs are balanced and settled, that is not necessarily the <strong>right position</strong>. A model can converge and still fit poorly, and a model can fit well and still lack theoretical validity.</p>
<p><strong>Limits of the analogy:</strong> Actual estimation is not a physical phenomenon in which springs sway and move. It is a computation that searches for numbers that make the gap between the data and the model as small as possible. Nor does “many springs” mean “a bad model.” Complex models are also powerful. The point of the analogy is that, as models become more complex, everything moves together, so <strong>it becomes harder to check by yourself where and what is happening.</strong></p>
<section id="continuing-the-analogy-fixed-points-and-invisible-joints" class="level4">
<h4 class="anchored" data-anchor-id="continuing-the-analogy-fixed-points-and-invisible-joints">Continuing the analogy: fixed points and invisible joints</h4>
<p>Each spring has “points” at both ends. There are two kinds of points.</p>
<ul>
<li><strong>An observed variable is a fixed point whose position is set by the data.</strong> Its position does not move (this is an analogy, so it is an image).</li>
<li><strong>A latent variable is an invisible joint that is not directly observed.</strong> Its position is not set by the data, so where to place it is also decided inside the model, while looking at the relations as a whole. (The “position” here is not a coordinate in real space. It is an image of how to place the cluster that appears in common across several items.)</li>
</ul>
<p>If you only connect fixed points with springs, the points do not move, so mainly the strength of the springs changes. Even so, springs attached to the same point move together. If you remove or add one spring, the strength of other springs can also change.</p>
<p>Adding invisible joints changes the situation. Where the joint is placed and how strong the attached springs are must be decided at the same time, while looking at the whole. So when you change one connection, the placement of the invisible joint changes too, and the estimates of other relations attached to it can be affected. And because the joint is invisible, it becomes harder to confirm from the outside “where, and what, moved.”</p>
<video controls="" preload="metadata" playsinline="" style="width:100%;max-width:100%;height:auto;">
  <source src="spring_2_latent_en.mp4" type="video/mp4">
</video>
<p><em>Video 2: a model with a latent variable. The numbers and the motion are illustrative.</em></p>
<p>So how does the procedure of building a scale (“measurement”: factor analysis, alpha, subscale scores; see the previous article) look in this analogy? Building a subscale can be seen as a method that, instead of moving the invisible joint itself inside the model, creates a representative value from several items (the mean of the items) and treats it as one observed point (a fixed point). Before fixing it, we check whether the group of items is sensible, using factor analysis and alpha. After this check, we connect the fixed points with springs (regression or path analysis).</p>
<p>Connecting everything at once, with the invisible joints still included from the start, is powerful. However, you must judge by yourself whether the balanced position is valid. As the first route for a beginner, I think fixing first and checking one step at a time is suitable.</p>
<p><strong>Limits of this continued analogy:</strong> The observed-variable model analyzes with positions fixed. But we can think that “the fixed points are actually wobbling a little, by the amount of measurement error” (this is dealt with under Question A in Section 4). The latent-variable model tries to handle even that wobble inside the model. That holds, however, only when the assumptions of the measurement model are satisfied. Nor does the analogy mean that “the observed-variable model is safe.” Even with fixed points only, when the springs increase, everything moves together, and other ways of connecting that fit equally well appear.</p>
</section>
<section id="how-the-analogy-maps-onto-the-later-discussion" class="level4">
<h4 class="anchored" data-anchor-id="how-the-analogy-maps-onto-the-later-discussion">How the analogy maps onto the later discussion</h4>
<ul>
<li>“Interpretational confounding” corresponds to the placement of an invisible joint being changed by the pull of other springs.</li>
<li>“Checking measurement first (the two-step procedure)” corresponds to checking the invisible joint first, and handling it afterward.</li>
<li>The situations in which “there is a reason to consider a latent-variable model” correspond to situations where you want to handle even the wobble of the fixed points (measurement error) inside the model, or where you want to examine the relations among invisible joints themselves.</li>
</ul>
</section>
</section>
<section id="examples-of-increased-judgments" class="level3">
<h3 class="anchored" data-anchor-id="examples-of-increased-judgments">Examples of increased judgments</h3>
<p>Here are four examples of judgments that increase. None of them is entirely absent from observed-variable models. But adding latent variables changes their weight greatly.</p>
<p><strong>(1) Identification:</strong> This is the question of whether the number of unknowns in the model (the number of parameters to estimate) can be determined uniquely from the data. In a model where it cannot, the estimates are not determined. Observed-variable models also have identification problems, but with latent variables there are more points to decide, such as setting the unit of each latent variable.</p>
<p><strong>(2) Balance between sample size and model complexity:</strong> In models with latent variables, the number of parameters to estimate often increases, so the balance between sample size and model complexity must be considered more carefully. The necessary sample size varies greatly with the number of factors, the number of indicators, the size of the factor loadings, the size of the path coefficients, the presence of missing data, the estimation method, and so on. A uniform rule of thumb is considered inappropriate. This article does not give numbers.</p>
<p><strong>(3) How to read model fit:</strong> In models with latent variables, the match between the data and the model (model fit) is examined with several indices. Each index has its own meaning and limits, and there is no simple standard such as “this value is good.” There is also criticism of treating cutoff values as mechanical pass criteria.</p>
<p><strong>(4) The relation between the measurement part and the structural part:</strong> In a typical latent-variable model, the measurement part and the structural part are in the end estimated within one model. As a result, the meaning of a latent variable is influenced not only by its own items but also by its relations with the other variables in the model. For example, when the specification of the structural part changes, the estimates of the measurement part (for example, factor loadings) also change, and the interpretation of what that latent variable substantively represents can change too. This is called the problem of “interpretational confounding.” Burt (1976) discussed, as this problem, that a latent variable can come to be given, in the course of estimation, a meaning different from the one the researcher gave it in advance.</p>
<p>There is also an idea of checking the measurement part first and then estimating the structural part (the two-step procedure). Anderson &amp; Gerbing (1988) recommend first estimating and checking the measurement model, and take the position that being able to estimate in one step does not necessarily make it desirable. As a method that estimates the measurement part and the structural part separately, SAM (Rosseel &amp; Loh, 2024) has been proposed. For SAM, the authors list as advantages that it is robust to local misspecification of the model, that convergence problems are less likely even with small samples, and that when the model is correctly specified the finite-sample bias is small. The authors position SAM as an estimation method, and distinguish it from the two-step procedure as a way of building a model. Let me state the difference in one sentence. In the procedure of regressing on mean scale scores, measurement error is not explicitly handled in the later model. SAM separates measurement and structure, but treats measurement error as a latent-variable model. They are similar in that “measurement comes first,” but they are not the same method. A latent-variable model does not necessarily “estimate everything at once.”</p>
<p>In an observed-variable model, building the scale (measurement) and running the regression or path analysis (structure) are done in separate stages. The results of each stage can be checked separately. I think this ease of separation is a great advantage for beginners.</p>
<hr>
</section>
</section>
<section id="when-latent-variables-are-needed-and-when-they-can-be-avoided" class="level2">
<h2 class="anchored" data-anchor-id="when-latent-variables-are-needed-and-when-they-can-be-avoided">4. When latent variables are needed and when they can be avoided</h2>
<p>This section is the center of the article. It is also probably the part most open to debate. For that reason, I write the judgment in <strong>two stages</strong>.</p>
<blockquote class="blockquote">
<p><strong>Stage 1: Is there a need to use latent variables?</strong> <strong>Stage 2: Can the model be estimated and interpreted properly?</strong></p>
</blockquote>
<p>These are different questions. Stage 1 asks “is there a reason to use them?” and Stage 2 asks “are the conditions for using them in place?” For example, having a sufficient sample size is a Stage 2 condition. A sufficient sample size does not become a Stage 1 “reason to use.” Conversely, even if there is a reason at Stage 1, it is difficult to use the model if the Stage 2 conditions are not in place.</p>
<section id="stage-1-is-there-a-need-to-use-latent-variables" class="level3">
<h3 class="anchored" data-anchor-id="stage-1-is-there-a-need-to-use-latent-variables">4.1 Stage 1: Is there a need to use latent variables?</h3>
<p>First, let me describe a way of drawing the line that I think is not appropriate (this is only my opinion).</p>
<p>The division “use an observed-variable model when you want to know the size of associations between variables, and a latent-variable model when you want to know the structure among constructs” is often seen. But I think this division is not appropriate. This is because a regression or path analysis with subscale scores is also, in practice, examining associations among constructs. The type of research question alone cannot separate the two.</p>
<p>I place the dividing line not on the type of question but on <strong>how measurement is handled</strong>. Specifically, I judge from the following three questions.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Question</th>
<th>When I think an observed-variable model (that is, path analysis) is enough</th>
<th>When it is a reason to consider a latent-variable model</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>A. Do I need to estimate associations among constructs after explicitly modeling measurement error?</td>
<td>Reliability of the scales is sufficiently high, and I can judge that the effect of measurement error does not change the conclusion</td>
<td>The effect of measurement error could change the conclusion, and I want to take that effect into account explicitly</td>
</tr>
<tr class="even">
<td>B. Is the measurement model itself the object of the research?</td>
<td>An existing scale or my own scale is used as a tool</td>
<td>I want to check the structure of the scale (the relation between items and constructs) as the center of the research</td>
</tr>
<tr class="odd">
<td>C. Do I need to verify that a scale has the same meaning across groups?</td>
<td>No group comparison; or equivalence is assumed, and I can state its basis and limits</td>
<td>Group comparison is central to the conclusion, and equivalence cannot be left as an assumption</td>
</tr>
</tbody>
</table>
<p>This table is of course not a ranking of methods. It is for organizing the <strong>fit between a question and the conditions</strong>. Also, “an observed-variable model is enough” does not mean “a latent-variable model should be avoided.” It means “if you cannot explain the need, there is no hurry.”</p>
</section>
<section id="explaining-each-question-of-stage-1" class="level3">
<h3 class="anchored" data-anchor-id="explaining-each-question-of-stage-1">4.2 Explaining each question of Stage 1</h3>
<p><strong>Question A: Is there a need to take measurement error into account explicitly?</strong></p>
<p>In an observed-variable model, the subscale score is treated as a value without error. In fact, the score contains measurement error.</p>
<p>When there is measurement error, in a regression with one explanatory variable the coefficient tends to come out smaller than it should (this is called attenuation). When there are several explanatory variables and they are correlated, the situation is a little more complicated. The measurement error of one variable can bias the coefficients of other variables, and the direction of the bias can be either upward or downward. Rosseel &amp; Loh (2024) also point out that measurement error remains in scale scores and factor scores, and that this can bias the regression coefficients in the structural part.</p>
<p>The size of this effect depends on the reliability of the scale. High reliability is a favorable condition for using an observed-variable model. But that alone does not let us judge that measurement error does not affect the conclusion, because the correlations among explanatory variables and other factors also bear on how large the effect on the coefficients is.</p>
<p>There is one thing I want to emphasize here. <strong>Low reliability is not solved by putting the scale into a latent-variable model.</strong> If reliability is low, the first thing to doubt is how the scale measures. You need to review the meaning of the items, the number of items, and how easy they are to answer. Putting a poor scale into a latent-variable model does not rescue it. However, reviewing the scale and the need to take measurement error into account are compatible. If, after improving the scale, the effect of measurement error could still change the conclusion, that is a reason to use latent variables.</p>
<p>A latent-variable model does not “remove” measurement error as if by magic. Under the assumptions of a specific measurement model, it models measurement error explicitly. So when the assumptions of the measurement model do not hold, the results also become difficult to interpret.</p>
<p>A high alpha is also not the whole of sufficient evidence for reliability. Alpha is one indicator of reliability, and it is also affected by the number of items and the nature of the items. The judgment should include, besides alpha, the content of the scale (the meaning of the items, stability over repeated measurement, and so on).</p>
<p><strong>Question B: Is the measurement model itself the object of the research?</strong></p>
<p>In a study that develops a new scale and puts the structure of measurement at the center of the paper, a model with latent variables (such as confirmatory factor analysis) is a natural choice. On the other hand, in a study that borrows an existing scale as a tool, verifying the structure of measurement is not the center of the research. In this case, I think it is reasonable to consider first the procedure of checking the scale and then building subscales.</p>
<p><strong>Question C: Do I need to examine measurement invariance?</strong></p>
<p>Suppose you want to check “whether a scale measures with the same meaning for men and women, or across countries.” To compare means across groups, the scale must have the same meaning across groups. This is called an examination of measurement invariance, and it is a representative analysis done with latent-variable models.</p>
<p>Simply comparing subscale scores cannot answer this question directly. However, there are methods related to measurement invariance outside SEM as well (item response theory, the examination of differential item functioning, and so on). Here I only say that the latent-variable model is a representative method.</p>
</section>
<section id="stage-2-can-the-model-be-estimated-and-interpreted-properly" class="level3">
<h3 class="anchored" data-anchor-id="stage-2-can-the-model-be-estimated-and-interpreted-properly">4.3 Stage 2: Can the model be estimated and interpreted properly?</h3>
<p>Suppose a reason to use latent variables was found at Stage 1. Next, at Stage 2, check the following points.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>What to check</th>
<th>What to look at</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Balance between sample size and model complexity</td>
<td>Is the sample size sufficient for the number of factors, indicators, and parameters? Do not rely on a uniform rule such as “at least N people.”</td>
</tr>
<tr class="even">
<td>Identification</td>
<td>Is the model identified? Can you explain the identification conditions in your own words?</td>
</tr>
<tr class="odd">
<td>Estimation method and the nature of the data</td>
<td>How will you treat five-point scale data? Are the distributional assumptions reasonable?</td>
</tr>
<tr class="even">
<td>Explaining the results</td>
<td>Can you explain the identification, the estimation method, and the judgment of model fit to readers and reviewers?</td>
</tr>
</tbody>
</table>
<p>Whether data such as five-point scales can be treated as continuous is one of the points of debate. There are also estimation methods that treat them as ordered categories. However, depending on the number of categories and the shape of the distribution, methods that treat them as continuous may work well enough. It is not something to decide mechanically as “it is a five-point scale, so it must be an ordered-categorical method.”</p>
<p>I think the last row of this table, “can you explain it,” is the most important in practice. The results of research must be explainable to readers and reviewers. If you cannot answer questions such as “why did you include latent variables?”, “how did you check identification?”, and “how did you judge model fit?”, trust in the results is damaged.</p>
</section>
<section id="concrete-examples" class="level3">
<h3 class="anchored" data-anchor-id="concrete-examples">4.4 Concrete examples</h3>
<p><strong>Example 1: A case where I think an observed-variable model is enough</strong></p>
<p>Suppose a graduate student studies department-store customers, asking by questionnaire how “brand trust,” “perceived quality,” and “price acceptance” are associated with purchase intention. Existing scales are used, and each concept is measured with four or five items. The student has confirmed through factor analysis that there is no major problem in the structure of the items, and reliability is sufficient. No comparison between groups is made. Even if groups were compared, the student would not check that the scale has the same meaning across groups, but would place it as an assumption. In other words, the “checking whether the scale works in the same way across groups” in Question C of Stage 1 is not the purpose of this study. The sample size is small to medium.</p>
<p>In this case, I think it is reasonable to consider first the method of building subscales and running a regression analysis. This is because none of the three Stage 1 questions gives a strong reason to include latent variables. However, if it seems that the effect of measurement error could change the conclusion, I would review the decision at that point.</p>
<p><strong>Example 2: A case where I think it is meaningful to consider a latent-variable model</strong></p>
<p>A researcher wants to check whether a scale measures with the same meaning across countries, and then to compare the means across countries. The sample size in each country is also sufficient.</p>
<p>In this case, there is a clear reason under Question C of Stage 1. The Stage 2 conditions are also in place. The reason to use a latent-variable model is clear, and it can be explained.</p>
<p>The difference between the two examples is not the difficulty or the coolness of the method. <strong>It is whether the latent-variable model is needed for the question, and whether it can be handled properly.</strong></p>
<hr>
</section>
</section>
<section id="how-i-recommend-beginners-proceed-my-view" class="level2">
<h2 class="anchored" data-anchor-id="how-i-recommend-beginners-proceed-my-view">5. How I recommend beginners proceed (my view)</h2>
<p>Let me summarize the discussion so far as advice for beginners.</p>
<ol type="1">
<li><strong>First, build a scale and check it.</strong> Define the construct from theory, prepare the items, check them with factor analysis and alpha, and turn them into subscale scores. The details of this procedure are in the previous article.</li>
<li><strong>Next, analyze with an observed-variable model.</strong> Use the subscales to run regression or path analysis. Because the results of each stage can be checked separately, this is a method in which mistakes are easy to notice and easy to explain. However, because subscale scores contain measurement error, the coefficients of the structural part can come out smaller than they should be, or biased (Question A in Section 4). Thinking about whether this effect could change the conclusion leads to the judgment in step 3.</li>
<li><strong>Move to a latent-variable model once the need is visible.</strong> It is not too late to do so after a reason becomes clear in the research, such as wanting to take the effect of measurement error into account explicitly or wanting to check measurement invariance.</li>
</ol>
<p>There is one thing I want to emphasize. <strong>“Being able to use a latent-variable model” and “being in a study that should use one” are different things.</strong></p>
<p>There are also intermediate options between “estimate everything at once” and “do everything separately.” They are the two-step procedure that checks the measurement part first (Anderson &amp; Gerbing, 1988) and methods that estimate measurement and structure separately (such as SAM; Rosseel &amp; Loh, 2024).</p>
<hr>
</section>
<section id="reference-for-readers-who-want-to-know-more" class="level2">
<h2 class="anchored" data-anchor-id="reference-for-readers-who-want-to-know-more">6. Reference: for readers who want to know more</h2>
<p>This section is a reference for readers who want to know more. It collects viewpoints for checking things by yourself before you use a latent-variable model.</p>
<p>The point of this section is not that “latent-variable models are bad.” It is that knowing <strong>what can happen when you use them without understanding their mathematical properties</strong> is useful.</p>
<section id="problems-that-can-occur" class="level3">
<h3 class="anchored" data-anchor-id="problems-that-can-occur">6.1 Problems that can occur</h3>
<p><strong>(1) Good model fit does not mean the model is correct.</strong></p>
<p>Model fit is an index of how well the data and the model match. There can be other models (equivalent models) that fit the same data equally well. MacCallum et al.&nbsp;(1993) examined 53 applied studies in psychology and showed that equivalent models often exist in large numbers. A good fit alone cannot show that “no other explanation holds.” I think we should not simply accept a statement like “the fit was good, so the hypothesis was supported.”</p>
<p><strong>(2) The identification problem</strong></p>
<p>In a model that is not identified, the estimates are not determined uniquely. Software may still output numbers. But it may be impossible to explain what those numbers mean.</p>
<p><strong>(3) Interpretational confounding</strong></p>
<p>As touched on in Section 3, depending on the specification of the structural part, the estimates of the measurement part (factor loadings and so on) are affected, and the interpretation of what a latent variable substantively represents may change (Burt, 1976). Burt states that when the covariances among the items of a latent variable are low, and the covariances between those items and the items of other latent variables differ widely, the meaning of that latent variable in simultaneous estimation is easily swayed by variation in the items of the other latent variables (he cites an earlier analysis of latent variables with two indicators). For this reason, I think scales whose items are only weakly related need more attention. It is good to keep this point in mind in your own analyses as well.</p>
<p><strong>(4) Trial and error with modification indices</strong></p>
<p>When the fit is poor, you can revise the model following the “modification indices” that software shows (quite a few people accept these modifications uncritically). However, if you keep revising the model by looking at the data, you end up fitting the model to chance features specific to that data. It is worth checking whether you record and report why and in what order you revised the model.</p>
<p><strong>(5) Assumptions of estimation</strong></p>
<p>Standard estimation methods place certain assumptions on the distribution of the data. As touched on in Section 4, how to treat data such as five-point scales is one of the points of debate. When the sample size is small relative to the model, estimation may go badly, or improper solutions (such as negative variances) may appear.</p>
<p><strong>(6) Reading causation into the results</strong></p>
<p>When you draw arrows in a path analysis or a latent-variable model, it is easy for readers to take them as showing causal relations. In cross-sectional surveys, arrows represent the researcher’s assumptions and are not proof of causation. In reports, I think it is safer to write “association.”</p>
<p><strong>(7) Problems in choosing a method</strong></p>
<p>If you cannot reproduce the results by yourself, or cannot explain them, it becomes difficult to notice mistakes and difficult to have others check them. In an observed-variable model, measurement and structure can be checked stage by stage, and it is easier to trace at which stage the results changed. In a latent-variable model, many parameters move together, so isolating where a problem lies requires more understanding.</p>
</section>
<section id="a-checklist-of-questions-for-choosing-a-method" class="level3">
<h3 class="anchored" data-anchor-id="a-checklist-of-questions-for-choosing-a-method">6.2 A checklist of questions for choosing a method</h3>
<p>I have put the questions to ask yourself when choosing a method into a checklist.</p>
<p>Before using a latent-variable model, please ask yourself the following.</p>
<ul>
<li>Can I explain <strong>in one sentence</strong> why I include latent variables? (Which of the Stage 1 questions applies?)</li>
<li>What is <strong>missing</strong> from subscales and an observed-variable model?</li>
<li>Can I explain my choices of sample size, identification, and estimation method <strong>in my own words</strong>? (Stage 2)</li>
<li>If I revised the model with modification indices, do I have a <strong>record</strong> of it?</li>
<li>Even when the fit is good, did I consider <strong>other explanations</strong>?</li>
<li>Is the way I write the results a <strong>causal claim</strong>?</li>
</ul>
</section>
<section id="in-fairness" class="level3">
<h3 class="anchored" data-anchor-id="in-fairness">6.3 In fairness</h3>
<p>Latent-variable models are of course wonderful methods. They are used for estimating associations with measurement error explicitly taken into account, for verifying measurement invariance, and for studies that take measurement itself as the subject. In such studies, a latent-variable model is an excellent tool. If you can use it properly, you should use it actively.</p>
<p>It is not about giving up on using them. What matters is <strong>to check whether your reason for using them is rooted in the research question, and whether you can explain the results in your own words</strong>. That is what I think.</p>
<hr>
</section>
</section>
<section id="closing" class="level2">
<h2 class="anchored" data-anchor-id="closing">Closing</h2>
<p>To repeat, a latent-variable model is a powerful tool. Because it is powerful, I think it is good to use it in a state in which you can explain why you use it.</p>
<p>For beginners, I recommend the path of building and checking a scale and then analyzing with an observed-variable model. As you accumulate that experience, the situations in which a latent-variable model becomes necessary, such as “here I want to take measurement error into account explicitly” and “here I want to examine measurement itself,” will come into view naturally. That is the next step.</p>
<hr>
</section>
<section id="references-cited-in-the-text" class="level2">
<h2 class="anchored" data-anchor-id="references-cited-in-the-text">References cited in the text</h2>
<ul>
<li>Anderson, J. C., &amp; Gerbing, D. W. (1988). Structural equation modeling in practice: A review and recommended two-step approach. <em>Psychological Bulletin</em>, 103(3), 411–423. <a href="https://doi.org/10.1037/0033-2909.103.3.411" class="uri">https://doi.org/10.1037/0033-2909.103.3.411</a></li>
<li>Burt, R. S. (1976). Interpretational confounding of unobserved variables in structural equation models. <em>Sociological Methods &amp; Research</em>, 5(1), 3–52. <a href="https://doi.org/10.1177/004912417600500101" class="uri">https://doi.org/10.1177/004912417600500101</a></li>
<li>MacCallum, R. C., Wegener, D. T., Uchino, B. N., &amp; Fabrigar, L. R. (1993). The problem of equivalent models in applications of covariance structure analysis. <em>Psychological Bulletin</em>, 114(1), 185–199. <a href="https://doi.org/10.1037/0033-2909.114.1.185" class="uri">https://doi.org/10.1037/0033-2909.114.1.185</a></li>
<li>Rosseel, Y., &amp; Loh, W. W. (2024). A structural after measurement approach to structural equation modeling. <em>Psychological Methods</em>, 29(3), 561–588. <a href="https://doi.org/10.1037/met0000503" class="uri">https://doi.org/10.1037/met0000503</a></li>
</ul>
</section>
<section id="recommended-further-reading" class="level2">
<h2 class="anchored" data-anchor-id="recommended-further-reading">Recommended further reading</h2>
<p>These are not works cited in the text. They are introductory books and guides that I think are worth reading if you use SEM. The level and suitability of each book are my own impressions.</p>
<section id="in-japanese" class="level3">
<h3 class="anchored" data-anchor-id="in-japanese">In Japanese</h3>
<ul>
<li>Toyoda, H. (Ed.). (2007). <em>Kyōbunsan kōzō bunseki [Amos hen]: Kōzō hōteishiki moderingu</em> [Covariance structure analysis, Amos edition: Structural equation modeling]. Tokyo Tosho.</li>
<li>Kosugi, K. (Ed.). (2014). <em>M-plus to R ni yoru kōzō hōteishiki moderingu nyūmon</em> [Introduction to structural equation modeling with Mplus and R]. Kitaohji Shobo.</li>
<li>Toyoda, H. (2003). <em>Kyōbunsan kōzō bunseki: Gimon hen</em> [Covariance structure analysis: Questions]. Asakura Shoten.</li>
</ul>
</section>
<section id="in-english" class="level3">
<h3 class="anchored" data-anchor-id="in-english">In English</h3>
<ul>
<li>Kline, R. B. (2023). <em>Principles and Practice of Structural Equation Modeling</em> (5th ed.). The Guilford Press. <a href="https://www.guilford.com/books/Principles-and-Practice-of-Structural-Equation-Modeling/Rex-Kline/9781462551910">Publisher’s page</a></li>
<li>Brown, T. A. (2015). <em>Confirmatory Factor Analysis for Applied Research</em> (2nd ed.). The Guilford Press. <a href="https://www.guilford.com/books/Confirmatory-Factor-Analysis-for-Applied-Research/Timothy-Brown/9781462515363">Publisher’s page</a></li>
<li>Beaujean, A. A. (2014). <em>Latent Variable Modeling Using R: A Step-by-Step Guide</em>. Routledge.</li>
<li>Rosseel, Y. (2012). lavaan: An R package for structural equation modeling. <em>Journal of Statistical Software</em>, 48(2), 1–36. <a href="https://doi.org/10.18637/jss.v048.i02" class="uri">https://doi.org/10.18637/jss.v048.i02</a></li>
</ul>


</section>
</section>

 ]]></description>
  <category>marketing</category>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/before-latent-variables/</guid>
  <pubDate>Mon, 26 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/before-latent-variables/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Paper Guide: Quantitative and Qualitative Research Are Two Cultures, Not Rivals (Mahoney &amp; Goertz, 2006)</title>
  <link>https://im-research-yt.github.io/posts/paper-guide-mahoney-goertz/</link>
  <description><![CDATA[ 





<p><strong>Reference</strong>: Mahoney, J., &amp; Goertz, G. (2006). A tale of two cultures: Contrasting quantitative and qualitative research. <em>Political Analysis</em>, 14(3), 227-249. <a href="https://doi.org/10.1093/pan/mpj017" class="uri">https://doi.org/10.1093/pan/mpj017</a></p>
<p><strong>Summary</strong>: This paper organizes quantitative and qualitative research not as a contest between better and worse, but as two cultures with different goals. I recommend it as required reading for anyone designing a research project. The paper shows that deciding first which kind of question you are asking makes it easier to choose an analytical method.</p>
<section id="overview" class="level2">
<h2 class="anchored" data-anchor-id="overview">Overview</h2>
<p>Quantitative research, which is built on statistics and aims to learn “average effects,” and qualitative research (case study research), which aims to pin down “the cause of a particular event,” ask different questions in the first place. Relatively speaking, quantitative research asks how much a cause affects outcomes on average, whereas qualitative research asks why this outcome happened in this case. The paper shows that the practices of both traditions are reasonable given their respective goals.</p>
</section>
<section id="why-i-chose-this-paper" class="level2">
<h2 class="anchored" data-anchor-id="why-i-chose-this-paper">Why I chose this paper</h2>
<p>In MBA research and business research, you may run into this wall: A/B tests and regression analysis reveal the overall trend, yet you still cannot tell why your single most important customer left.</p>
<p>This paper offers a way to think about why that happens. Measuring the “average trend” across the data and tracing the “causal mechanism” of an individual event are two different ways of thinking. The paper can be read as a “map of thinking” for choosing an analytical method that fits the question you want to answer. I chose it because I believe it is one of the papers MBA students should read before starting their own research.</p>
</section>
<section id="the-structure-of-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="the-structure-of-the-paper">The structure of the paper</h2>
<p>The paper contrasts the two traditions across 10 areas (approaches to explanation, conceptions of causation, multivariate explanations, equifinality, scope and causal generalization, case selection practices, weighting observations, substantively important cases, lack of fit, and concepts and measurement). In this memo, to make the overall picture easier to grasp, I narrow them down to three: the purpose of the question, how causation is understood, and how cases are selected. For the other areas, please check the paper itself.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Three axes</th>
<th>Qualitative culture (the detective’s view)</th>
<th>Quantitative culture (the experimenter’s view)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Purpose of the question</strong></td>
<td>Explain why the outcome happened in a particular case</td>
<td>Measure how much a factor affects outcomes on average</td>
</tr>
<tr class="even">
<td><strong>How causation is understood</strong></td>
<td>Thinks in terms of the “multiplication” (combination) of conditions</td>
<td>Typically thinks in terms of the “addition” (average effects) of variables</td>
</tr>
<tr class="odd">
<td><strong>How cases are selected</strong></td>
<td>Examines in depth mainly the cases in which the outcome occurred</td>
<td>To avoid bias, does not select cases on the outcome (the dependent variable)</td>
</tr>
</tbody>
</table>
<p>Reading the table from left to right, you can see that the differences between the two cultures are connected in a single line. The paper likens qualitative research to a detective. Quantitative research, by contrast, is explained as statistical methods that take the logic of the controlled experiment as their model. The phrase “the experimenter’s view” in this article is simply a label I use for this contrast.</p>
<p>A detective wants to know the cause of a crime that has already happened, so the detective examines in depth the cases in which it happened. The detective also assumes that the cause is not one thing but a combination of several conditions.</p>
<p>An experimenter, on the other hand, wants to know the average effect of a factor, and therefore takes care not to select cases by their outcome, which would introduce bias. The experimenter also thinks of the effects of the factors as adding up.</p>
<p>If the goals differ, then both how cases are selected and how causation is understood differ as well.</p>
</section>
<section id="the-papers-contributions" class="level2">
<h2 class="anchored" data-anchor-id="the-papers-contributions">The paper’s contributions</h2>
<p>First, the paper makes the difference in the “goal of the question” clearly visible. The question “why did this case happen?” and the question “what effect does this factor have on average?” are different questions. Much of the reason why debates about analytical methods fail to connect lies not in which method is better, but in this difference in purpose.</p>
<p>Second, the paper shines a light on “combinations of conditions.” A factor may not work on its own; sometimes an outcome appears only “when conditions A, B, and C are all present.” Moreover, there may be more than one route to the same outcome (this is called equifinality). The paper organizes, in a logical way, this feature of the real world that is easy to overlook in models that simply add effects together.</p>
<hr>
<p>From here on, these are my own views, based on the paper.</p>
</section>
<section id="what-i-found-noteworthy" class="level2">
<h2 class="anchored" data-anchor-id="what-i-found-noteworthy">What I found noteworthy</h2>
<p>What I consider especially important about this paper is that it lets us understand qualitative and quantitative research by contrasting them. Seeing the two side by side makes clear what each aims for and why each works the way it does.</p>
<p>Another point is that it can serve as a foundation for understanding <strong>QCA</strong> as a method. If you grasp the logic of qualitative research (combinations of conditions, multiple routes), you can see what QCA has inherited.</p>
</section>
<section id="thinking-about-business-applications-the-case-of-customer-churn" class="level2">
<h2 class="anchored" data-anchor-id="thinking-about-business-applications-the-case-of-customer-churn">Thinking about business applications: the case of customer churn</h2>
<p>Let us step away from the paper and think about applications. Consider an e-commerce company analyzing customer churn (the numbers are a made-up example to aid understanding).</p>
<p>Quantitative approaches such as statistics and A/B tests are well suited to revealing the overall trend, for example “issuing a coupon lowers the churn rate across all customers by 3% on average.” However, this alone does not reveal the individual reason why Customer A, who had spent the most with the company, suddenly stopped using the service.</p>
<p>This is where a qualitative, logic-based approach comes in. It can bring out candidate combinations: churn tends to occur when several conditions overlap, such as “a delivery delay,” “dissatisfaction with the support response,” and “a competitor’s discount campaign.” However, this does not establish the cause; it is material for hypotheses to be checked later.</p>
</section>
<section id="connection-to-qca" class="level2">
<h2 class="anchored" data-anchor-id="connection-to-qca">Connection to QCA</h2>
<p>This paper organized the differences between the qualitative and quantitative cultures. One method that connects the two is QCA (qualitative comparative analysis). It keeps the qualitative way of thinking, which emphasizes combinations of conditions and multiple routes, while analyzing a dataset systematically. I also discuss the ideas behind QCA in the article <a href="../../posts/why-qca-decisions/index.html">Why QCA suits decision-making</a> on this blog.</p>
<hr>
<p><em>Summary points for review</em></p>
</section>
<section id="points-to-revisit" class="level2">
<h2 class="anchored" data-anchor-id="points-to-revisit">Points to revisit</h2>
<ul>
<li>Before starting an analysis, decide whether your question is “why did this case happen?” or “how does this factor work on average?”</li>
<li>Once the question is decided, how to select cases and how to understand causation follow naturally.</li>
<li>When you study QCA, return to this paper’s ideas of “combinations of conditions” and “multiple routes.”</li>
</ul>
</section>
<section id="glossary" class="level2">
<h2 class="anchored" data-anchor-id="glossary">Glossary</h2>
<ul>
<li><strong>Causes-of-effects</strong>: A detective-style question that works backward from an outcome: “Why did this happen?”</li>
<li><strong>Effects-of-causes</strong>: An experimenter-style question that measures the average effect of adding a factor: “What effect does this factor have on average?”</li>
<li><strong>Equifinality</strong>: The fact that there is not just one route to the same outcome, but several.</li>
</ul>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<p>Mahoney, J., &amp; Goertz, G. (2006). A tale of two cultures: Contrasting quantitative and qualitative research. <em>Political Analysis</em>, 14(3), 227-249. <a href="https://doi.org/10.1093/pan/mpj017" class="uri">https://doi.org/10.1093/pan/mpj017</a></p>
<p>Back to the paper guides: <a href="../../posts/paper-guides-intro/index.html">About this shelf</a></p>


</section>

 ]]></description>
  <category>QCA</category>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/paper-guide-mahoney-goertz/</guid>
  <pubDate>Wed, 14 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/paper-guide-mahoney-goertz/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Paper Guide: How Should We Evaluate the “Conditions for Success”? (Ragin, 2006)</title>
  <link>https://im-research-yt.github.io/posts/paper-guide-ragin/</link>
  <description><![CDATA[ 





<p><strong>Reference</strong>: Ragin, C. C. (2006). Set relations in social research: Evaluating their consistency and coverage. <em>Political Analysis</em>, 14(3), 291-310. <a href="https://doi.org/10.1093/pan/mpj019" class="uri">https://doi.org/10.1093/pan/mpj019</a></p>
<p><strong>Summary</strong>: “If a firm has this condition, it succeeds” and “to succeed, a firm must have this condition” are different claims. The paper treats this difference as a matter of set relations (sufficient and necessary conditions), and shows how to evaluate such a relation: consistency tells you how consistently the cases follow it, and coverage tells you how much of the outcome it covers. I recommend it to anyone who wants to ask what the phrase “success factor” actually means.</p>
<section id="overview" class="level2">
<h2 class="anchored" data-anchor-id="overview">Overview</h2>
<p>　Suppose that many successful firms turn out to be customer-oriented. Can we then say that being thoroughly customer-oriented leads to success? Ragin deals with the logical problem behind this question.</p>
<p>　Charles C. Ragin is a sociologist known as the originator of QCA. The starting point of this paper is a question: do the relations stated in a theory match the relations we actually check in an analysis?</p>
<p>　Take the claim that “democracies do not fight wars with each other.” This claim states a set relation: the pairs of democracies form a subset of the pairs of countries that do not go to war. On the other hand, there are many pairs of countries that avoid war without both being democracies, so the correlation between “being a pair of democracies” and “not going to war” may not be strong. That does not, however, refute the original claim.</p>
<p>　On this basis, Ragin points out that <strong>theories stated as set relations tend to be translated, in analysis, into hypotheses about correlation</strong>. He then presents simple descriptive measures for evaluating set relations in the form in which they were stated.</p>
</section>
<section id="why-i-chose-this-paper" class="level2">
<h2 class="anchored" data-anchor-id="why-i-chose-this-paper">Why I chose this paper</h2>
<p>　In MBA research, we sometimes want to analyze how a certain event comes about, for example the factors behind a company’s success. However, what successful companies have in common cannot always be treated as a law of success.</p>
<p>　In business cases, we come across explanations such as “successful firms are thoroughly customer-oriented” or “high-performing stores offer good service.” To judge what can be concluded from them, we need to distinguish the following three questions.</p>
<ul>
<li>Do firms that have the condition succeed?</li>
<li>Is the condition indispensable for success?</li>
<li>How much of the success we observe can this condition explain?</li>
</ul>
<p>　The value of reading this paper is not limited to learning QCA’s measures. It also helps you clarify what a “success factor” means and look for evidence that fits the claim you are making. Whether or not you use QCA, I recommend it as a paper that conveys a perspective every MBA student should have.</p>
</section>
<section id="the-structure-of-the-paper" class="level2">
<h2 class="anchored" data-anchor-id="the-structure-of-the-paper">The structure of the paper</h2>
<p>　The paper discusses two measures for evaluating set relations (consistency and coverage), including how to use them. In this memo, I narrow the discussion to four points.</p>
<section id="correlation-and-set-relations-answer-different-questions" class="level3">
<h3 class="anchored" data-anchor-id="correlation-and-set-relations-answer-different-questions">1. Correlation and set relations answer different questions</h3>
<p>　Correlation looks at how two variables move together. A set relation looks at whether the set of cases that have a condition is contained in the set of cases that achieve the outcome (or the reverse). Let the condition be <img src="https://latex.codecogs.com/png.latex?X"> and the outcome be <img src="https://latex.codecogs.com/png.latex?Y">. Sufficient and necessary conditions can then be distinguished as follows.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Relation</th>
<th>Question</th>
<th>As sets</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><img src="https://latex.codecogs.com/png.latex?X"> is sufficient for <img src="https://latex.codecogs.com/png.latex?Y"></td>
<td>If X is present, is Y present?</td>
<td><img src="https://latex.codecogs.com/png.latex?X%20%5Csubseteq%20Y"></td>
</tr>
<tr class="even">
<td><img src="https://latex.codecogs.com/png.latex?X"> is necessary for <img src="https://latex.codecogs.com/png.latex?Y"></td>
<td>If Y is present, is X present?</td>
<td><img src="https://latex.codecogs.com/png.latex?Y%20%5Csubseteq%20X"></td>
</tr>
</tbody>
</table>
<p>　As an example, consider the claim that “stores that combine a good location with excellent service are high performers.” This is a claim of sufficiency: the set of stores with this combination is contained in the set of high-performing stores. The claim says only whether the stores with the combination are high performers. It does not say the reverse, that every high-performing store has this combination. For instance, some stores may have an ordinary location yet perform well thanks to a distinctive product mix and a strong brand. Such stores simply lie outside the claim; they do not contradict it. (The stores and numbers in this article are a made-up example for illustration. Only the figure 17/20 = 0.85 is chosen to match an example in the paper.)</p>
<p>　A case that contradicts the claim is “a store with a good location and excellent service that is not a high performer.” To check a claim of sufficiency, we look at how many such stores there are.</p>
<ul>
<li>Suppose 20 stores have the combination, and 17 of them are high performers while 3 are not. These 3 stores are the cases that contradict the claim.</li>
<li>Suppose there are 50 high-performing stores in total, and 17 of them have the combination. The remaining 33 stores achieve high performance without this combination. They do not contradict the claim.</li>
</ul>
<p>　The first ratio (17/20) leads to the idea of “consistency” explained next. The second (17/50) leads to “coverage” after that.</p>
</section>
<section id="consistency-shows-how-consistently-the-cases-fit-the-claim" class="level3">
<h3 class="anchored" data-anchor-id="consistency-shows-how-consistently-the-cases-fit-the-claim">2. Consistency shows how consistently the cases fit the claim</h3>
<p>　Consistency shows how well the observed cases follow the set relation we assume. For sufficiency with crisp sets (sets with only two values, in or out), it is the share of cases with the condition that also show the outcome. For example, if 17 of the 20 stores with a certain combination of conditions are high performers, consistency is 17/20 = 0.85.</p>
<p>　With fuzzy sets (sets in which membership is expressed as a degree from 0 to 1), let <img src="https://latex.codecogs.com/png.latex?X_i"> be the membership of case <img src="https://latex.codecogs.com/png.latex?i"> in the condition and <img src="https://latex.codecogs.com/png.latex?Y_i"> its membership in the outcome. The consistency of sufficiency is then expressed as follows.</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%7BConsistency%7D(X%20%5Cto%20Y)%20=%20%5Cfrac%7B%5Csum_i%20%5Cmin(X_i,%20Y_i)%7D%7B%5Csum_i%20X_i%7D"></p>
<p>　If <img src="https://latex.codecogs.com/png.latex?X_i%20%5Cle%20Y_i"> holds for every case, consistency is 1.</p>
<p>　This formula does not simply count consistent and inconsistent cases. A case with a higher membership in the condition carries more weight. In addition, a small deviation, where membership in the condition exceeds membership in the outcome only slightly, is penalized only a little, while a large deviation is penalized heavily. The paper explains that this is the difference from a method that sorts cases into “consistent” and “inconsistent” and counts the proportion (pp.295-297).</p>
<p>　Consistency is also affected by how memberships are distributed. If memberships in the condition are low across the board and memberships in the outcome are high across the board, a relation may merely look like sufficiency while actually being produced by the skewed distribution. The paper therefore says that calibration, the assignment of membership scores, should be done carefully, and that the procedure should be made public so that others can reproduce it (pp.298-299).</p>
</section>
<section id="coverage-shows-how-much-the-relation-covers" class="level3">
<h3 class="anchored" data-anchor-id="coverage-shows-how-much-the-relation-covers">3. Coverage shows how much the relation covers</h3>
<p>　The coverage of a sufficient condition shows how much of the set of cases with the outcome is covered by that condition (or combination of conditions). If the 17 stores above are part of 50 high-performing stores in total, coverage is 17/50 = 0.34. The combination is consistently linked to high performance, but it does not broadly cover high-performing stores as a whole.</p>
<p>　For reference, with fuzzy sets the formula is as follows.</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%7BCoverage%7D(X%20%5Cto%20Y)%20=%20%5Cfrac%7B%5Csum_i%20%5Cmin(X_i,%20Y_i)%7D%7B%5Csum_i%20Y_i%7D"></p>
<p>　The paper calls for using the two measures in order: first check consistency, and only then look at coverage. If consistency is not sufficient, a large coverage cannot make the condition empirically important as a sufficient condition. Consistency and coverage can also pull in opposite directions. A combination narrowed down by stacking many conditions tends to have high consistency but very small coverage. The paper also notes that coverage measures empirical importance, not theoretical importance.</p>
</section>
<section id="multiple-paths-have-overlapping-and-unique-parts" class="level3">
<h3 class="anchored" data-anchor-id="multiple-paths-have-overlapping-and-unique-parts">4. Multiple paths have overlapping and unique parts</h3>
<p>　There is not always only one path to the same outcome. When different combinations of conditions lead to the same outcome, this is called equifinality.</p>
<p>　When several paths cover the same successful cases, simply adding their coverages counts those cases more than once. The paper therefore separates the coverage of each path into raw coverage, which includes the overlap, and unique coverage, which shows the part not covered by any other path. The paper says this is somewhat similar to the way regression analysis partitions explained variance among variables. It adds, however, that this is not about removing the correlation among conditions; it is about the fact that a single case can fit more than one path.</p>
</section>
</section>
<section id="the-papers-contributions" class="level2">
<h2 class="anchored" data-anchor-id="the-papers-contributions">The paper’s contributions</h2>
<p>　First, the paper presents simple descriptive measures for evaluating set relations. The paper itself says that consistency and coverage are neither complicated nor entirely new. What is new, it says, is that they are clearly tied to set-theoretic thinking, which shows how this differs from ordinary quantitative analysis built on correlation.</p>
<p>　Second, the paper argues that for necessary conditions, too, consistency alone is not enough. A condition that is present in most cases regardless of the outcome can have high consistency as a necessary condition and still contribute little to understanding the outcome. The coverage of a necessary condition is a clue for spotting such trivial conditions. This point builds on Goertz’s discussion.</p>
<p>　Third, the paper separates the coverage of multiple paths into overlapping and unique parts. This makes it possible to evaluate the diversity of patterns of success and the weight of each path.</p>
<hr>
<p>From here on, these are my own views, based on the paper.</p>
</section>
<section id="what-i-found-noteworthy" class="level2">
<h2 class="anchored" data-anchor-id="what-i-found-noteworthy">What I found noteworthy</h2>
<p>　What I consider especially important is the order: check consistency first, then interpret coverage. When the consistency of a sufficient condition is weak, we cannot call a pattern a strong pattern of success merely because it covers the outcome broadly.</p>
<p>　Another point is the stance emphasized in the conclusion: the measures themselves should not become the goal of research. Ragin treats consistency and coverage as aids to judgment, and gives priority to whether the results help us understand individual cases and the processes and mechanisms at work in them. When studying business cases in an MBA program, I think this stance of moving back and forth between the numbers and the substance of the cases is important.</p>
</section>
<section id="thinking-about-business-applications-analyzing-success-factors-with-care" class="level2">
<h2 class="anchored" data-anchor-id="thinking-about-business-applications-analyzing-success-factors-with-care">Thinking about business applications: analyzing success factors with care</h2>
<p>　For example, when comparing high-performing stores, before settling on a single explanation such as “low prices matter most,” we can examine different combinations, such as “a good location and excellent service” and “a strong brand and a distinctive product mix” (a made-up example). For each combination, we then check how consistently it is linked to high performance, how many of the high-performing stores it covers, and which stores are the exceptions.</p>
<p>　However, high consistency does not guarantee a causal effect, in the sense that adopting the combination will raise performance. Large coverage does not directly translate into investment priorities either. To decide on a measure, we also need to consider cost, feasibility, the causal mechanism, and more.</p>
</section>
<section id="connection-to-qca" class="level2">
<h2 class="anchored" data-anchor-id="connection-to-qca">Connection to QCA</h2>
<p>　When reading the results of a QCA, we check not only the expression of the combinations of conditions but also consistency, coverage, and the specific cases behind them. Beyond “was the value high?”, being able to explain “consistency of what?”, “coverage with what as the denominator?”, and “what are the exceptions?” is what shows real understanding of the analysis. I also introduce the ideas behind QCA in the article <a href="../../posts/why-qca-decisions/index.html">Why QCA suits decision-making</a> on this blog.</p>
<hr>
<p><em>Summary points for review</em></p>
</section>
<section id="points-to-revisit" class="level2">
<h2 class="anchored" data-anchor-id="points-to-revisit">Points to revisit</h2>
<ul>
<li>Distinguish sufficient from necessary conditions. “If the condition is present, the outcome is present” and “if the outcome is present, the condition is present” are different claims.</li>
<li>Distinguish consistency from coverage. For a sufficient condition, the former is how consistent the relation is, and the latter is how much of the outcome it covers. Check consistency first, then look at coverage.</li>
<li>Do not judge by the consistency value alone. In its discussion of crisp sets, the paper says that below 0.75 it becomes hard even to claim a rough set relation. This does not mean that 0.75 or above is automatically adequate; you still need to check the number and the substance of the cases.</li>
<li>For necessary conditions, the denominators switch (see the table below).</li>
<li>The measures are descriptive evaluations. They do not prove causal effects.</li>
</ul>
<p>　In the table below, let <img src="https://latex.codecogs.com/png.latex?M%20=%20%5Csum_i%20%5Cmin(X_i,%20Y_i)">.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Relation evaluated</th>
<th>Consistency</th>
<th>Coverage</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><img src="https://latex.codecogs.com/png.latex?X"> is sufficient for <img src="https://latex.codecogs.com/png.latex?Y"></td>
<td><img src="https://latex.codecogs.com/png.latex?M%20/%20%5Csum_i%20X_i"></td>
<td><img src="https://latex.codecogs.com/png.latex?M%20/%20%5Csum_i%20Y_i"></td>
</tr>
<tr class="even">
<td><img src="https://latex.codecogs.com/png.latex?X"> is necessary for <img src="https://latex.codecogs.com/png.latex?Y"></td>
<td><img src="https://latex.codecogs.com/png.latex?M%20/%20%5Csum_i%20Y_i"></td>
<td><img src="https://latex.codecogs.com/png.latex?M%20/%20%5Csum_i%20X_i"></td>
</tr>
</tbody>
</table>
<p>　The coverage of a necessary condition reads differently from the coverage of a sufficient condition, which asks how much of the outcome is covered. It is a measure for checking that the set of X, the supposed necessary condition, is not too large compared with the set of the outcome Y, so that X does not turn out to be an empirically trivial condition.</p>
</section>
<section id="glossary" class="level2">
<h2 class="anchored" data-anchor-id="glossary">Glossary</h2>
<ul>
<li><strong>QCA (qualitative comparative analysis)</strong>: A method that treats each case as a combination of conditions and examines its relation to the outcome through set relations and logical comparison.</li>
<li><strong>Condition</strong>: In QCA, the term for the explanatory side (<img src="https://latex.codecogs.com/png.latex?X"> in this article).</li>
<li><strong>Outcome</strong>: In QCA, the term for the result to be explained (<img src="https://latex.codecogs.com/png.latex?Y"> in this article). In this article I often write simply “outcome” or “result” for readability.</li>
<li><strong>Crisp set</strong>: A set in which membership is expressed as 0 or 1.</li>
<li><strong>Fuzzy set</strong>: A set in which membership is expressed as a degree from 0 to 1. The values are calibrated according to the meaning of the concept.</li>
<li><strong>Consistency</strong>: How consistently the cases follow the assumed set relation.</li>
<li><strong>Coverage</strong>: The empirical importance of a consistent relation. For a sufficient condition, how much of the outcome it covers.</li>
<li><strong>Equifinality</strong>: The fact that different combinations of conditions lead to the same outcome.</li>
<li><strong>Raw / unique coverage</strong>: The total range covered by a path, and the part of it that no other path covers.</li>
<li><strong>Trivial necessary condition</strong>: A condition that is widespread regardless of the outcome; it may be consistent as a necessary condition but does not help us understand the outcome.</li>
</ul>
</section>
<section id="what-to-check-in-the-original" class="level2">
<h2 class="anchored" data-anchor-id="what-to-check-in-the-original">What to check in the original</h2>
<p>　This article is my own summary of the paper’s main points. When you read the original, the following three places make good entry points.</p>
<ul>
<li>Introduction (pp.291-292): What goes wrong when a theory stated as a set relation is translated into a correlation hypothesis?</li>
<li>The explanation of Figures 1 and 2 (pp.294-297): How do set relations show up in a scatterplot? Why are cases that look like “errors” from a correlation viewpoint not counterexamples to the claim?</li>
<li>Conclusion (pp.309-310): Why is understanding the cases considered more important than the height of the measures?</li>
</ul>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<p>Ragin, C. C. (2006). Set relations in social research: Evaluating their consistency and coverage. <em>Political Analysis</em>, 14(3), 291-310. <a href="https://doi.org/10.1093/pan/mpj019" class="uri">https://doi.org/10.1093/pan/mpj019</a></p>
<p>Back to the paper guides: <a href="../../posts/paper-guides-intro/index.html">About this shelf</a></p>


</section>

 ]]></description>
  <category>QCA</category>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/paper-guide-ragin/</guid>
  <pubDate>Wed, 14 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/paper-guide-ragin/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>About Paper Guides: Introducing Papers on This Blog</title>
  <link>https://im-research-yt.github.io/posts/paper-guides-intro/</link>
  <description><![CDATA[ 





<p>On this blog, I will read and introduce, one at a time and as time allows, papers related to qualitative comparative analysis (QCA), marketing science, brand management, and statistics.</p>
<section id="purpose-of-this-shelf" class="level2">
<h2 class="anchored" data-anchor-id="purpose-of-this-shelf">Purpose of this shelf</h2>
<p>The purpose is to let you grasp, in a short time, what a paper says and where its important points lie before you read it. The guides are also written so that I can use them later as my own reading notes.</p>
</section>
<section id="papers-covered" class="level2">
<h2 class="anchored" data-anchor-id="papers-covered">Papers covered</h2>
<p>I choose papers related to the topics of this blog: QCA methodology, the handling of thresholds, the foundations of data analysis, applications to marketing, and so on.</p>
</section>
<section id="how-each-article-is-organized" class="level2">
<h2 class="anchored" data-anchor-id="how-each-article-is-organized">How each article is organized</h2>
<p>Every article follows the same order.</p>
<ul>
<li>Reference and summary</li>
<li>Overview</li>
<li>Why I chose this paper</li>
<li>The structure of the paper</li>
<li>The paper’s contributions</li>
<li>What I found noteworthy</li>
<li>Points to revisit, glossary, and references</li>
</ul>
<p>A section on business applications and a section on connections to related articles are added only when needed.</p>
</section>
<section id="a-note-for-readers" class="level2">
<h2 class="anchored" data-anchor-id="a-note-for-readers">A note for readers</h2>
<ul>
<li>Each article is written in my own words, without reproducing the text or the figures and tables of the paper.</li>
<li>The interpretations are based on my own understanding. If you cite a paper or use it in your research, please always check the original.</li>
</ul>
</section>
<section id="published-paper-guides" class="level2">
<h2 class="anchored" data-anchor-id="published-paper-guides">Published paper guides</h2>
<ul>
<li><a href="../../posts/paper-guide-mahoney-goertz/index.html">Paper Guide: Quantitative and Qualitative Research Are Two Cultures, Not Rivals (Mahoney &amp; Goertz, 2006)</a></li>
<li><a href="../../posts/paper-guide-ragin/index.html">Paper Guide: How Should We Evaluate the “Conditions for Success”? (Ragin, 2006)</a></li>
</ul>


</section>

 ]]></description>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/paper-guides-intro/</guid>
  <pubDate>Wed, 14 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/paper-guides-intro/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>From survey items to a scale, then on to regression and QCA: a step-by-step guide</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/scale-to-regression/</link>
  <description><![CDATA[ 





<div class="callout callout-style-default callout-note callout-titled" title="How this article, the app, and the R script fit together">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>How this article, the app, and the R script fit together
</div>
</div>
<div class="callout-body-container callout-body">
<p>The step-by-step articles on this blog come with an app (a tool that runs in your browser) that lets you try the same procedure. The three have different roles:</p>
<ul>
<li><strong>The article</strong> explains the ideas and the procedure. The calculations are shown as R code.</li>
<li><strong>The app (<a href="https://im-research-yt.github.io/analysis-tools/scale_maker.html" target="_blank">Scale Maker</a>)</strong> reads your data (CSV) and shows the same calculations as the article on screen. You can learn the flow of the procedure and the meaning of the numbers without using R.</li>
<li><strong>The R script</strong>: the app can produce an R script that reproduces the results of your settings on screen. You can run it in R and confirm that the numbers match the app. In research, you can also keep the script as a record of your analysis.</li>
</ul>
<p>If you use R, start from the code in the article. If you learn with the app, read the article while looking at the numbers in the app first, and then reproduce them with the R script when you are comfortable.</p>
</div>
</div>
<section id="the-question-this-article-answers" class="level2">
<h2 class="anchored" data-anchor-id="the-question-this-article-answers">The question this article answers</h2>
<p>Research in marketing and management deals with concepts such as brand trust, perceived quality, customer satisfaction, and price sensitivity, which are hard to measure with a single question. These concepts are called <strong>constructs</strong>, and we measure them with several questionnaire items.</p>
<p>Suppose we measure brand trust with these three items:</p>
<ul>
<li>Q1: This brand is sincere</li>
<li>Q2: I think this brand keeps its promises</li>
<li>Q3: I feel secure using this brand</li>
</ul>
<p>What we want to know is not the effect of Q1, Q2, or Q3 separately. We want to know how brand trust, the three items taken together, relates to outcomes such as purchase intention. We also often want to use such constructs in later analyses: regression, logistic regression, QCA, cluster analysis, decision trees, and so on.</p>
<p>Structural equation modeling (SEM) is a wonderful method, but you do not have to start with it (and if you use it without understanding its characteristics, it can do more harm than good). What matters is not which method is more advanced, but <strong>how you measure the constructs of your research, and how you analyze them in the way that best fits your research question</strong>.</p>
<p>This article presents a procedure that works well for MBA research and empirical studies, with an example in R. The example data are generated with random numbers (they are not real survey data).</p>
<section id="scope-of-this-article" class="level3">
<h3 class="anchored" data-anchor-id="scope-of-this-article">Scope of this article</h3>
<ul>
<li><p>We deal with <strong>constructs that you define in advance from theory and measure with several items</strong>. This does not deny the value of exploratory studies that look for constructs in the data.</p></li>
<li><p>We deal with measurement like brand trust, where we assume that <strong>one underlying construct drives the answers to several items in common</strong>. A person with high brand trust answers high on Q1, Q2, and Q3 alike. Therefore, the items are expected to correlate with one another (this kind of measurement is called reflective measurement).</p>
<p>A different case is building a “customer behavior index” by combining purchase frequency, purchase amount, and years of use. A person who buys often does not necessarily spend a lot. The items need not correlate strongly, so the factor analysis and alpha procedure shown here does not apply as it is. It is not true that “for any index, you can raise alpha and take the average.”</p></li>
</ul>
</section>
</section>
<section id="the-overall-flow" class="level2">
<h2 class="anchored" data-anchor-id="the-overall-flow">The overall flow</h2>
<ol type="1">
<li>Define the construct from theory and prior research</li>
<li>Prepare several questionnaire items for each construct</li>
<li>Use exploratory factor analysis (EFA) to examine, in an exploratory way, whether the item groupings you expected are consistent with the data</li>
<li>Align the direction of reverse-keyed items</li>
<li>Check internal consistency (Cronbach’s alpha)</li>
<li>Build subscales by averaging items</li>
<li>Use the subscales in regression and QCA</li>
</ol>
<p>Let us go through them in order.</p>
<div class="callout callout-style-default callout-tip callout-titled" title="For readers who learn with the app (this article)">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>For readers who learn with the app (this article)
</div>
</div>
<div class="callout-body-container callout-body">
<p>“Example 3” in the app (<a href="https://im-research-yt.github.io/analysis-tools/scale_maker.html" target="_blank">Scale Maker</a>) uses the same data as this article. Steps 2 to 7 in the app correspond to steps 3 to 6 in this article. Regression and QCA are done in R. The app’s calculation is the same as R’s standard <code>promax</code>. Depending on the version of psych, the third decimal place of the factor loadings can differ slightly.</p>
</div>
</div>
</section>
<section id="step-1-define-the-construct-from-theory-before-factor-analysis" class="level2">
<h2 class="anchored" data-anchor-id="step-1-define-the-construct-from-theory-before-factor-analysis">Step 1: Define the construct from theory (before factor analysis)</h2>
<p>This is the most important step. Before factor analysis, the researcher has to decide what to measure. Concepts such as “brand trust” and “perceived quality” are not things that statistical software finds for you automatically.</p>
<p>The approach to avoid looks like this:</p>
<blockquote class="blockquote">
<p>“Let’s ask 20 questions for now, run a factor analysis, and name the factors that come out.”</p>
</blockquote>
<p>This is a misunderstanding that beginners especially tend to fall into. The preferred order is as follows.</p>
<p>From prior research and theory, define what brand trust is, and think about the questionnaire items needed to observe it. When you prepared Q1 to Q3 above, you already held a theoretical expectation before the survey began: “these three items should be measuring one construct, brand trust.” You then run a factor analysis to check whether <strong>these three items actually move in the same direction in the real response data</strong>.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7Btheory%7D%20%5Crightarrow%20%5Ctext%7Bconstruct%20definition%7D%20%5Crightarrow%20%5Ctext%7Bitem%20design%7D%20%5Crightarrow%20%5Ctext%7Bdata%20collection%7D%20%5Crightarrow%20%5Ctext%7Bconsistency%20check%20by%20factor%20analysis%7D%0A"></p>
<p>We do not build theory from factor analysis; we examine, in an exploratory way, whether the data are consistent with a measurement structure that we assumed from theory. This is why research on prior studies and theory beforehand is so important.</p>
<section id="factor-analysis-is-not-a-machine-that-sorts-items-automatically" class="level3">
<h3 class="anchored" data-anchor-id="factor-analysis-is-not-a-machine-that-sorts-items-automatically">Factor analysis is not a machine that sorts items automatically</h3>
<p>Suppose you run a factor analysis on 20 items and get four factors. That alone does not let you say that “human attitudes consist of four constructs.” What factor analysis shows is only the statistical fact that “in this sample, the correlation structure of this item set can be summarized fairly well by about four common factors.”</p>
<p>Whether those four factors are brand trust, quality evaluation, or brand attachment is not decided by the statistical result. You have to interpret them using prior research, the content of the items, the definition of the construct, and the purpose of the research. Please avoid giving plausible-sounding names to whatever factors come out.</p>
</section>
<section id="statistical-grouping-and-theoretical-validity-are-different-things" class="level3">
<h3 class="anchored" data-anchor-id="statistical-grouping-and-theoretical-validity-are-different-things">Statistical grouping and theoretical validity are different things</h3>
<p>Suppose four items, “high quality,” “good design,” “reasonably priced,” and “a well-known brand,” group into one factor statistically. That alone does not mean you may call the factor “brand value.” There are several possible reasons why items group statistically:</p>
<ul>
<li>They really measure the same construct</li>
<li>Respondents tend to rate everything high</li>
<li>There is a halo effect</li>
<li>The item wordings are similar</li>
<li>There is a method effect from the same response format</li>
</ul>
<p>A high factor loading does not prove that the items belong to the same concept in theory.</p>
</section>
</section>
<section id="step-2-prepare-several-items-for-each-construct" class="level2">
<h2 class="anchored" data-anchor-id="step-2-prepare-several-items-for-each-construct">Step 2: Prepare several items for each construct</h2>
<p>As a rule, prepare several items for each construct. Do not line up items that merely rephrase the same sentence. Items with the same meaning tend to raise Cronbach’s alpha, but this does not mean that the construct is covered adequately. It is desirable for the items to represent different aspects of the construct appropriately.</p>
<p>For example, compare these two ways of measuring brand trust.</p>
<p><strong>An example of rephrasing</strong></p>
<ul>
<li>This brand is trustworthy</li>
<li>This brand is reliable</li>
<li>This brand is dependable</li>
</ul>
<p>All three ask almost the same thing. The answers will be similar, so alpha will be high. But if you duplicate content to raise alpha, you can no longer tell whether the necessary aspects of brand trust are covered. Whether they are covered has to be examined separately. Note that when the concept you want to measure is narrow, items with close meanings can be appropriate, and they can also help average out errors caused by differences in wording.</p>
<p><strong>An example of different aspects</strong></p>
<ul>
<li>I think this brand keeps its promises (the aspect of fulfilling promises)</li>
<li>This brand is sincere (the aspect of caring about the other party)</li>
<li>I feel secure using this brand (the aspect of reassurance in use)</li>
</ul>
<p>All three are part of “brand trust,” but each looks at a different aspect, so the concept is captured more broadly. However, if you vary the aspects too much, the correlations among items fall and the items no longer form one factor. In light of the definition of the construct, choose items within the range where you can say they are “different aspects of the same concept.”</p>
<div class="callout callout-style-default callout-tip callout-titled" title="A questionnaire tip: labeling the options of a 7-point scale">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>A questionnaire tip: labeling the options of a 7-point scale
</div>
</div>
<div class="callout-body-container callout-body">
<p>There are two main ways to label the options.</p>
<ul>
<li><strong>Put a verbal label on all seven options</strong>: the meaning of each option is clear. On the other hand, words such as “very,” “extremely,” and “quite” feel different in strength to different people.</li>
<li><strong>Label only the two ends and leave only numbers in between</strong>: this makes it easier to avoid differences in how strongly the words are felt.</li>
</ul>
<pre><code>Disagree  1 - 2 - 3 - 4 - 5 - 6 - 7  Agree</code></pre>
<p>Which one to use depends on the purpose of the research and on the format of the existing scale you use. What deserves attention is that, in either form, <strong>treating the scores as equally spaced numbers is the analyst’s assumption (a simplification)</strong>. The way of labeling does not guarantee equal spacing. In this article, we treat responses as numbers under this assumption.</p>
</div>
</div>
<p>If a scale has been used widely in prior research, using the existing scale is often better than writing items from scratch, because its validity has been examined and it is easy to compare with other studies. This does not mean, however, that “the existing study used three items, so we can use them as they are.” If the industry, culture, respondents, or purpose of the survey differ, the same factor structure may not be reproduced. Even with an existing scale, it is worth checking the structure in your own data.</p>
</section>
<section id="example-data" class="level2">
<h2 class="anchored" data-anchor-id="example-data">Example data</h2>
<p>From here we follow the steps in R. Suppose we measured nine items on a 7-point scale. The theoretical expectation is the following three constructs.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Construct</th>
<th>Item</th>
<th>Wording (example)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Brand trust</td>
<td>Q1</td>
<td>This brand is sincere</td>
</tr>
<tr class="even">
<td></td>
<td>Q2</td>
<td>I think this brand keeps its promises</td>
</tr>
<tr class="odd">
<td></td>
<td>Q3</td>
<td>I feel secure using this brand</td>
</tr>
<tr class="even">
<td>Perceived quality</td>
<td>Q4</td>
<td>This brand’s products are of high quality</td>
</tr>
<tr class="odd">
<td></td>
<td>Q5</td>
<td>This brand’s products perform well</td>
</tr>
<tr class="even">
<td></td>
<td>Q6 (reverse-keyed)</td>
<td>The quality of this brand’s products varies</td>
</tr>
<tr class="odd">
<td>Price sensitivity</td>
<td>Q7</td>
<td>I notice even small price differences</td>
</tr>
<tr class="even">
<td></td>
<td>Q8</td>
<td>I am tempted to buy when there is a discount</td>
</tr>
<tr class="odd">
<td></td>
<td>Q9</td>
<td>If products are similar, I choose the cheaper one</td>
</tr>
</tbody>
</table>
<p>The wordings are examples (the data are generated with random numbers, and no actual survey corresponds to these wordings).</p>
<p>The outcome variable Y is purchase intention (one item on a 7-point scale).</p>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Note
</div>
</div>
<div class="callout-body-container callout-body">
<p>In this article, we treat 7-point responses as numbers and use Pearson correlation and linear regression. This is a common simplification in practice. If the response distributions are strongly skewed, you can also consider treating them as ordinal. For example, in factor analysis you can use polychoric correlations (<code>fa(..., cor = "poly")</code>). If purchase intention is measured with a single item, you can choose ordinal logistic regression instead of linear regression.</p>
</div>
</div>
<p>The following code creates the example data (the random seed is fixed, so you get the same data).</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>)</span>
<span id="cb2-2">n   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span></span>
<span id="cb2-3">Phi <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">matrix</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>,</span>
<span id="cb2-4">                <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>,</span>
<span id="cb2-5">               <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>,<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span>,  <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">byrow =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># correlations among the 3 constructs</span></span>
<span id="cb2-6">Fm  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">matrix</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>), n) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%*%</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">chol</span>(Phi)</span>
<span id="cb2-7">lam <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">75</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>,  .<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">78</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">72</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">68</span>,  .<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">75</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">70</span>,.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">65</span>)       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># item loadings (the "true" values)</span></span>
<span id="cb2-8">fac <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rep</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">each =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb2-9">to7 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(z) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cut</span>(z, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">Inf</span>,<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.6</span>,<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>,<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>,<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.4</span>,<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>,<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.6</span>,<span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">Inf</span>)))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># make 7-point responses</span></span>
<span id="cb2-10">X <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sapply</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>, <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(j) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to7</span>(lam[j] <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> Fm[, fac[j]] <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> lam[j]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">^</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n)))</span>
<span id="cb2-11">X[, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>] <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>L <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> X[, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>]                                    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># record Q6 as a reverse-keyed item</span></span>
<span id="cb2-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">colnames</span>(X) <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)</span>
<span id="cb2-13">b <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">45</span>, .<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">30</span>, <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>.<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">20</span>)                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># effects of the 3 constructs on purchase intention</span></span>
<span id="cb2-14">v <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">drop</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">t</span>(b) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%*%</span> Phi <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%*%</span> b)                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># variance of the signal part (including correlations among the constructs)</span></span>
<span id="cb2-15">Y <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to7</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">drop</span>(Fm <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%*%</span> b) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> v) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n))   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># add error so that the total variance is 1</span></span>
<span id="cb2-16">dat <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(X, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">Y =</span> Y)</span>
<span id="cb2-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(dat)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Y
1  5  5  3  3  3  3  4  4  6 6
2  2  4  2  3  3  5  5  4  5 3
3  4  4  3  3  4  5  5  6  3 4
4  5  4  4  4  5  1  5  4  4 3
5  4  4  4  4  2  7  3  4  4 4
6  2  1  1  2  2  6  4  5  5 1</code></pre>
</div>
</div>
</section>
<section id="step-3-examine-how-the-items-group-with-exploratory-factor-analysis" class="level2">
<h2 class="anchored" data-anchor-id="step-3-examine-how-the-items-group-with-exploratory-factor-analysis">Step 3: Examine how the items group, with exploratory factor analysis</h2>
<p>Once the items are ready, examine how they group by using exploratory factor analysis (EFA). The role we expect of EFA here is not “to invent constructs from a state of knowing nothing.” It is <strong>to examine, in an exploratory way, whether the item structure we assumed from theory is consistent with the actual data</strong>. EFA is different from confirmatory factor analysis (CFA), which specifies in advance as a model which item measures which factor and tests it. The result of EFA is material for judging consistency with your expectation; it does not mean that the measurement structure has been verified.</p>
<p>First, as a guide to the number of factors, look at the eigenvalues of the correlation matrix and at parallel analysis. The count of eigenvalues of 1 or more is only a rough guide. Parallel analysis compares the eigenvalues of the real data with those obtained from random data, and uses the comparison as a clue to the number of factors. Decide the number of factors together with your theoretical expectation. Then extract three factors by principal axis factoring with promax rotation.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(psych)</span>
<span id="cb4-2">items <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q"</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)</span>
<span id="cb4-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">eigen</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cor</span>(dat[, items]))<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>values, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1] 2.918 1.921 1.107 0.640 0.584 0.528 0.490 0.462 0.350</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>)</span>
<span id="cb6-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fa.parallel</span>(dat[, items], <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fa =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fa"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fm =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pa"</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parallel analysis (a figure appears)</span></span></code></pre></div></div>
<div class="cell-output-display">
<div>
<figure class="figure">
<p><img src="https://im-research-yt.github.io/posts/scale-to-regression/index_files/figure-html/unnamed-chunk-2-1.png" class="img-fluid figure-img" width="672"></p>
</figure>
</div>
</div>
<div class="cell-output cell-output-stdout">
<pre><code>Parallel analysis suggests that the number of factors =  3  and the number of components =  NA </code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1">fa3 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fa</span>(dat[, items], <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">nfactors =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fm =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pa"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">rotate =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Promax"</span>,</span>
<span id="cb8-2">          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">min.err =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">max.iter =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1000</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># strict convergence criteria for the iterations</span></span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Loading required namespace: GPArotation</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">print</span>(fa3<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>loadings, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cutoff =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>
Loadings:
   PA1    PA3    PA2   
Q1         0.731       
Q2         0.724       
Q3         0.582       
Q4  0.769              
Q5  0.775              
Q6 -0.632              
Q7                0.695
Q8                0.674
Q9                0.639

                PA1   PA3   PA2
SS loadings    1.62 1.430 1.350
Proportion Var 0.18 0.159 0.150
Cumulative Var 0.18 0.339 0.489</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(fa3<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Phi, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>     PA1   PA3   PA2
PA1 1.00  0.54  0.01
PA3 0.54  1.00 -0.20
PA2 0.01 -0.20  1.00</code></pre>
</div>
</div>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
Note
</div>
</div>
<div class="callout-body-container callout-body">
<p>To make the results easy to reproduce, this article uses <code>rotate = "Promax"</code> (with a capital P). The lowercase <code>"promax"</code> is not wrong, but its internal normalization differs, so the values change slightly.</p>
<p><code>min.err = 1e-8, max.iter = 1000</code> makes the iterations of principal axis factoring converge under strict criteria. The default criteria are loose, so the extraction can differ slightly around the third decimal place. To make the results match, this article uses the strict criteria.</p>
<p>Note also that the promax rotation calculation differs a little between versions of psych, and the third decimal place of the loadings can change (we confirmed a difference of at most 0.003 between psych 2.4.1 and 2.6.5). The extraction (principal axis factoring) gives the same result. The interpretation does not change.</p>
</div>
</div>
<p>Here is what to look at.</p>
<ul>
<li><strong>Number of factors</strong>: Look at the eigenvalues (the number of those at 1 or more) and the parallel analysis figure (the number of factors whose real-data eigenvalues exceed those from random data), and check whether they are consistent with the three factors we expected from theory.</li>
<li><strong>Item groupings</strong>: Check whether Q1 to Q3, Q4 to Q6, and Q7 to Q9 load on the same factor, as expected. (Labels such as <code>PA1</code> only indicate the order. Read the meaning of a factor from the items that load on it.)</li>
<li><strong>The negative loading of Q6</strong>: Q6 has the opposite sign to Q4 and Q5 within the same factor. This is a clue that Q6 may be a reverse-keyed item. However, the sign is only a guide (the sign of a whole factor can be flipped). Whether an item is reverse-keyed is decided by the meaning of the wording.</li>
<li><strong>Whether any item loads strongly on several factors (cross-loading)</strong>.</li>
</ul>
<p>For example, if only Q3 loaded strongly on the perceived quality factor, consider the following before deleting it:</p>
<ul>
<li>Was the wording of Q3 appropriate?</li>
<li>Are brand trust and perceived quality conceptually too close?</li>
<li>Is there a problem with the translation or the phrasing?</li>
<li>Did respondents read it with a meaning different from the one we expected?</li>
</ul>
<p>Use the result of EFA not as a “keep or delete verdict,” but as <strong>material for understanding the gap between the measurement model assumed from theory and the actual response behavior</strong>. If you mechanically delete a content-wise important item only because its loading is a little low, you may damage content validity.</p>
</section>
<section id="step-4-align-the-direction-of-reverse-keyed-items" class="level2">
<h2 class="anchored" data-anchor-id="step-4-align-the-direction-of-reverse-keyed-items">Step 4: Align the direction of reverse-keyed items</h2>
<p>Q6 is a reverse-keyed item. In practice, it is easier to follow if you decide the reverse-keyed items from the meaning of the wording before the analysis and align their direction in advance. In this article, we ran the EFA first, to show that a negative loading can be a clue. Use the minimum and maximum of the scale (here 1 and 7) and compute (minimum + maximum) − original value, that is, <code>8 - Q6</code>. For 1 to 7, use <code>8 - Q6</code>; for 1 to 5, use <code>6 - Q6</code>. The same formula also works for a scale whose minimum is not 1 (for example, 0 to 10). Use the ends of the scale on the questionnaire (1 and 7 for a 7-point scale), not the minimum and maximum observed in the data. Whether an item is reverse-keyed is decided by the meaning of the wording (theory).</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1">dat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Q6r <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> dat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Q6</span></code></pre></div></div>
</div>
</section>
<section id="step-5-check-internal-consistency-cronbachs-alpha" class="level2">
<h2 class="anchored" data-anchor-id="step-5-check-internal-consistency-cronbachs-alpha">Step 5: Check internal consistency (Cronbach’s alpha)</h2>
<p>Once you have examined the factor structure, check the internal consistency of each item group. A typical index is Cronbach’s alpha. For example, <img src="https://latex.codecogs.com/png.latex?%5Calpha%20=%20.84"> indicates that the item group has relatively high internal consistency.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb15-1">a_trust   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">alpha</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q3"</span>)],  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">check.keys =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb15-2">a_quality <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">alpha</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q4"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q5"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q6r"</span>)], <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">check.keys =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb15-3">a_price   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">alpha</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q8"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q9"</span>)],  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">check.keys =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb15-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">trust   =</span> a_trust<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>total<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>raw_alpha,</span>
<span id="cb15-5">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">quality =</span> a_quality<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>total<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>raw_alpha,</span>
<span id="cb15-6">        <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">price   =</span> a_price<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>total<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>raw_alpha), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  trust quality   price 
  0.731   0.774   0.705 </code></pre>
</div>
</div>
<p>There are two points to note.</p>
<ul>
<li><strong>A high alpha does not prove a one-factor structure.</strong> Alpha is an index of internal consistency, not an index for verifying factor structure. Also, <strong>alpha alone cannot tell you about reliability in general or about validity.</strong> The order is: examine the structure by factor analysis, then check the internal consistency of that item group.</li>
<li>Alpha tends to rise as the number of items grows. If needed, you may use McDonald’s omega alongside it.</li>
</ul>
</section>
<section id="step-6-build-the-subscales" class="level2">
<h2 class="anchored" data-anchor-id="step-6-build-the-subscales">Step 6: Build the subscales</h2>
<p>Once you have examined the structure and checked the internal consistency, build a subscale for each construct. Usually the simple mean of the items is the default.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BTrust%7D%20=%20%5Cfrac%7BQ_1%20+%20Q_2%20+%20Q_3%7D%7B3%7D,%20%5Cqquad%0A%5Ctext%7BQuality%7D%20=%20%5Cfrac%7BQ_4%20+%20Q_5%20+%20Q_%7B6r%7D%7D%7B3%7D%0A"></p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb17-1">dat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Trust   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rowMeans</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q3"</span>)])</span>
<span id="cb17-2">dat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Quality <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rowMeans</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q4"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q5"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q6r"</span>)])</span>
<span id="cb17-3">dat<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>Price   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rowMeans</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q7"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q8"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Q9"</span>)])</span>
<span id="cb17-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cor</span>(dat[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Trust"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Quality"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Price"</span>)]), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>        Trust Quality Price
Trust    1.00    0.43 -0.14
Quality  0.43    1.00  0.01
Price   -0.14    0.01  1.00</code></pre>
</div>
</div>
<p>A scale built from a simple mean still contains measurement error. An ordinary regression that uses such a scale does not model the measurement error explicitly. Therefore, the coefficients you obtain are not necessarily the same as the relationships among the latent constructs themselves. With low reliability, this effect can be larger. In multiple regression especially, the effect of measurement error also depends on the correlations among the predictors, so you cannot judge the effect on the coefficients from reliability alone.</p>
<p>A simple mean has the following advantages:</p>
<ul>
<li>The calculation is clear and highly reproducible</li>
<li>It depends relatively little on the sample</li>
<li>The unit of the original response scale is kept, so it is easy to interpret</li>
<li>It can be used in both regression and QCA</li>
</ul>
<section id="why-not-use-factor-scores" class="level3">
<h3 class="anchored" data-anchor-id="why-not-use-factor-scores">Why not use factor scores?</h3>
<p>Using factor scores is not wrong in itself. However, factor scores have problems: the weights depend on the sample, the values change with the estimation method, the meaning of the score itself is hard to grasp, and the scale may not be the same in another sample. Unless there is a special reason, a policy of using simple-mean scales whose reliability has been checked is quite reasonable for MBA-level research.</p>
</section>
<section id="where-does-confirmatory-factor-analysis-cfa-come-in" class="level3">
<h3 class="anchored" data-anchor-id="where-does-confirmatory-factor-analysis-cfa-come-in">Where does confirmatory factor analysis (CFA) come in?</h3>
<p>In exploratory MBA research, it is practical to build simple-mean scales based on the content of the items, the EFA results, and internal consistency. However, that alone does not mean that the validity of the measurement has been fully established.</p>
<p>How far to verify depends on the track record of verification of an existing scale, the extent of your changes, and the strength of the claim the research needs to make. When you want to verify the measurement structure explicitly, or when you have built a new scale or changed one substantially, consider additional verification such as CFA. In CFA, you specify in advance, as a model, which item measures which factor. If an existing measurement model is clear, you can also start with CFA without going through EFA. So there is no fixed order of “always do CFA after EFA.”</p>
<p>If your sample is large enough, a better approach is to split the sample, running EFA on one part for exploration and CFA on the other for verification. Even if you do run CFA, you do not necessarily have to use the CFA factor scores afterward.</p>
</section>
</section>
<section id="step-7-use-the-subscales-in-regression-and-qca" class="level2">
<h2 class="anchored" data-anchor-id="step-7-use-the-subscales-in-regression-and-qca">Step 7: Use the subscales in regression and QCA</h2>
<section id="regression" class="level3">
<h3 class="anchored" data-anchor-id="regression">Regression</h3>
<p>Once you have the subscales, you can run an ordinary regression.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AY%20=%20%5Cbeta_0%20+%20%5Cbeta_1%20%5Ctext%7BTrust%7D%20+%20%5Cbeta_2%20%5Ctext%7BQuality%7D%20+%20%5Cbeta_3%20%5Ctext%7BPrice%7D%20+%20%5Cvarepsilon%0A"></p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb19" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb19-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(Y <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> Trust <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> Quality <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> Price, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data =</span> dat))</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>
Call:
lm(formula = Y ~ Trust + Quality + Price, data = dat)

Residuals:
     Min       1Q   Median       3Q      Max 
-3.11817 -0.87767  0.06223  0.76259  2.85718 

Coefficients:
            Estimate Std. Error t value Pr(&gt;|t|)    
(Intercept)  1.42862    0.37338   3.826 0.000159 ***
Trust        0.57160    0.06622   8.632 3.78e-16 ***
Quality      0.36507    0.05991   6.093 3.44e-09 ***
Price       -0.27133    0.05812  -4.668 4.61e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.157 on 296 degrees of freedom
Multiple R-squared:  0.4399,    Adjusted R-squared:  0.4342 
F-statistic: 77.49 on 3 and 296 DF,  p-value: &lt; 2.2e-16</code></pre>
</div>
</div>
</section>
<section id="qca" class="level3">
<h3 class="anchored" data-anchor-id="qca">QCA</h3>
<p>QCA needs a value of each condition for each case. In this example, the subscales of brand trust, perceived quality, and price sensitivity can be used as conditions. In fuzzy-set QCA (fsQCA), you <strong>calibrate</strong> each of them into set membership (values from 0 to 1). The outcome, purchase intention Y, is also calibrated into the set “high purchase intention.”</p>
<p>Then, for example, for the combination “high brand trust, high perceived quality, and low price sensitivity,” we examine a sufficiency relation such as the following (<code>~</code> is negation and <code>*</code> is logical AND).</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathrm%7BTRUST%7D%20*%20%5Cmathrm%7BQUALITY%7D%20*%20%7B%5Csim%7D%5Cmathrm%7BPRICE%7D%20%5Crightarrow%20%5Cmathrm%7BPURCHASE%7D%0A"></p>
<p>Points to note:</p>
<ul>
<li>This expression is not an analysis result. It is an <strong>example</strong> of a combination to examine.</li>
<li>Decide the calibration anchors (full membership, full non-membership, and the crossover point) from the meaning of the set, not by mechanically converting the scale mean to a 0 to 1 range.</li>
<li>Y in the example measures purchase “intention.” Please write it separately from actual purchase “behavior.”</li>
</ul>
<p>For the calibration and the analysis in practice, see the <a href="../../posts/thsqca-beginners-1/index.html">ThSQCA for beginners series</a>.</p>
</section>
<section id="what-it-means-to-use-regression-and-qca-together" class="level3">
<h3 class="anchored" data-anchor-id="what-it-means-to-use-regression-and-qca-together">What it means to use regression and QCA together</h3>
<p>If you run regression and QCA on the same subscales, you can look at the same phenomenon from different viewpoints. Regression looks at the <strong>average association</strong> when the other variables are held constant. QCA looks at <strong>which combinations of conditions lead to the outcome</strong>. The two are better seen as complementary methods with different viewpoints than as competing methods. If you use common subscales, the measurement is unified across the two analyses.</p>
</section>
</section>
<section id="what-to-report" class="level2">
<h2 class="anchored" data-anchor-id="what-to-report">What to report</h2>
<p>In a paper or report, writing at least the following lets readers follow your procedure:</p>
<ul>
<li>The definition of each construct and the source of the items (an existing scale, or one you created)</li>
<li>The sample size and how missing values were handled (for example, only complete cases were used)</li>
<li>The estimation method of the factor analysis (such as principal axis factoring), the rotation (promax), and the basis for the number of factors</li>
<li>The reverse-keyed items</li>
<li>The number of items and the alpha of each subscale</li>
<li>How the subscales were built (the simple mean of the items)</li>
</ul>
</section>
<section id="the-whole-procedure-in-a-few-words" class="level2">
<h2 class="anchored" data-anchor-id="the-whole-procedure-in-a-few-words">The whole procedure in a few words</h2>
<p>A standard practical procedure has the following 11 stages. Steps 1 to 7 of this article rearrange these stages, except CFA (8) and SEM (11), in the order of building a scale (with a check of reverse-keyed items added).</p>
<ol type="1">
<li>Define the construct from prior research</li>
<li>Prepare several questionnaire items for each construct</li>
<li>Hold in advance a theoretical expectation of “which item measures which construct”</li>
<li>Use EFA to examine, in an exploratory way, whether that expectation is consistent with the actual data structure</li>
<li>Examine the items from both theoretical and statistical viewpoints</li>
<li>Check internal consistency with Cronbach’s alpha (and McDonald’s omega if needed)</li>
<li>Build subscales by simple means</li>
<li>Verify the measurement structure further with CFA, if needed</li>
<li>Use the subscales in regression and similar analyses</li>
<li>In QCA, calibrate the subscales and use them</li>
<li>If the structure among latent variables is itself the research aim, consider SEM</li>
</ol>
<p>The most important point is not “collect data and then look for meaning by factor analysis,” but “define the meaning from theory, and use factor analysis to examine, in an exploratory way, whether that meaning also holds in the data.”</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7Btheory%7D%20%5Crightarrow%20%5Ctext%7Bconstruct%7D%20%5Crightarrow%20%5Ctext%7Bitems%7D%20%5Crightarrow%20%5Ctext%7Bexamination%20of%20the%20measurement%20structure%7D%20%5Crightarrow%20%5Ctext%7Bscaling%7D%20%5Crightarrow%20%5Ctext%7Bhypothesis%20tests%20by%20regression,%20QCA,%20etc.%7D%0A"></p>
<p>You do not need to decide mechanically that “we use constructs, so we use SEM.” What matters is that <strong>the research question, the theory, the measurement, the way of building scales, and the method of analysis are consistent with one another</strong>.</p>
<p>This article does not cover why you might not use SEM, or how SEM compares. I plan to write about that in a separate article (Notes).</p>
</section>
<section id="what-to-read-next" class="level2">
<h2 class="anchored" data-anchor-id="what-to-read-next">What to read next</h2>
<p>The subscales you built in this article can also be used in QCA. While regression looks at the average association when the other variables are held constant, QCA looks for <strong>which combinations of conditions lead to the outcome</strong>. ThSQCA is an R package that shows how those combinations change when you move the target level (the threshold) of the outcome.</p>
<ul>
<li><a href="../../posts/why-qca-decisions/index.html">Why QCA suits decision-making: looking for “recipes” instead of single effects</a></li>
<li><a href="../../posts/introducing-thsqca/index.html">Introducing ThSQCA: threshold-sweep QCA in R</a></li>
<li><a href="../../posts/thsqca-beginners-1/index.html">ThSQCA for beginners, part 1: your first threshold sweep</a></li>
<li><a href="../../index.html">Home page</a>: all articles, in reading order</li>
</ul>
</section>
<section id="r-environment-for-this-page" class="level2">
<h2 class="anchored" data-anchor-id="r-environment-for-this-page">R environment for this page</h2>
<p>The results were checked in the following environment. A fixed seed produces the same data, but results can change slightly with different versions of R or of the packages.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb21" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb21-1">R.version.string</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1] "R version 4.6.1 (2026-06-24 ucrt)"</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb23" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb23-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">packageVersion</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"psych"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1] '2.6.5'</code></pre>
</div>
</div>


</section>

 ]]></description>
  <category>marketing</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/scale-to-regression/</guid>
  <pubDate>Wed, 07 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/scale-to-regression/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>QCA in marketing and management: ten papers to read first (applications)</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/reading-list-applied/</link>
  <description><![CDATA[ 





<p>The <a href="../../posts/reading-list-basics/index.html">basics list</a> introduced the standard readings for learning QCA. The next question is probably “How is it actually used in research?” Here are papers from marketing and management that are worth reading as models for your own work, together with the theoretical background from management and organization research, grouped by purpose.</p>
<p>As in the basics list, the summaries stay within what the publishers’ abstracts say.</p>
<section id="applications-in-marketing-and-services" class="level2">
<h2 class="anchored" data-anchor-id="applications-in-marketing-and-services">1. Applications in marketing and services</h2>
<ul>
<li>Ordanini, A., Parasuraman, A., &amp; Rubera, G. (2014). When the recipe is more important than the ingredients: A qualitative comparative analysis (QCA) of service innovation configurations. <em>Journal of Service Research</em>, 17(2), 134-149. <a href="https://doi.org/10.1177/1094670513513337">https://doi.org/10.1177/1094670513513337</a> Studies luxury hotel services and uses QCA to examine which combinations of attributes lead to the adoption of a new service. An application that looks not only at individual attributes but at how they are combined.</li>
<li>Frambach, R. T., Fiss, P. C., &amp; Ingenbleek, P. T. M. (2016). How important is customer orientation for firm performance? A fuzzy set analysis of orientations, strategies, and environments. <em>Journal of Business Research</em>, 69(4), 1428-1436. <a href="https://doi.org/10.1016/j.jbusres.2015.10.120">https://doi.org/10.1016/j.jbusres.2015.10.120</a> Combines customer orientation with other strategic orientations, strategy types, and market environments, and uses fsQCA to find the configurations that go with high firm performance. An application that considers the role of customer orientation through its combinations with other conditions.</li>
</ul>
</section>
<section id="theoretical-background-in-management-and-organization-research" class="level2">
<h2 class="anchored" data-anchor-id="theoretical-background-in-management-and-organization-research">2. Theoretical background in management and organization research</h2>
<ul>
<li>Fiss, P. C. (2007). A set-theoretic approach to organizational configurations. <em>Academy of Management Review</em>, 32(4), 1180-1198. <a href="https://doi.org/10.5465/amr.2007.26586092">https://doi.org/10.5465/amr.2007.26586092</a> Treats an organization as a combination of elements and argues for analyzing the link between those combinations and outcomes with set theory. A foundation for thinking about several combinations that lead to the same outcome.</li>
<li>Fiss, P. C. (2011). Building better causal theories: A fuzzy set approach to typologies in organization research. <em>Academy of Management Journal</em>, 54(2), 393-420. <a href="https://doi.org/10.5465/amj.2011.60263120">https://doi.org/10.5465/amj.2011.60263120</a> Analyzes organizational typologies with fuzzy sets and examines the combinations of conditions that lead to an outcome. Important for understanding that the causes can be asymmetric between the presence and the absence of an outcome.</li>
<li>Woodside, A. G. (2013). Moving beyond multiple regression analysis to algorithms: Calling for adoption of a paradigm shift from symmetric to asymmetric thinking in data analysis and crafting theory. <em>Journal of Business Research</em>, 66(4), 463-472. <a href="https://doi.org/10.1016/j.jbusres.2012.12.021">https://doi.org/10.1016/j.jbusres.2012.12.021</a> Alongside the effects of single variables in multiple regression, it proposes an analysis that looks at combinations of conditions and at causal asymmetry. It discusses how to analyze data and build theory, using regression and fsQCA on the same data.</li>
<li>Misangyi, V. F., Greckhamer, T., Furnari, S., Fiss, P. C., Crilly, D., &amp; Aguilera, R. (2017). Embracing causal complexity: The emergence of a neo-configurational perspective. <em>Journal of Management</em>, 43(1), 255-282. <a href="https://doi.org/10.1177/0149206316679252">https://doi.org/10.1177/0149206316679252</a> Reviews how QCA has developed in management and organization research and sets out a “neo-configurational perspective” for capturing causal complexity. It links set membership, necessity and sufficiency, and counterfactual analysis to theoretical viewpoints.</li>
</ul>
</section>
<section id="how-to-run-and-report-an-analysis-practical-guides" class="level2">
<h2 class="anchored" data-anchor-id="how-to-run-and-report-an-analysis-practical-guides">3. How to run and report an analysis (practical guides)</h2>
<ul>
<li>Greckhamer, T., Furnari, S., Fiss, P. C., &amp; Aguilera, R. V. (2018). Studying configurations with qualitative comparative analysis: Best practices in strategy and organization research. <em>Strategic Organization</em>, 16(4), 482-495. <a href="https://doi.org/10.1177/1476127018786487">https://doi.org/10.1177/1476127018786487</a> Sets out practical guidelines for QCA in strategy and organization research. It covers the whole course of a study, from model building and case selection to calibration, analysis, reporting, and interpretation.</li>
<li>Pappas, I. O., &amp; Woodside, A. G. (2021). Fuzzy-set qualitative comparative analysis (fsQCA): Guidelines for research practice in information systems and marketing. <em>International Journal of Information Management</em>, 58, Article 102310. <a href="https://doi.org/10.1016/j.ijinfomgt.2021.102310">https://doi.org/10.1016/j.ijinfomgt.2021.102310</a> A practical guide to using fsQCA in information systems and marketing research. It explains the procedure with data from earlier studies and also touches on checking predictive validity and combining fsQCA with methods such as SEM.</li>
<li>Park, Y., Fiss, P. C., &amp; El Sawy, O. A. (2020). Theorizing the multiplicity of digital phenomena: The ecology of configurations, causal recipes, and guidelines for applying QCA. <em>MIS Quarterly</em>, 44(4), 1493-1520. <a href="https://doi.org/10.25300/MISQ/2020/13879">https://doi.org/10.25300/MISQ/2020/13879</a> For digital phenomena that involve several theoretical perspectives and combinations of conditions, it offers a framework that ties QCA to theory building. Through examples, it explains how to apply QCA to deductive theory testing and to inductive theory building.</li>
</ul>
</section>
<section id="choosing-the-threshold" class="level2">
<h2 class="anchored" data-anchor-id="choosing-the-threshold">4. Choosing the threshold</h2>
<ul>
<li>Krogslund, C., Choi, D. D., &amp; Poertner, M. (2015). Fuzzy sets on shaky ground: Parameter sensitivity and confirmation bias in fsQCA. <em>Political Analysis</em>, 23(1), 21-41. <a href="https://doi.org/10.1093/pan/mpu016">https://doi.org/10.1093/pan/mpu016</a> Argues that fsQCA results can change with small changes in the parameters a user chooses, and that combinations containing randomly generated variables are often found to be sufficient for an outcome. It re-analyzes three existing studies and uses sensitivity analyses and Monte Carlo simulations.</li>
</ul>
<p>On how the placement of the threshold changes the results, see also Toyoda (2026), <em>Quality &amp; Quantity</em>, <a href="https://doi.org/10.1007/s11135-026-03092-3">https://doi.org/10.1007/s11135-026-03092-3</a>.</p>


</section>

 ]]></description>
  <category>QCA</category>
  <category>marketing</category>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/reading-list-applied/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/reading-list-applied/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Papers and books for getting to know QCA: six to read first (basics)</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/reading-list-basics/</link>
  <description><![CDATA[ 





<p>The earlier posts explained <a href="../../posts/why-qca-decisions/index.html">why QCA suits decision-making</a> and why the placement of the threshold matters. Here is a short list of the standard readings that people in any field tend to start with when they learn QCA, grouped by purpose.</p>
<p>The summaries below stay within what the publishers’ abstracts and descriptions say. They are not evaluations based on a full reading.</p>
<section id="getting-the-idea-and-the-measures-papers" class="level2">
<h2 class="anchored" data-anchor-id="getting-the-idea-and-the-measures-papers">1. Getting the idea and the measures (papers)</h2>
<ul>
<li>Mahoney, J., &amp; Goertz, G. (2006). A tale of two cultures: Contrasting quantitative and qualitative research. <em>Political Analysis</em>, 14(3), 227-249. <a href="https://doi.org/10.1093/pan/mpj017">https://doi.org/10.1093/pan/mpj017</a> Contrasts quantitative and qualitative research as two cultures with different values, beliefs, and norms, and compares them across ten dimensions, including explanation, causation, case selection, and measurement. A starting point for seeing which research tradition QCA belongs to. <a href="../../posts/paper-guide-mahoney-goertz/index.html">Paper guide available</a></li>
<li>Ragin, C. C. (2006). Set relations in social research: Evaluating their consistency and coverage. <em>Political Analysis</em>, 14(3), 291-310. <a href="https://doi.org/10.1093/pan/mpj019">https://doi.org/10.1093/pan/mpj019</a> Introduces two measures for evaluating set relations, consistency and coverage. It shows that fuzzy sets overcome earlier limits on binary variables and on tolerance for error. <a href="../../posts/paper-guide-ragin/index.html">Paper guide available</a></li>
<li>Schneider, C. Q., &amp; Wagemann, C. (2010). Standards of good practice in qualitative comparative analysis (QCA) and fuzzy-sets. <em>Comparative Sociology</em>, 9(3), 397-418. <a href="https://doi.org/10.1163/156913210X12493538729793">https://doi.org/10.1163/156913210X12493538729793</a> Sets out standards of good practice for QCA and fuzzy sets. Useful for checking the procedures to follow before you start an analysis.</li>
</ul>
</section>
<section id="learning-the-method-systematically-books" class="level2">
<h2 class="anchored" data-anchor-id="learning-the-method-systematically-books">2. Learning the method systematically (books)</h2>
<ul>
<li>Ragin, C. C. (2008). <em>Redesigning Social Inquiry: Fuzzy Sets and Beyond</em>. University of Chicago Press. Contrasts set-theoretic analysis with conventional quantitative research and explains calibration, combinations of conditions, and causal complexity. A book for learning the way of thinking behind QCA, not only its procedure.</li>
<li>Schneider, C. Q., &amp; Wagemann, C. (2012). <em>Set-Theoretic Methods for the Social Sciences: A Guide to Qualitative Comparative Analysis</em>. Cambridge University Press. <a href="https://doi.org/10.1017/CBO9781139004244">https://doi.org/10.1017/CBO9781139004244</a> A textbook that runs from the basics of set theory to the practice of QCA. It also covers cautions and common problems, which helps you understand the procedure together with the reasons behind each judgment.</li>
<li>Oana, I.-E., Schneider, C. Q., &amp; Thomann, E. (2021). <em>Qualitative Comparative Analysis Using R: A Beginner’s Guide</em>. Cambridge University Press. <a href="https://doi.org/10.1017/9781009006781">https://doi.org/10.1017/9781009006781</a> A beginner’s guide to running QCA in R. A good fit for readers who want to carry out the analysis in R and check the basic operations.</li>
</ul>
<p>The next post introduces papers that use QCA in marketing and management, together with the theoretical background from management and organization research (applications).</p>


</section>

 ]]></description>
  <category>QCA</category>
  <category>notes</category>
  <guid>https://im-research-yt.github.io/posts/reading-list-basics/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/reading-list-basics/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>ThSQCA for beginners, part 1: your first threshold sweep</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/thsqca-beginners-1/</link>
  <description><![CDATA[ 





<p>This is the first part of a beginner’s series on <strong>ThSQCA</strong>, an R package for threshold-sweep qualitative comparative analysis (QCA). You do not need to know QCA beforehand. By the end of this post you will have run a threshold sweep yourself and read its result.</p>
<section id="the-one-idea-you-need" class="level2">
<h2 class="anchored" data-anchor-id="the-one-idea-you-need">The one idea you need</h2>
<p>QCA looks for combinations of conditions that are <em>sufficient</em> for an outcome. Suppose we study customer loyalty. A combination such as “high quality AND high service” is sufficient for high loyalty if (almost) every customer who has both also has high loyalty.</p>
<p>To do this, QCA first has to decide who counts as “high”. With survey scores from 0 to 10, we pick a <strong>threshold</strong>: a customer is “high” on a variable when the score is greater than or equal to the threshold. In this series, each score is split at the threshold into “high” and “not high” (crisp-set QCA).</p>
<p>Here is the catch. A threshold of 7 and a threshold of 8 are both reasonable, but they can lead to different answers. A normal QCA analysis picks one threshold and reports one answer. ThSQCA reruns the same analysis for a whole range of thresholds and puts all the answers in one table, so you can see where the answer holds and where it changes.</p>
<p>ThSQCA does not replace the <a href="https://cran.r-project.org/package=QCA">QCA</a> package. For every threshold, it calls QCA’s <code>truthTable()</code> and <code>minimize()</code> for you, with identical settings each time, and collects the results.</p>
</section>
<section id="step-1-install-the-packages" class="level2">
<h2 class="anchored" data-anchor-id="step-1-install-the-packages">Step 1: install the packages</h2>
<p>Run this once. (If you already installed them, skip it.)</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QCA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ThSQCA"</span>))</span></code></pre></div></div>
</div>
<p>Then load ThSQCA in every new R session:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span></code></pre></div></div>
</div>
</section>
<section id="step-2-create-a-small-practice-data-set" class="level2">
<h2 class="anchored" data-anchor-id="step-2-create-a-small-practice-data-set">Step 2: create a small practice data set</h2>
<p>To keep things reproducible, we simulate 400 customers. Each has four scores from 0 to 10: loyalty (<code>LOY</code>), and evaluations of quality (<code>QUA</code>), service (<code>SER</code>), and store environment (<code>ENV</code>). In this simulated world, loyalty is high when quality and service are both high, or (a little less strongly) when quality and environment are both high. A good analysis should discover this.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">make_demo_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">seed =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>) {</span>
<span id="cb3-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(seed)</span>
<span id="cb3-3">  clip <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(x)))</span>
<span id="cb3-4">  QUA <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb3-5">  SER <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb3-6">  ENV <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb3-7">  core <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, SER), <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, ENV) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-8">  LOY  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(core <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>))</span>
<span id="cb3-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(LOY, QUA, SER, ENV)</span>
<span id="cb3-10">}</span>
<span id="cb3-11"></span>
<span id="cb3-12">demo <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_demo_data</span>()</span>
<span id="cb3-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(demo)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  LOY QUA SER ENV
1   7   7   9   3
2   5   4   7   5
3   4   6   4   4
4   6   6   6   4
5   5   5   4   7
6   0   1   2   5</code></pre>
</div>
</div>
<p>Each row is one customer. You do not have to understand the function above; it only produces the practice data. With your own data, you would simply read your file into a data frame with these kinds of columns.</p>
</section>
<section id="step-3-run-the-sweep" class="level2">
<h2 class="anchored" data-anchor-id="step-3-run-the-sweep">Step 3: run the sweep</h2>
<p>We want to know: <em>how does the answer change as we raise the bar for “high loyalty”?</em> So we keep the thresholds of the three conditions fixed at 7, and vary the outcome threshold from 5 to 8. This is called an <strong>outcome threshold sweep</strong>, and the function is <code>otSweep()</code>.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1">res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(</span>
<span id="cb5-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat         =</span> demo,</span>
<span id="cb5-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome     =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>,</span>
<span id="cb5-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions  =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb5-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,</span>
<span id="cb5-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX        =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QUA =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SER =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ENV =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb5-7">)</span></code></pre></div></div>
</div>
<p>Here is what each line means.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Argument</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>dat</code></td>
<td>the data frame to analyze</td>
</tr>
<tr class="even">
<td><code>outcome</code></td>
<td>the outcome column</td>
</tr>
<tr class="odd">
<td><code>conditions</code></td>
<td>the condition columns</td>
</tr>
<tr class="even">
<td><code>sweep_range</code></td>
<td>the outcome thresholds to try: here 5, 6, 7, and 8</td>
</tr>
<tr class="odd">
<td><code>thrX</code></td>
<td>the fixed threshold for each condition: “high” means 7 or more</td>
</tr>
</tbody>
</table>
<p>Two settings are not written here because they have defaults: the minimum consistency for a combination to count as sufficient (<code>incl.cut</code>, default 0.8) and the minimum number of cases per combination (<code>n.cut</code>, default 1).</p>
</section>
<section id="step-4-read-the-result" class="level2">
<h2 class="anchored" data-anchor-id="step-4-read-the-result">Step 4: read the result</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(res)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>OTS Summary
=========== 

Analysis Parameters:
  Outcome: LOY 
  Conditions: QUA, SER, ENV 
  Consistency cutoff: 0.8 
  Frequency cutoff: 1 

Results by Threshold:

 thrY        expression inclS  covS n_solutions
    5 QUA*SER + QUA*ENV 0.981 0.403           1
    6 QUA*SER + QUA*ENV 0.926 0.565           1
    7           QUA*SER 0.894 0.656           1
    8       No solution    NA    NA           0</code></pre>
</div>
</div>
<p>The table has one row per outcome threshold. The columns are:</p>
<ul>
<li><code>thrY</code>: the outcome threshold used in that row. In the first row, “high loyalty” means <code>LOY &gt;= 5</code>.</li>
<li><code>expression</code>: the sufficient combination found. <code>*</code> means AND, <code>+</code> means OR, and <code>~</code> means NOT.</li>
<li><code>inclS</code>: solution consistency. How reliably the cases covered by the solution are members of the outcome. Higher is better, and 1 is perfect.</li>
<li><code>covS</code>: solution coverage. The share of the outcome cases that the solution explains.</li>
<li><code>n_solutions</code>: how many minimal solutions were found (1 here).</li>
</ul>
<p>Now read the <code>expression</code> column from top to bottom.</p>
<ul>
<li>At <code>LOY &gt;= 5</code> and <code>LOY &gt;= 6</code>, two combinations are sufficient: <code>QUA*SER</code> (high quality and high service) and <code>QUA*ENV</code> (high quality and a high store environment).</li>
<li>At <code>LOY &gt;= 7</code>, only <code>QUA*SER</code> remains.</li>
<li>At <code>LOY &gt;= 8</code>, the result is <strong>No solution</strong>. At this level, no combination of the three conditions reached the required consistency.</li>
</ul>
<p>This is exactly what the simulation was built to contain, and it shows why a sweep is useful. Had we analyzed only <code>LOY &gt;= 6</code>, we would have reported two paths. Had we analyzed only <code>LOY &gt;= 7</code>, we would have reported one. The sweep shows that the answer depends on how high the target is, and where it stops working altogether.</p>
<p>A note on “No solution”: it is a technical result, not a statement that no route to high loyalty exists. It means that, for these data and these settings, QCA could not produce a minimal solution that meets the consistency requirement.</p>
</section>
<section id="step-5-see-the-result-as-a-picture" class="level2">
<h2 class="anchored" data-anchor-id="step-5-see-the-result-as-a-picture">Step 5: see the result as a picture</h2>
<p>A table is precise, but a picture shows the trend at a glance. The summary table is an ordinary data frame (<code>res$summary</code>), so we can plot it with base R. The next chunk draws solution coverage and solution consistency for each outcome threshold.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1">tab <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> res<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary</span>
<span id="cb8-2"></span>
<span id="cb8-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>(tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>thrY, tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>covS, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"b"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pch =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">19</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lwd =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#233A9A"</span>,</span>
<span id="cb8-4">     <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlim =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.8</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">8.2</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ylim =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xaxt =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span>,</span>
<span id="cb8-5">     <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outcome threshold (thrY)"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ylab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Score"</span>,</span>
<span id="cb8-6">     <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">main =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Coverage and consistency by threshold"</span>)</span>
<span id="cb8-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">axis</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">at =</span> tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>thrY)</span>
<span id="cb8-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lines</span>(tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>thrY, tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>inclS, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">type =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"b"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pch =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">17</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lwd =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F28018"</span>)</span>
<span id="cb8-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">abline</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">v =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lty =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey60"</span>)</span>
<span id="cb8-10"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">7.9</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"No solution</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">at thrY = 8"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">adj =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey40"</span>)</span>
<span id="cb8-11"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">legend</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottomleft"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">legend =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Coverage (covS)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Consistency (inclS)"</span>),</span>
<span id="cb8-12">       <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#233A9A"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F28018"</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pch =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">19</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">17</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">lwd =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">bty =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span>)</span></code></pre></div></div>
<div class="cell-output-display">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://im-research-yt.github.io/posts/thsqca-beginners-1/index_files/figure-html/unnamed-chunk-6-1.png" class="img-fluid figure-img" alt="Line chart with outcome threshold on the horizontal axis (5 to 8) and score on the vertical axis (0 to 1). Coverage rises from about 0.40 at threshold 5 to about 0.66 at threshold 7. Consistency falls from about 0.98 to about 0.89. There is no point at threshold 8, which is labeled as no solution." width="672"></p>
<figcaption>Solution coverage (covS) and solution consistency (inclS) at each outcome threshold. No solution was found at thrY = 8.</figcaption>
</figure>
</div>
</div>
</div>
<p>As the target gets higher, coverage rises (the solution explains a larger share of the high-loyalty customers) while consistency slowly falls. At <code>thrY = 8</code> the line simply stops, because there is no solution to plot.</p>
</section>
<section id="what-comes-next" class="level2">
<h2 class="anchored" data-anchor-id="what-comes-next">What comes next</h2>
<p>In the next part we will look more closely at the four kinds of sweeps (outcome, one condition, several conditions, and both together), and at how to choose the range of thresholds in a way you can defend.</p>
<p>The full package tutorial is available in the <a href="https://im-research-yt.github.io/ThSQCA/articles/ThSQCA_Tutorial_EN.html">ThSQCA documentation</a>, and the methodology is described in <a href="https://doi.org/10.1007/s11135-026-03092-3">Toyoda (2026), <em>Quality &amp; Quantity</em></a>.</p>
<p><em>Software used: R 4.6.1, QCA 3.25.5, and ThSQCA 2.0.9.</em></p>


</section>

 ]]></description>
  <category>R</category>
  <category>ThSQCA</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-beginners-1/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-beginners-1/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>ThSQCA for beginners, part 2: the four sweeps and how to choose a range</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/thsqca-beginners-2/</link>
  <description><![CDATA[ 





<p>In <a href="https://im-research-yt.github.io/posts/thsqca-beginners-1/">part 1</a> we ran an outcome threshold sweep and read its result. ThSQCA has four sweep functions in total. This post runs all four on the same practice data, and ends with practical advice on choosing the range of thresholds.</p>
<section id="the-four-sweeps-at-a-glance" class="level2">
<h2 class="anchored" data-anchor-id="the-four-sweeps-at-a-glance">The four sweeps at a glance</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Question</th>
<th>Function</th>
<th>What varies</th>
<th>What stays fixed</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>How does the solution change as the target level of the outcome rises?</td>
<td><code>otSweep()</code></td>
<td>the outcome threshold</td>
<td>all condition thresholds</td>
</tr>
<tr class="even">
<td>How sensitive is it to one condition’s definition of “high”?</td>
<td><code>ctSweepS()</code></td>
<td>one condition threshold</td>
<td>the outcome and the other conditions</td>
</tr>
<tr class="odd">
<td>What if several conditions’ definitions change together?</td>
<td><code>ctSweepM()</code></td>
<td>several condition thresholds (a grid)</td>
<td>the outcome threshold</td>
</tr>
<tr class="even">
<td>What if the target level and the conditions’ definitions both change?</td>
<td><code>dtSweep()</code></td>
<td>the outcome and the conditions</td>
<td>nothing</td>
</tr>
</tbody>
</table>
</section>
<section id="setup-the-same-practice-data-as-part-1" class="level2">
<h2 class="anchored" data-anchor-id="setup-the-same-practice-data-as-part-1">Setup: the same practice data as part 1</h2>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span></code></pre></div></div>
</div>
<div class="cell">
<details class="code-fold">
<summary>Practice data (identical to part 1)</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">make_demo_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">seed =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>) {</span>
<span id="cb2-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(seed)</span>
<span id="cb2-3">  clip <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(x)))</span>
<span id="cb2-4">  QUA <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb2-5">  SER <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb2-6">  ENV <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb2-7">  core <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, SER), <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, ENV) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb2-8">  LOY  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(core <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>))</span>
<span id="cb2-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(LOY, QUA, SER, ENV)</span>
<span id="cb2-10">}</span>
<span id="cb2-11"></span>
<span id="cb2-12">demo <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_demo_data</span>()</span></code></pre></div></div>
</details>
</div>
<p>Remember the story behind the data: loyalty (<code>LOY</code>) is high when quality (<code>QUA</code>) and service (<code>SER</code>) are both high, or, a little less strongly, when quality and the store environment (<code>ENV</code>) are both high.</p>
</section>
<section id="sweep-1-one-condition-with-ctsweeps" class="level2">
<h2 class="anchored" data-anchor-id="sweep-1-one-condition-with-ctsweeps">Sweep 1: one condition with <code>ctSweepS()</code></h2>
<p>Suppose you are unsure where to draw the line for “high service delivery”. Is 6 high enough? 7? 9? Fix the outcome at <code>LOY &gt;= 7</code>, fix the other conditions at 7, and sweep the threshold of <code>SER</code> from 5 to 9.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">res_cts <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ctSweepS</span>(</span>
<span id="cb3-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat          =</span> demo,</span>
<span id="cb3-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome      =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>,</span>
<span id="cb3-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions   =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb3-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_var    =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>,</span>
<span id="cb3-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range  =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb3-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrY         =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>,</span>
<span id="cb3-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX_default =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span></span>
<span id="cb3-9">)</span>
<span id="cb3-10"></span>
<span id="cb3-11"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(res_cts)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>CTS (single) Summary
==================== 

Analysis Parameters:
  Outcome: LOY 
  Conditions: QUA, SER, ENV 
  Consistency cutoff: 0.8 
  Frequency cutoff: 1 

Results by Threshold:

 threshold   expression inclS  covS n_solutions
         5  No solution    NA    NA           0
         6  No solution    NA    NA           0
         7      QUA*SER 0.894 0.656           1
         8      QUA*SER 0.909 0.333           1
         9 QUA*SER*~ENV 0.917 0.122           1</code></pre>
</div>
</div>
<p>The new arguments are <code>sweep_var</code> (the condition whose threshold is swept), <code>thrY</code> (the fixed outcome threshold), and <code>thrX_default</code> (the fixed threshold for all other conditions).</p>
<p>Reading the table from top to bottom: when “high service” is defined as 5 or 6, there is no solution, because the definition is so loose that the group of “highly served” customers is no longer reliably loyal. At 7 and 8 the solution is <code>QUA*SER</code>. At 9 the solution gains a third element, <code>QUA*SER*~ENV</code>, and coverage falls sharply, from 0.656 at 7 to 0.122 at 9. You can see why by counting how many customers are behind the strictest definition:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>QUA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SER <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>)                 <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># customers high on both quality and service</span></span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1] 16</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>QUA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SER <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>ENV <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># customers satisfying the solution QUA*SER*~ENV</span></span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>[1] 12</code></pre>
</div>
</div>
<p>Of the 400 customers, 16 are high on both quality and service, and only 12 of them also have a store-environment score below 7, which is what the solution <code>QUA*SER*~ENV</code> requires. The result there rests on very few cases. This is a useful habit: when a solution appears only at the edge of the grid, check how many cases are behind it.</p>
</section>
<section id="sweep-2-several-conditions-with-ctsweepm" class="level2">
<h2 class="anchored" data-anchor-id="sweep-2-several-conditions-with-ctsweepm">Sweep 2: several conditions with <code>ctSweepM()</code></h2>
<p>Now let the thresholds of all three conditions vary at once: each of <code>QUA</code>, <code>SER</code>, and <code>ENV</code> is tried at 6, 7, and 8. That is 3 x 3 x 3 = 27 combinations. The outcome stays at <code>LOY &gt;= 7</code>.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1">res_mcts <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ctSweepM</span>(</span>
<span id="cb9-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat        =</span> demo,</span>
<span id="cb9-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome    =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>,</span>
<span id="cb9-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb9-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_list =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QUA =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SER =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ENV =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>),</span>
<span id="cb9-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrY       =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span></span>
<span id="cb9-7">)</span></code></pre></div></div>
</div>
<p>The output has 27 rows. To keep it readable, show only the combinations that produced a solution:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">tab <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> res_mcts<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary</span>
<span id="cb10-2">tab[tab<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>n_solutions <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, ]</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>   combo_id           threshold                  expression     inclS      covS
5         5 QUA=7, SER=7, ENV=6                     QUA*SER 0.8939394 0.6555556
6         6 QUA=8, SER=7, ENV=6                     QUA*SER 0.9189189 0.3777778
8         8 QUA=7, SER=8, ENV=6                     QUA*SER 0.9090909 0.3333333
9         9 QUA=8, SER=8, ENV=6                     QUA*SER 0.9047619 0.2111111
12       12 QUA=8, SER=6, ENV=7                QUA*SER*~ENV 0.8000000 0.3111111
14       14 QUA=7, SER=7, ENV=7                     QUA*SER 0.8939394 0.6555556
15       15 QUA=8, SER=7, ENV=7                QUA*SER*~ENV 1.0000000 0.3000000
17       17 QUA=7, SER=8, ENV=7                     QUA*SER 0.9090909 0.3333333
18       18 QUA=8, SER=8, ENV=7                QUA*SER*~ENV 1.0000000 0.1888889
21       21 QUA=8, SER=6, ENV=8                     QUA*ENV 0.8888889 0.1777778
23       23 QUA=7, SER=7, ENV=8                     QUA*SER 0.8939394 0.6555556
24       24 QUA=8, SER=7, ENV=8           QUA*SER + QUA*ENV 0.9200000 0.5111111
26       26 QUA=7, SER=8, ENV=8                     QUA*SER 0.9090909 0.3333333
27       27 QUA=8, SER=8, ENV=8 QUA*SER*~ENV + QUA*~SER*ENV 0.9393939 0.3444444
   n_solutions
5            1
6            1
8            1
9            1
12           1
14           1
15           1
17           1
18           1
21           1
23           1
24           1
26           1
27           1</code></pre>
</div>
</div>
<p>Some patterns to look for:</p>
<ul>
<li>Fourteen of the 27 combinations have a solution. In every combination where “high quality” is defined as 6, there is no solution at all.</li>
<li>With <code>QUA</code> at 7 and <code>SER</code> at 7 or 8, the solution is <code>QUA*SER</code> no matter which threshold is used for <code>ENV</code>. This is a <strong>stable region</strong>.</li>
<li>With <code>QUA</code> at 8, the solution depends on <code>ENV</code> (and on <code>SER</code>). With <code>ENV</code> at 6 it is <code>QUA*SER</code> (when <code>SER</code> is 7 or 8). With <code>ENV</code> at 7 it is <code>QUA*SER*~ENV</code>. With <code>ENV</code> at 8 it varies, from <code>QUA*ENV</code> alone to two-path solutions such as <code>QUA*SER + QUA*ENV</code>. When “high quality” is defined strictly, the definition of the store environment starts to matter.</li>
</ul>
<p>The grid shows both where a conclusion is robust and where it is fragile, which a single analysis cannot.</p>
</section>
<section id="sweep-3-the-outcome-and-the-conditions-together-with-dtsweep" class="level2">
<h2 class="anchored" data-anchor-id="sweep-3-the-outcome-and-the-conditions-together-with-dtsweep">Sweep 3: the outcome and the conditions together with <code>dtSweep()</code></h2>
<p>The dual threshold sweep combines the two ideas: it varies the target level of the outcome and the conditions’ definitions at the same time. Here we use 3 outcome thresholds (6, 7, 8) and 8 condition combinations (<code>QUA</code>, <code>SER</code>, <code>ENV</code> each at 6 or 7), so 24 cells.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1">res_dts <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dtSweep</span>(</span>
<span id="cb12-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat           =</span> demo,</span>
<span id="cb12-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome       =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>,</span>
<span id="cb12-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions    =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb12-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_list_X  =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QUA =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SER =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ENV =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>),</span>
<span id="cb12-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range_Y =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span></span>
<span id="cb12-7">)</span>
<span id="cb12-8"></span>
<span id="cb12-9">res_dts<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>   combo_id thrY                thrX        expression     inclS      covS
1         1    6 QUA=6, SER=6, ENV=6           QUA*SER 0.8630137 0.7118644
2         1    7 QUA=6, SER=6, ENV=6       No solution        NA        NA
3         1    8 QUA=6, SER=6, ENV=6       No solution        NA        NA
4         2    6 QUA=7, SER=6, ENV=6           QUA*SER 0.9215686 0.5310734
5         2    7 QUA=7, SER=6, ENV=6       No solution        NA        NA
6         2    8 QUA=7, SER=6, ENV=6       No solution        NA        NA
7         3    6 QUA=6, SER=7, ENV=6           QUA*SER 0.8932039 0.5197740
8         3    7 QUA=6, SER=7, ENV=6       No solution        NA        NA
9         3    8 QUA=6, SER=7, ENV=6       No solution        NA        NA
10        4    6 QUA=7, SER=7, ENV=6           QUA*SER 0.9848485 0.3672316
11        4    7 QUA=7, SER=7, ENV=6           QUA*SER 0.8939394 0.6555556
12        4    8 QUA=7, SER=7, ENV=6       No solution        NA        NA
13        5    6 QUA=6, SER=6, ENV=7           QUA*SER 0.8630137 0.7118644
14        5    7 QUA=6, SER=6, ENV=7       No solution        NA        NA
15        5    8 QUA=6, SER=6, ENV=7       No solution        NA        NA
16        6    6 QUA=7, SER=6, ENV=7 QUA*SER + QUA*ENV 0.9076923 0.6666667
17        6    7 QUA=7, SER=6, ENV=7       No solution        NA        NA
18        6    8 QUA=7, SER=6, ENV=7       No solution        NA        NA
19        7    6 QUA=6, SER=7, ENV=7           QUA*SER 0.8932039 0.5197740
20        7    7 QUA=6, SER=7, ENV=7       No solution        NA        NA
21        7    8 QUA=6, SER=7, ENV=7       No solution        NA        NA
22        8    6 QUA=7, SER=7, ENV=7 QUA*SER + QUA*ENV 0.9259259 0.5649718
23        8    7 QUA=7, SER=7, ENV=7           QUA*SER 0.8939394 0.6555556
24        8    8 QUA=7, SER=7, ENV=7       No solution        NA        NA
   n_solutions
1            1
2            0
3            0
4            1
5            0
6            0
7            1
8            0
9            0
10           1
11           1
12           0
13           1
14           0
15           0
16           1
17           0
18           0
19           1
20           0
21           0
22           1
23           1
24           0</code></pre>
</div>
</div>
<p>Reading it: at <code>LOY &gt;= 6</code>, every one of the 8 condition definitions gives a solution, usually <code>QUA*SER</code>, and sometimes <code>QUA*SER + QUA*ENV</code>. At <code>LOY &gt;= 7</code>, only two definitions still give a solution, the ones where <code>QUA</code> and <code>SER</code> are both at 7. At <code>LOY &gt;= 8</code>, none do. In this data set, raising the target level is the strongest driver of change.</p>
<p>A picture makes the same point faster. The next chunk draws the solution coverage of all 24 cells as a heat map. Each row is one definition of the three conditions, each column is one outcome threshold, and “none” marks a cell with no solution.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1">s <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> res_dts<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary</span>
<span id="cb14-2">m <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tapply</span>(s<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>covS, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(s<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>combo_id, s<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>thrY), <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x) x[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="cb14-3">lab <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.character</span>(s<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>thrX[<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">match</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rownames</span>(m), s<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>combo_id)])</span>
<span id="cb14-4"></span>
<span id="cb14-5">op <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">par</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mar =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">11</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb14-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">image</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ncol</span>(m)), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">y =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">nrow</span>(m)), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">z =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">t</span>(m),</span>
<span id="cb14-7">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">colorRampPalette</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#FFFFFF"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#233A9A"</span>))(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">zlim =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb14-8">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xaxt =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">yaxt =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outcome threshold (thrY)"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ylab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>,</span>
<span id="cb14-9">      <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">main =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Solution coverage in the 24 cells"</span>)</span>
<span id="cb14-10"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">axis</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">at =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ncol</span>(m)), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">labels =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">colnames</span>(m))</span>
<span id="cb14-11"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">axis</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">at =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">nrow</span>(m)), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">labels =</span> lab, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">las =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex.axis =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>)</span>
<span id="cb14-12"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (i <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">nrow</span>(m))) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (j <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_len</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ncol</span>(m))) {</span>
<span id="cb14-13">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">is.na</span>(m[i, j])) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(j, i, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"none"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"grey50"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>)</span>
<span id="cb14-14">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(j, i, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sprintf</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%.2f"</span>, m[i, j]), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>)</span>
<span id="cb14-15">}</span>
<span id="cb14-16"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">box</span>()</span></code></pre></div></div>
<div class="cell-output-display">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://im-research-yt.github.io/posts/thsqca-beginners-2/index_files/figure-html/unnamed-chunk-8-1.png" class="img-fluid figure-img" alt="Heat map with 8 rows (definitions of the three conditions, each at 6 or 7) and 3 columns (outcome thresholds 6, 7, and 8). All 8 cells in the threshold 6 column are filled, with coverage between 0.37 and 0.71. In the threshold 7 column only two cells are filled, both 0.66, for the rows where quality and service are both 7. The threshold 8 column is empty, marked none." width="768"></p>
<figcaption>Solution coverage in the 24 cells of the dual threshold sweep. Darker cells have higher coverage; cells marked none have no solution.</figcaption>
</figure>
</div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb15-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">par</span>(op)</span></code></pre></div></div>
</div>
<p>The column for <code>LOY &gt;= 6</code> is filled in every row, the column for <code>LOY &gt;= 7</code> in only two, and the column for <code>LOY &gt;= 8</code> in none.</p>
</section>
<section id="how-big-is-a-sweep" class="level2">
<h2 class="anchored" data-anchor-id="how-big-is-a-sweep">How big is a sweep?</h2>
<p>Every cell is a full QCA analysis, so the number of cells matters for run time and for how readable the results are.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Function</th>
<th>Number of analyses</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>otSweep()</code></td>
<td>one per outcome threshold</td>
<td>5 thresholds = 5</td>
</tr>
<tr class="even">
<td><code>ctSweepS()</code></td>
<td>one per threshold of the swept condition</td>
<td>5 thresholds = 5</td>
</tr>
<tr class="odd">
<td><code>ctSweepM()</code></td>
<td>the product of the candidate counts</td>
<td>3 x 3 x 3 = 27</td>
</tr>
<tr class="even">
<td><code>dtSweep()</code></td>
<td>outcome thresholds x condition grid</td>
<td>3 x (3 x 3 x 3) = 81</td>
</tr>
</tbody>
</table>
</section>
<section id="choosing-a-range-you-can-defend" class="level2">
<h2 class="anchored" data-anchor-id="choosing-a-range-you-can-defend">Choosing a range you can defend</h2>
<p>A sweep is easy to run, which is exactly why it needs discipline. Trying many thresholds and reporting only the convenient ones would add researcher degrees of freedom instead of removing them. Some rules of thumb:</p>
<ol type="1">
<li><strong>Decide the range before you look at the results.</strong> Base it on what the scale means, on theory, and on practical targets (for example “acceptable”, “good”, “very good”).</li>
<li><strong>Include your baseline.</strong> The threshold you would have used in an ordinary analysis should be inside the grid, so readers can compare.</li>
<li><strong>Avoid the neutral zone.</strong> On a 0 to 10 scale, scores around the midpoint do not clearly mean “high” for anyone, so ranges usually start above it.</li>
<li><strong>Keep the grid small enough to read.</strong> A few meaningful values per variable are better than every possible value.</li>
<li><strong>Check the case counts at the edges.</strong> Cells at the extremes of the grid often rest on very few cases.</li>
<li><strong>Report the whole grid.</strong> Show the stable and the unstable regions, not only the cells that support your story.</li>
</ol>
</section>
<section id="what-comes-next" class="level2">
<h2 class="anchored" data-anchor-id="what-comes-next">What comes next</h2>
<p>In <a href="https://im-research-yt.github.io/posts/thsqca-beginners-3/">part 3</a> we look at the three solution types (complex, parsimonious, and intermediate) and at what to do when a cell has more than one minimal solution.</p>
<p><em>Software used: R 4.6.1, QCA 3.25.5, and ThSQCA 2.0.9.</em></p>


</section>

 ]]></description>
  <category>R</category>
  <category>ThSQCA</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-beginners-2/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-beginners-2/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>ThSQCA for beginners, part 3: solution types and multiple solutions</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/thsqca-beginners-3/</link>
  <description><![CDATA[ 





<p>In <a href="https://im-research-yt.github.io/posts/thsqca-beginners-2/">part 2</a> we ran all four sweeps. Two questions remain for a careful analysis. First, QCA can produce three kinds of solution (complex, parsimonious, and intermediate); which should you use? Second, what if a cell has more than one minimal solution? This post answers both with a second, smaller practice data set.</p>
<section id="a-second-practice-data-set" class="level2">
<h2 class="anchored" data-anchor-id="a-second-practice-data-set">A second practice data set</h2>
<p>We simulate 60 business software accounts. Each has a renewal score (<code>RNW</code>) and three evaluations: trust (<code>TRU</code>), price (<code>PRC</code>), and support (<code>SUP</code>), all from 0 to 10. In this simulated world, renewal is high when trust is high and either price or support is high. The three evaluations are strongly correlated, which will leave some combinations of conditions unobserved. That is deliberate, because unobserved combinations are exactly what the three solution types treat differently.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(QCA)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Loading required package: admisc</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>
To cite package QCA in publications, please use:
  Dusa, Adrian (2019) QCA with R. A Comprehensive Resource.
  Springer International Publishing.</code></pre>
</div>
</div>
<div class="cell">
<details class="code-fold">
<summary>Practice data set 2</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1">make_demo_data2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">seed =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">89</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">rho =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.85</span>) {</span>
<span id="cb4-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(seed)</span>
<span id="cb4-3">  clip <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(x)))</span>
<span id="cb4-4">  L   <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n)</span>
<span id="cb4-5">  mk  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>() <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (rho <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> L <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sqrt</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> rho<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">^</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n)))</span>
<span id="cb4-6">  TRU <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mk</span>(); PRC <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mk</span>(); SUP <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mk</span>()</span>
<span id="cb4-7">  RNW <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(TRU, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(PRC, SUP)) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>))</span>
<span id="cb4-8">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(RNW, TRU, PRC, SUP)</span>
<span id="cb4-9">}</span>
<span id="cb4-10"></span>
<span id="cb4-11">demo2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_demo_data2</span>()</span>
<span id="cb4-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(demo2)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>  RNW TRU PRC SUP
1   3   3   4   4
2   6   8   7   7
3   9   9   9   7
4   5   5   4   6
5  10  10   8   9
6   1   2   4   5</code></pre>
</div>
</div>
</section>
<section id="unobserved-combinations-logical-remainders" class="level2">
<h2 class="anchored" data-anchor-id="unobserved-combinations-logical-remainders">Unobserved combinations (“logical remainders”)</h2>
<p>With three conditions, each either high or low, there are 2 x 2 x 2 = 8 possible combinations. QCA lists them in a <strong>truth table</strong>. Let us build one by hand with the QCA package, using renewal of 5 or more as the outcome and 7 or more as “high” for each condition.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1">bin2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb6-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">RNW =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(demo2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>RNW <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>),</span>
<span id="cb6-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">TRU =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(demo2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>TRU <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>),</span>
<span id="cb6-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PRC =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(demo2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>PRC <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>),</span>
<span id="cb6-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SUP =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(demo2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SUP <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb6-6">)</span>
<span id="cb6-7"></span>
<span id="cb6-8">tt2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truthTable</span>(bin2, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RNW"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TRU"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUP"</span>),</span>
<span id="cb6-9">                  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">show.cases =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb6-10">tt2</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>
  OUT: output value
    n: number of cases in configuration
 incl: sufficiency inclusion score
  PRI: proportional reduction in inconsistency

    TRU PRC SUP   OUT    n   incl  PRI  
1    0   0   0     0     30  0.433 0.433
2    0   0   1     1     7   0.857 0.857
4    0   1   1     1     3   1.000 1.000
6    1   0   1     1     3   1.000 1.000
7    1   1   0     1     4   1.000 1.000
8    1   1   1     1     13  1.000 1.000</code></pre>
</div>
</div>
<p>Look at the row numbers on the left. Only 6 of the 8 possible combinations appear (rows 3 and 5 are missing), because the data contain no accounts with, for example, high trust alone, or high price evaluation alone. The combinations that are missing are the <strong>logical remainders</strong>. The column <code>n</code> is the number of accounts in each combination, <code>incl</code> is how consistently they renew, and <code>OUT</code> is 1 when the combination is consistent enough to count as sufficient.</p>
<p>A bar chart of the counts makes the gaps easy to see. Each bar is one of the 8 possible combinations, in the same order as the truth table rows.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb8-1">cells <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">expand.grid</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SUP =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PRC =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">TRU =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TRU"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUP"</span>)]</span>
<span id="cb8-2">cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>n <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mapply</span>(<span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(a, b, c) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(bin2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>TRU <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> a <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> bin2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>PRC <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> b <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> bin2<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SUP <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> c),</span>
<span id="cb8-3">                  cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>TRU, cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>PRC, cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SUP)</span>
<span id="cb8-4">cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>label <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">paste0</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>TRU <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TRU"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"~TRU"</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"*"</span>,</span>
<span id="cb8-5">                      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>PRC <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"~PRC"</span>), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"*"</span>,</span>
<span id="cb8-6">                      <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ifelse</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SUP <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUP"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"~SUP"</span>))</span>
<span id="cb8-7"></span>
<span id="cb8-8">op <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">par</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">mar =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb8-9">n_rev <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rev</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>n)</span>
<span id="cb8-10">bp <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">barplot</span>(n_rev, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">horiz =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">names.arg =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rev</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>label), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">las =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb8-11">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#233A9A"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlim =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(cells<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>n) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.35</span>),</span>
<span id="cb8-12">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Number of accounts"</span>,</span>
<span id="cb8-13">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">main =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Accounts per combination"</span>)</span>
<span id="cb8-14"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (i <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_along</span>(n_rev)) {</span>
<span id="cb8-15">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (n_rev[i] <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>) {</span>
<span id="cb8-16">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, bp[i], <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"not observed (remainder)"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pos =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#B45309"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.9</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">font =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>)</span>
<span id="cb8-17">  } <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> {</span>
<span id="cb8-18">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(n_rev[i], bp[i], n_rev[i], <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pos =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.9</span>)</span>
<span id="cb8-19">  }</span>
<span id="cb8-20">}</span></code></pre></div></div>
<div class="cell-output-display">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://im-research-yt.github.io/posts/thsqca-beginners-3/index_files/figure-html/unnamed-chunk-4-1.png" class="img-fluid figure-img" alt="Horizontal bar chart of 8 combinations. Not high on any of the three has 30 accounts; support only has 7; price and support without trust has 3; trust and support without price has 3; trust and price without support has 4; all three high has 13. Two combinations, price only and trust only, have no accounts and are labeled not observed." width="672"></p>
<figcaption>Number of accounts in each of the 8 possible combinations of high and low trust, price, and support. Two combinations are not observed.</figcaption>
</figure>
</div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">par</span>(op)</span></code></pre></div></div>
</div>
<p>The two combinations with no accounts are the remainders. Boolean minimization has no cases to check them against, so each solution type has to decide what to do with them.</p>
<p>Remainders matter because Boolean minimization can use them to make a formula shorter, and the three solution types differ in whether, and how, they do that.</p>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Solution type</th>
<th>Remainders used</th>
<th><code>include</code></th>
<th><code>dir.exp</code></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Complex</td>
<td>none</td>
<td><code>""</code> (default)</td>
<td><code>NULL</code></td>
</tr>
<tr class="even">
<td>Parsimonious</td>
<td>any remainder that shortens the formula</td>
<td><code>"?"</code></td>
<td><code>NULL</code></td>
</tr>
<tr class="odd">
<td>Intermediate</td>
<td>only remainders that agree with your stated expectations</td>
<td><code>"?"</code></td>
<td>e.g.&nbsp;<code>c(1, 1, 1)</code></td>
</tr>
</tbody>
</table>
<p>Here <code>dir.exp = c(1, 1, 1)</code> says: we expect high trust, high price evaluation, and high support each to favor renewal.</p>
</section>
<section id="the-three-solution-types-side-by-side" class="level2">
<h2 class="anchored" data-anchor-id="the-three-solution-types-side-by-side">The three solution types, side by side</h2>
<p>We run the same outcome threshold sweep (renewal of 5, 6, 7, and 8) three times, changing only the solution type.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">thr2  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">TRU =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">PRC =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SUP =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb10-2">cond2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"TRU"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"PRC"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SUP"</span>)</span>
<span id="cb10-3"></span>
<span id="cb10-4">run2 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(...) {</span>
<span id="cb10-5">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo2, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"RNW"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> cond2, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,</span>
<span id="cb10-6">          <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX =</span> thr2, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, ...)</span>
<span id="cb10-7">}</span>
<span id="cb10-8"></span>
<span id="cb10-9">res_cx <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">run2</span>()                                     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># complex</span></span>
<span id="cb10-10">res_ps <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">run2</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>)                        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parsimonious</span></span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: Multiple equivalent solutions exist for thrY = 5 (n_solutions &gt; 1).
Only the first solution (M1) and its fit metrics are shown. Use
generate_report() for full analysis.</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1">res_im <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">run2</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dir.exp =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># intermediate</span></span>
<span id="cb12-2"></span>
<span id="cb12-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb12-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrY         =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,</span>
<span id="cb12-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">complex      =</span> res_cx<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>expression,</span>
<span id="cb12-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">parsimonious =</span> res_ps<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>expression,</span>
<span id="cb12-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">intermediate =</span> res_im<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>expression</span>
<span id="cb12-8">)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  thrY            complex   parsimonious       intermediate
1    5      SUP + TRU*PRC      TRU + SUP      SUP + TRU*PRC
2    6 TRU*PRC + ~PRC*SUP TRU + ~PRC*SUP TRU*PRC + ~PRC*SUP
3    7            TRU*SUP        TRU*SUP            TRU*SUP
4    8        No solution    No solution        No solution</code></pre>
</div>
</div>
<p>The warning shown with the output is a note from ThSQCA: at renewal of 5, the parsimonious analysis has more than one equally short solution. We come back to this below.</p>
<p>At renewal of 7, all three agree (<code>TRU*SUP</code>), and at 8 none finds a solution. At 5 and 6 the parsimonious solution is shorter. For example, at renewal of 5 it reports <code>TRU + SUP</code>, whereas the complex solution is <code>SUP + TRU*PRC</code>. The term <code>TRU</code> alone covers the combination “high trust, but low price and support evaluations”, which does not appear in the data. The parsimonious solution is willing to assume that this unobserved combination would also be sufficient. The complex solution makes no such assumption. In this particular data set the intermediate solution happens to coincide with the complex one.</p>
<p>How to choose:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Solution</th>
<th>When it is a good choice</th>
<th>Strength</th>
<th>Caution</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Complex</td>
<td>Exploration; you want no assumptions about unobserved cases</td>
<td>Every claim rests on observed cases</td>
<td>Formulas can be long</td>
</tr>
<tr class="even">
<td>Parsimonious</td>
<td>You want to see the maximal simplification</td>
<td>Shortest formulas</td>
<td>May rely on implausible remainders</td>
</tr>
<tr class="odd">
<td>Intermediate</td>
<td>Theory-driven reporting</td>
<td>Uses only plausible remainders</td>
<td>Needs a justified <code>dir.exp</code></td>
</tr>
</tbody>
</table>
<p>Whatever you choose, keep it the same across the whole sweep, and say which one you used.</p>
</section>
<section id="when-a-cell-has-more-than-one-minimal-solution" class="level2">
<h2 class="anchored" data-anchor-id="when-a-cell-has-more-than-one-minimal-solution">When a cell has more than one minimal solution</h2>
<p>Boolean minimization can return several equally short solutions for the same truth table. By default ThSQCA reports the first one (<code>M1</code>) and records the number of solutions in <code>n_solutions</code>. To see all of them, use <code>extract_mode = "all"</code>.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb14-1">res_all <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">run2</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">extract_mode =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"all"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: Multiple equivalent solutions exist for thrY = 5 (n_solutions &gt; 1).
Only the first solution (M1) and its fit metrics are shown. Use
generate_report() for full analysis.</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb16" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb16-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(res_all)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>OTS Summary
=========== 

Analysis Parameters:
  Outcome: RNW 
  Conditions: TRU, PRC, SUP 
  Consistency cutoff: 0.8 
  Frequency cutoff: 1 

Results by Threshold:

 thrY                   expression inclS  covS n_solutions
    5 M1: TRU + SUP; M2: PRC + SUP 0.967 0.690           2
    6           M1: TRU + ~PRC*SUP 0.963 0.788           1
    7                  M1: TRU*SUP 0.875 0.667           1
    8                  No solution    NA    NA           0

Note: 1 threshold setting(s) had multiple solutions.
      Use generate_report() for full details.</code></pre>
</div>
</div>
<p>At renewal of 5, the parsimonious analysis finds two minimal solutions of equal length (multiple minimal solutions), <code>TRU + SUP</code> and <code>PRC + SUP</code>. Each of them relies on a different unobserved combination, which is why neither can be preferred on the data alone. ThSQCA prints a note when this happens.</p>
<p>If you prefer a compact view, use <code>extract_mode = "essential"</code>. It separates the terms that are present in every solution from the rest.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb18-1">res_ess <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">run2</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"?"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">extract_mode =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"essential"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Warning: Multiple equivalent solutions exist for thrY = 5 (n_solutions &gt; 1).
Only the first solution (M1) and its fit metrics are shown. Use
generate_report() for full analysis.</code></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb20" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb20-1">res_ess<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>summary[, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"thrY"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"expression"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"selective_terms"</span>,</span>
<span id="cb20-2">                    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"unique_terms"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n_solutions"</span>)]</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>  thrY     expression selective_terms   unique_terms n_solutions
1    5            SUP       TRU + PRC M1:TRU; M2:PRC           2
2    6 TRU + ~PRC*SUP            &lt;NA&gt;           &lt;NA&gt;           1
3    7        TRU*SUP            &lt;NA&gt;           &lt;NA&gt;           1
4    8    No solution            &lt;NA&gt;           &lt;NA&gt;           0</code></pre>
</div>
</div>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Term type</th>
<th>Meaning</th>
<th>Here (renewal of 5)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Essential</td>
<td>present in every solution</td>
<td><code>SUP</code></td>
</tr>
<tr class="even">
<td>Selective</td>
<td>present in some solutions</td>
<td><code>TRU</code> and <code>PRC</code></td>
</tr>
<tr class="odd">
<td>Unique</td>
<td>present in only one solution</td>
<td><code>TRU</code> in M1, <code>PRC</code> in M2</td>
</tr>
</tbody>
</table>
<p>ThSQCA records the alternatives, but deciding which one to prioritize is a theoretical judgment that stays with the researcher.</p>
</section>
<section id="what-comes-next" class="level2">
<h2 class="anchored" data-anchor-id="what-comes-next">What comes next</h2>
<p>In <a href="https://im-research-yt.github.io/posts/thsqca-beginners-4/">part 4</a>, the last part, we turn the results into something you can report: a Markdown report, a configuration chart, and a check against the QCA package.</p>
<p><em>Software used: R 4.6.1, QCA 3.25.5, and ThSQCA 2.0.9.</em></p>


</section>

 ]]></description>
  <category>R</category>
  <category>ThSQCA</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-beginners-3/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-beginners-3/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>ThSQCA for beginners, part 4: reporting and checking your results</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/thsqca-beginners-4/</link>
  <description><![CDATA[ 





<p>In the first three parts we ran sweeps and learned to read them. In this last part we turn a sweep into something you can report and defend: a written record of what was explored, a chart of the configurations, and a check that the numbers agree with the QCA package.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(QCA)</span></code></pre></div></div>
<div class="cell-output cell-output-stderr">
<pre><code>Loading required package: admisc</code></pre>
</div>
<div class="cell-output cell-output-stderr">
<pre><code>
To cite package QCA in publications, please use:
  Dusa, Adrian (2019) QCA with R. A Comprehensive Resource.
  Springer International Publishing.</code></pre>
</div>
</div>
<div class="cell">
<details class="code-fold">
<summary>Practice data (identical to part 1)</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb4-1">make_demo_data <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">400</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">seed =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2026</span>) {</span>
<span id="cb4-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set.seed</span>(seed)</span>
<span id="cb4-3">  clip <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">round</span>(x)))</span>
<span id="cb4-4">  QUA <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb4-5">  SER <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb4-6">  ENV <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb4-7">  core <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmax</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, SER), <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pmin</span>(QUA, ENV) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb4-8">  LOY  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">clip</span>(core <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rnorm</span>(n, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.7</span>))</span>
<span id="cb4-9">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(LOY, QUA, SER, ENV)</span>
<span id="cb4-10">}</span>
<span id="cb4-11"></span>
<span id="cb4-12">demo <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">make_demo_data</span>()</span></code></pre></div></div>
</details>
</div>
<p>We reuse the outcome threshold sweep from part 1. This time we ask for the full details, which the report needs.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb5-1">res_ots <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(</span>
<span id="cb5-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat            =</span> demo,</span>
<span id="cb5-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome        =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>,</span>
<span id="cb5-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions     =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb5-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range    =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>,</span>
<span id="cb5-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX           =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QUA =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SER =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ENV =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>),</span>
<span id="cb5-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut       =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>,</span>
<span id="cb5-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut          =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb5-9">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">return_details =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span></span>
<span id="cb5-10">)</span></code></pre></div></div>
</div>
<section id="a-report-that-records-the-whole-sweep" class="level2">
<h2 class="anchored" data-anchor-id="a-report-that-records-the-whole-sweep">A report that records the whole sweep</h2>
<p>A sweep produces many results, and a reader needs to know what range was explored, under which settings, and what came out at each threshold. <code>generate_report()</code> writes this into a Markdown file. It comes in two formats.</p>
<ul>
<li><code>"simple"</code> is a short report for the main text or an appendix. It has a summary table, the solution at each threshold, and code for checking the result with the QCA package.</li>
<li><code>"full"</code> is for supplementary material. It adds an overview of the analysis (the sweep range and the cutoffs), descriptive statistics, and, for every threshold, the truth table, the solution fit, per-term metrics, a configuration chart, the QCA package output, and the settings needed to reproduce it. A comparison across thresholds follows.</li>
</ul>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb6-1">report_file <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tempfile</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">fileext =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">".md"</span>)</span>
<span id="cb6-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_report</span>(res_ots, report_file, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">format =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"simple"</span>)</span></code></pre></div></div>
</div>
<p>Here are the first lines of the file it wrote. On your own computer, give the file a real name, such as <code>"ots_report_simple.md"</code>, and it will appear in your working folder.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb7-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">readLines</span>(report_file), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sep =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code># QCA Analysis Report

*(Auto-generated by ThSQCA package)*

**Generated**: 2026-10-08 23:37

---

## Summary

| thrY | expression | inclS | covS | n_solutions |
|---|---|---|---|---|
| 5 | QUA\*SER + QUA\*ENV | 0.981 | 0.403 | 1 |
| 6 | QUA\*SER + QUA\*ENV | 0.926 | 0.565 | 1 |
| 7 | QUA\*SER | 0.894 | 0.656 | 1 |
| 8 | No solution | NA | NA | 0 |


---

## Solutions Overview

### LOY &gt;= 5

**Solution**: QUA\*SER + QUA\*ENV -&gt; LOY</code></pre>
</div>
</div>
<p>A few options are worth knowing:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb9-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_report</span>(res_ots, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r.md"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">format =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"full"</span>)              <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># more detail</span></span>
<span id="cb9-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_report</span>(res_ots, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r.md"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include_chart =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># no charts</span></span>
<span id="cb9-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_report</span>(res_ots, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r.md"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">chart_symbol_set =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"latex"</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># LaTeX symbols</span></span>
<span id="cb9-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">generate_report</span>(res_ots, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"r.md"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat =</span> demo, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">include_raw_output =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># omit QCA output</span></span></code></pre></div></div>
</div>
</section>
<section id="configuration-charts" class="level2">
<h2 class="anchored" data-anchor-id="configuration-charts">Configuration charts</h2>
<p>QCA papers often show solutions as a chart: one column per path, one row per condition, a filled circle for “present”, a crossed circle for “absent”, and a blank where the path does not restrict the condition (neither presence nor absence is required). You can draw one from a list of paths with <code>config_chart_from_paths()</code>.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb10-1">paths <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A*B*~C"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"A*D"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"B*E"</span>)</span>
<span id="cb10-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">config_chart_from_paths</span>(paths))</span></code></pre></div></div>
<table class="caption-top table">
<thead>
<tr class="header">
<th style="text-align: center;">Condition</th>
<th style="text-align: center;">T1</th>
<th style="text-align: center;">T2</th>
<th style="text-align: center;">T3</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">A</td>
<td style="text-align: center;">●</td>
<td style="text-align: center;">●</td>
<td style="text-align: center;"></td>
</tr>
<tr class="even">
<td style="text-align: center;">B</td>
<td style="text-align: center;">●</td>
<td style="text-align: center;"></td>
<td style="text-align: center;">●</td>
</tr>
<tr class="odd">
<td style="text-align: center;">C</td>
<td style="text-align: center;">⊗</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
<tr class="even">
<td style="text-align: center;">D</td>
<td style="text-align: center;"></td>
<td style="text-align: center;">●</td>
<td style="text-align: center;"></td>
</tr>
<tr class="odd">
<td style="text-align: center;">E</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">●</td>
</tr>
</tbody>
</table>
<p><em>● = presence, ⊗ = absence, blank = don’t care</em></p>
<p>If you prefer plain characters, for example for a journal that cannot print the circle symbols, use the ASCII version:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb11-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">config_chart_from_paths</span>(paths, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">symbol_set =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ascii"</span>))</span></code></pre></div></div>
<table class="caption-top table">
<thead>
<tr class="header">
<th style="text-align: center;">Condition</th>
<th style="text-align: center;">T1</th>
<th style="text-align: center;">T2</th>
<th style="text-align: center;">T3</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">A</td>
<td style="text-align: center;">O</td>
<td style="text-align: center;">O</td>
<td style="text-align: center;"></td>
</tr>
<tr class="even">
<td style="text-align: center;">B</td>
<td style="text-align: center;">O</td>
<td style="text-align: center;"></td>
<td style="text-align: center;">O</td>
</tr>
<tr class="odd">
<td style="text-align: center;">C</td>
<td style="text-align: center;">X</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
<tr class="even">
<td style="text-align: center;">D</td>
<td style="text-align: center;"></td>
<td style="text-align: center;">O</td>
<td style="text-align: center;"></td>
</tr>
<tr class="odd">
<td style="text-align: center;">E</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;">O</td>
</tr>
</tbody>
</table>
<p><em>O = presence, X = absence, blank = don’t care</em></p>
</section>
<section id="how-many-cases-stand-behind-each-threshold" class="level2">
<h2 class="anchored" data-anchor-id="how-many-cases-stand-behind-each-threshold">How many cases stand behind each threshold?</h2>
<p>A sweep table gives solutions and fit values, but not the number of cases behind them. A reader should be able to see that, because a result that rests on a handful of cases deserves less trust. For the outcome sweep of part 1, we can count the customers directly from the data, without ThSQCA.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb12-1">thr <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span></span>
<span id="cb12-2">n_out  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sapply</span>(thr, <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(t) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>LOY <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> t))</span>
<span id="cb12-3">n_both <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sapply</span>(thr, <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(t) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sum</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>LOY <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> t <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>QUA <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span> <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span> demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SER <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>))</span>
<span id="cb12-4">cases <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rbind</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"High loyalty (LOY &gt;= thrY)"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> n_out,</span>
<span id="cb12-5">               <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"... and high on QUA and SER"</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">=</span> n_both)</span>
<span id="cb12-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">colnames</span>(cases) <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> thr</span>
<span id="cb12-7"></span>
<span id="cb12-8">bp <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">barplot</span>(cases, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">beside =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">TRUE</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">col =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#233A9A"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F28018"</span>),</span>
<span id="cb12-9">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ylim =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max</span>(cases) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.15</span>),</span>
<span id="cb12-10">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">xlab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Outcome threshold (thrY)"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ylab =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Number of customers"</span>,</span>
<span id="cb12-11">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">main =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cases behind each threshold"</span>,</span>
<span id="cb12-12">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">legend.text =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rownames</span>(cases),</span>
<span id="cb12-13">              <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">args.legend =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">x =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"topright"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">bty =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"n"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>))</span>
<span id="cb12-14"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">text</span>(bp, cases, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">labels =</span> cases, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pos =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">cex =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>)</span></code></pre></div></div>
<div class="cell-output-display">
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://im-research-yt.github.io/posts/thsqca-beginners-4/index_files/figure-html/unnamed-chunk-9-1.png" class="img-fluid figure-img" alt="Grouped bar chart. At outcome threshold 5, there are 263 customers with high loyalty and 66 of them are high on quality and service. At 6 the counts are 177 and 65, at 7 they are 90 and 59, and at 8 they are 29 and 26." width="672"></p>
<figcaption>Number of customers with high loyalty at each outcome threshold (blue), and how many of them are also high on both quality and service (orange).</figcaption>
</figure>
</div>
</div>
</div>
<p>As the target rises, the high-loyalty group shrinks from 263 customers to 29, so the solutions at the strict end of a sweep are built on far fewer cases. Reporting these counts next to the sweep table is a simple way to show how much each row can bear.</p>
</section>
<section id="check-a-cell-against-the-qca-package" class="level2">
<h2 class="anchored" data-anchor-id="check-a-cell-against-the-qca-package">Check a cell against the QCA package</h2>
<p>ThSQCA does not invent new results. Every cell is an ordinary QCA analysis, so you can reproduce any cell by hand. This is a good way to build trust in the tool, and to answer a reviewer who asks. Here we reproduce the cell at an outcome threshold of 7.</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb13-1">bin <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span>(x, t) <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.integer</span>(x <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;=</span> t)</span>
<span id="cb13-2"></span>
<span id="cb13-3">d7 <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">data.frame</span>(</span>
<span id="cb13-4">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">LOY =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bin</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>LOY, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QUA =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bin</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>QUA, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>),</span>
<span id="cb13-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">SER =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bin</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>SER, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>), <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ENV =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">bin</span>(demo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">$</span>ENV, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb13-6">)</span>
<span id="cb13-7"></span>
<span id="cb13-8">tt  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">truthTable</span>(d7, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"LOY"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QUA"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SER"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ENV"</span>),</span>
<span id="cb13-9">                  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">incl.cut =</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">n.cut =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">show.cases =</span> <span class="cn" style="color: #8f5902;
background-color: null;
font-style: inherit;">FALSE</span>)</span>
<span id="cb13-10">sol <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">minimize</span>(tt)</span>
<span id="cb13-11">sol</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>
M1: QUA*SER -&gt; LOY</code></pre>
</div>
</div>
<p>The solution printed by <code>minimize()</code> matches the row for <code>thrY = 7</code> in the sweep table from part 1 (<code>QUA*SER</code>). In both cases the data were binarized in the same way (a score of 7 or above is a member), and in both cases the same QCA functions did the minimization.</p>
</section>
<section id="record-your-software-versions" class="level2">
<h2 class="anchored" data-anchor-id="record-your-software-versions">Record your software versions</h2>
<p>Results can depend on the versions of R and the packages. Print them and keep them with your report:</p>
<div class="cell">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb15-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">R      =</span> R.version.string,</span>
<span id="cb15-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">QCA    =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.character</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">packageVersion</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"QCA"</span>)),</span>
<span id="cb15-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">ThSQCA =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">as.character</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">packageVersion</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ThSQCA"</span>)))</span></code></pre></div></div>
</div>
</section>
<section id="a-short-checklist-for-reporting-a-sweep" class="level2">
<h2 class="anchored" data-anchor-id="a-short-checklist-for-reporting-a-sweep">A short checklist for reporting a sweep</h2>
<p>Because a sweep gives you freedom to explore, it also asks you to be transparent. Before you report one, make sure that you can answer yes to each of these questions.</p>
<ol type="1">
<li>Did I decide the threshold range, and the step between values, before looking at the results?</li>
<li>Do I state every setting that was held fixed (consistency cutoff, frequency cutoff, solution type, directional expectations)?</li>
<li>Did I report every cell of the grid, including the cells with no solution?</li>
<li>Did I check how many cases stand behind the cells at the edges of the grid?</li>
<li>If a cell had several minimal solutions, did I say so?</li>
<li>Did I avoid presenting the sweep as a search for the best threshold?</li>
<li>Did I record the versions of R, QCA, and ThSQCA?</li>
</ol>
</section>
<section id="where-to-go-from-here" class="level2">
<h2 class="anchored" data-anchor-id="where-to-go-from-here">Where to go from here</h2>
<p>You now know the whole workflow: choose a sweep, set a defensible range, run it, read it, and report it. If you want more, the package documentation has the full tutorial with additional examples, and the methodology is explained in the paper.</p>
<ul>
<li><a href="https://im-research-yt.github.io/ThSQCA/articles/ThSQCA_Tutorial_EN.html">ThSQCA documentation and tutorial</a></li>
<li><a href="https://cran.r-project.org/package=ThSQCA">ThSQCA on CRAN</a></li>
<li>Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. <a href="https://doi.org/10.1007/s11135-026-03092-3">https://doi.org/10.1007/s11135-026-03092-3</a></li>
<li>Browser tools: <a href="https://im-research-yt.github.io/analysis-tools/qca-quickstart.html">QCA Quickstart</a> and <a href="https://im-research-yt.github.io/analysis-tools/sweep-builder.html">Sweep Builder</a></li>
</ul>
<p><em>Software used: R 4.6.1, QCA 3.25.5, and ThSQCA 2.0.9.</em></p>


</section>

 ]]></description>
  <category>R</category>
  <category>ThSQCA</category>
  <category>tutorial</category>
  <guid>https://im-research-yt.github.io/posts/thsqca-beginners-4/</guid>
  <pubDate>Sun, 04 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/thsqca-beginners-4/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Is “good enough” the same goal as “loved”? A marketer’s guide to threshold-sweep QCA</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/qca-for-marketers/</link>
  <description><![CDATA[ 





<p>The previous post explained <a href="../../posts/why-qca-decisions/index.html">why QCA suits decision-making</a>. One question was left open: where should the line between “high” and “low” go? This post takes it up.</p>
<p>Two managers in the same company are looking at the same customer survey.</p>
<p>The first wants to <strong>widen the base</strong>: get as many customers as possible to say the brand is acceptable to use. The second wants to <strong>build fans</strong>: create customers who really want to use the brand. Both ask the same question: “What combination of brand strengths gets customers there?”</p>
<p>Here is the uncomfortable part. A standard analysis answers that question for <strong>one</strong> cutoff. If you define “high” as a score of 7 or above, you get one answer. If you had chosen 8, you might have gotten a different one. Results across several cutoffs are not always reported systematically, so a single analysis cannot tell us whether the manager who wants fans and the manager who wants a wider base should be doing the same thing.</p>
<section id="the-cutoff-is-something-to-vary" class="level2">
<h2 class="anchored" data-anchor-id="the-cutoff-is-something-to-vary">The cutoff is something to vary</h2>
<p>Threshold-sweep QCA (ThSQCA) does not fix the cutoff in advance. It tries several. You run the same analysis at several cutoffs, with everything else held constant, and line the answers up in one table. You see where the answer holds steady, where it changes shape, and where it disappears.</p>
<p>If you have used <strong>top-box versus top-2-box</strong> scoring, you already know the problem. A result that looks solid at top-2-box can look very different at top-box. The sweep makes that comparison systematic.</p>
</section>
<section id="a-small-example-simulated-data" class="level2">
<h2 class="anchored" data-anchor-id="a-small-example-simulated-data">A small example (simulated data)</h2>
<p>To show the idea without using real customer data, we simulated 400 customers of a café brand. Each customer rated the brand from 0 to 10 on <strong>quality</strong>, <strong>service</strong>, and <strong>store environment</strong>, and also gave a <strong>loyalty</strong> score from 0 to 10. To keep things simple, we treat each rating as a yes/no split at 7 (crisp-set QCA). We then asked: which combinations of “high” ratings (7 or above) are enough for customers to reach each loyalty target?</p>
<table class="caption-top table">
<colgroup>
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
<col style="width: 25%">
</colgroup>
<thead>
<tr class="header">
<th>Loyalty target</th>
<th>Routes that get customers there</th>
<th>How reliably</th>
<th>Share of target customers explained</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>5 or above</td>
<td>quality and service, <strong>or</strong> quality and store environment</td>
<td>0.98</td>
<td>40%</td>
</tr>
<tr class="even">
<td>6 or above</td>
<td>quality and service, <strong>or</strong> quality and store environment</td>
<td>0.93</td>
<td>57%</td>
</tr>
<tr class="odd">
<td>7 or above</td>
<td>quality and service only</td>
<td>0.89</td>
<td>66%</td>
</tr>
<tr class="even">
<td>8 or above</td>
<td>no combination of the three is reliable enough</td>
<td>n/a</td>
<td>n/a</td>
</tr>
</tbody>
</table>
<p>Read down the table as the bar rises.</p>
<ul>
<li><strong>A modest goal has options.</strong> There are two routes, so a manager can choose the cheaper one: improve quality and service, or improve quality and the store.</li>
<li><strong>A demanding goal has fewer options.</strong> At 7 or above, only the quality and service route remains. The store environment stops being a way in.</li>
<li><strong>A very demanding goal can outrun the data.</strong> At 8 or above, none of the three strengths, alone or in combination, was enough. That is not proof that no route exists; it tells you that these three strengths do not explain the very top. It is a cue to revisit additional conditions, measurement, the number of cases, and the analysis settings.</li>
</ul>
<p>A single analysis at “7 or above” would have told the first manager something misleading: that quality and service is the only route, when for a broader goal there is a second one.</p>
</section>
<section id="questions-where-this-helps" class="level2">
<h2 class="anchored" data-anchor-id="questions-where-this-helps">Questions where this helps</h2>
<ul>
<li><strong>Satisfaction, recommendation intent (such as the NPS question), or purchase intent:</strong> does the recipe for “satisfied” equal the recipe for “delighted”?</li>
<li><strong>Segment definitions:</strong> if “heavy user” means 10 purchases a year versus 20, do the drivers change?</li>
<li><strong>Campaign targets:</strong> what does it take to move customers from “consider” to “prefer”?</li>
<li><strong>Reporting:</strong> instead of defending one cutoff, show the range and let readers see how much depends on it.</li>
</ul>
</section>
<section id="two-honest-cautions" class="level2">
<h2 class="anchored" data-anchor-id="two-honest-cautions">Two honest cautions</h2>
<ol type="1">
<li><strong>It shows combinations that go together with the outcome. It does not prove cause.</strong> This is true of any analysis of observational data. Treat the results as a map for where to look and what to test.</li>
<li><strong>Do not hunt for the cutoff that gives the nicest answer.</strong> Decide the range before you look, say why, and report all of it. The value of the sweep is in being transparent about how much the answer depends on the definition.</li>
</ol>
</section>
<section id="try-it-on-your-own-survey" class="level2">
<h2 class="anchored" data-anchor-id="try-it-on-your-own-survey">Try it on your own survey</h2>
<p>You do not need to write code from scratch.</p>
<ol type="1">
<li><strong><a href="https://im-research-yt.github.io/analysis-tools/qca-quickstart.html">QCA Quickstart</a></strong> creates a first analysis script from the names of your columns.</li>
<li><strong><a href="https://im-research-yt.github.io/analysis-tools/sweep-builder.html">Sweep Builder</a></strong> turns that setup into a threshold-sweep script.</li>
<li>Paste the script into R. The package is free: <code>install.packages("ThSQCA")</code>.</li>
</ol>
<p>If you would like a gentler walk through the same ideas, the <a href="../../posts/thsqca-beginners-1/index.html">beginner’s series</a> explains every line with a practice data set. The method itself is described in Toyoda (2026), <a href="https://doi.org/10.1007/s11135-026-03092-3">Threshold-sweep QCA: threshold dependence as an analytical dimension</a>, <em>Quality &amp; Quantity</em>, and the package is on <a href="https://cran.r-project.org/package=ThSQCA">CRAN</a>.</p>


</section>

 ]]></description>
  <category>ThSQCA</category>
  <category>marketing</category>
  <category>QCA</category>
  <guid>https://im-research-yt.github.io/posts/qca-for-marketers/</guid>
  <pubDate>Sat, 03 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/qca-for-marketers/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Why QCA suits decision-making: looking for “recipes” instead of single effects</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/why-qca-decisions/</link>
  <description><![CDATA[ 





<p>A marketing manager’s question is not only “If we raise quality, will customers increase?” More often it is “Which things should we combine to reach our target?”</p>
<p>Qualitative comparative analysis (QCA) was built to answer that kind of question. Statistical methods such as regression are good at showing how much one factor matters on its own, with the other conditions held constant. QCA looks at the data from a different angle.</p>
<section id="why-qca-is-attractive-for-decisions" class="level2">
<h2 class="anchored" data-anchor-id="why-qca-is-attractive-for-decisions">Why QCA is attractive for decisions</h2>
<section id="actions-are-taken-in-combination-not-alone" class="level3">
<h3 class="anchored" data-anchor-id="actions-are-taken-in-combination-not-alone">1. Actions are taken in combination, not alone</h3>
<p>Store renovation, better service, and a price review are usually carried out together. QCA takes the combination (the recipe) as its unit, for example “high quality and high service”, and asks what happens to the outcome.</p>
</section>
<section id="there-may-be-more-than-one-road-to-success" class="level3">
<h3 class="anchored" data-anchor-id="there-may-be-more-than-one-road-to-success">2. There may be more than one road to success</h3>
<p>The same outcome can be reached in several ways (equifinality). Under the conditions and analysis settings you choose, QCA can identify several routes to the same outcome, so a manager can choose the one that fits the budget and the company’s strengths.</p>
</section>
<section id="the-reasons-for-success-are-not-always-the-mirror-image-of-the-reasons-for-failure" class="level3">
<h3 class="anchored" data-anchor-id="the-reasons-for-success-are-not-always-the-mirror-image-of-the-reasons-for-failure">3. The reasons for success are not always the mirror image of the reasons for failure</h3>
<p>The conditions that produce loyal customers and the conditions that produce customers who leave may need separate analyses (asymmetry). QCA analyzes the high case and the low case separately.</p>
</section>
<section id="it-can-be-used-with-small-to-medium-numbers-of-cases" class="level3">
<h3 class="anchored" data-anchor-id="it-can-be-used-with-small-to-medium-numbers-of-cases">4. It can be used with small to medium numbers of cases</h3>
<p>With stores, brands, campaigns, or corporate customers, you may have only dozens or a few hundred cases. QCA lets you analyze them while keeping an eye on what is inside each case, It can be used for small to medium comparative case sets. When there are few cases relative to the number of conditions, however, many logical remainders arise (combinations of conditions that no case shows).</p>
</section>
<section id="the-result-reads-as-an-if-then-rule" class="level3">
<h3 class="anchored" data-anchor-id="the-result-reads-as-an-if-then-rule">5. The result reads as an “if … then” rule</h3>
<p>A result comes out as a short rule, such as “high quality and high service”. It is easy to explain in a meeting, and it tells people on the front line what to do.</p>
</section>
<section id="it-separates-necessary-from-sufficient" class="level3">
<h3 class="anchored" data-anchor-id="it-separates-necessary-from-sufficient">6. It separates “necessary” from “sufficient”</h3>
<p>You can treat “without this, success does not happen” (a necessary condition) differently from “with this, success happens” (a sufficient condition). That lets you think separately about the actions you cannot skip and the actions that win.</p>
</section>
</section>
<section id="how-it-differs-from-regression-roughly" class="level2">
<h2 class="anchored" data-anchor-id="how-it-differs-from-regression-roughly">How it differs from regression (roughly)</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Point of view</th>
<th>Regression</th>
<th>QCA</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>The question</td>
<td>How much does one factor matter on its own, with the others held constant?</td>
<td>Which combinations are enough for the outcome?</td>
</tr>
<tr class="even">
<td>Unit of analysis</td>
<td>Each variable</td>
<td>Combinations of conditions</td>
</tr>
<tr class="odd">
<td>Multiple roads</td>
<td>Interactions and nonlinearity must be built into the model</td>
<td>Can be identified as combinations</td>
</tr>
<tr class="even">
<td>How results read</td>
<td>Coefficients and significance</td>
<td>Rules such as “A and B”</td>
</tr>
<tr class="odd">
<td>Typical scale</td>
<td>Large samples</td>
<td>Dozens to a few hundred cases</td>
</tr>
</tbody>
</table>
<p>Neither is better than the other. You choose according to the question.</p>
</section>
<section id="what-qca-cannot-do-and-what-is-also-true-of-other-methods" class="level2">
<h2 class="anchored" data-anchor-id="what-qca-cannot-do-and-what-is-also-true-of-other-methods">What QCA cannot do (and what is also true of other methods)</h2>
<ul>
<li><strong>QCA is not the only method that cannot prove causation.</strong> Analyses of observational data, regression included, cannot fully establish causation. A sufficiency solution from QCA does not, by itself, guarantee the causal effect of carrying out an intervention. A causal reading needs support from research design, temporal order, theory, and case knowledge. The results are best used as material for thinking about candidate interventions and hypotheses to test.</li>
<li><strong>It needs theory and knowledge of the cases.</strong> The analyst decides which conditions to include and where “high” begins.</li>
</ul>
</section>
<section id="the-pitfall-is-the-threshold" class="level2">
<h2 class="anchored" data-anchor-id="the-pitfall-is-the-threshold">The pitfall is the threshold</h2>
<p>That last point matters more than it first appears. In QCA, the analyst decides the <strong>threshold</strong> that separates “high” from “low”. But a decision target is exactly such a threshold: do you aim for “reasonably satisfied” or for “loved”? When the threshold changes, the answer can change too.</p>
<p>Threshold-sweep QCA (ThSQCA) addresses this problem. The next post continues from here.</p>
<p><a href="../../posts/qca-for-marketers/index.html">Next: Is “good enough” the same goal as “loved”?</a></p>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<ul>
<li>Ragin, C. C. (2008). <em>Redesigning Social Inquiry: Fuzzy Sets and Beyond</em>. University of Chicago Press.</li>
<li>Fiss, P. C. (2011). Building better causal theories: A fuzzy set approach to typologies in organization research. <em>Academy of Management Journal</em>, 54(2), 393-420.</li>
<li>Woodside, A. G. (2013). Moving beyond multiple regression analysis to algorithms: Calling for adoption of a paradigm shift from symmetric to asymmetric thinking in data analysis and crafting theory. <em>Journal of Business Research</em>, 66(4), 463-472.</li>
</ul>


</section>

 ]]></description>
  <category>QCA</category>
  <category>marketing</category>
  <guid>https://im-research-yt.github.io/posts/why-qca-decisions/</guid>
  <pubDate>Fri, 02 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/why-qca-decisions/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Introducing ThSQCA: threshold-sweep QCA in R</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/introducing-thsqca/</link>
  <description><![CDATA[ 





<p>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. <strong>ThSQCA</strong> 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.</p>
<section id="the-idea" class="level2">
<h2 class="anchored" data-anchor-id="the-idea">The idea</h2>
<p>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 <em>t</em> and the sufficiency solution <em>S</em> is therefore better described as a mapping, <em>t</em> → <em>S(t)</em>, than as a single solution.</p>
<p>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.</p>
</section>
<section id="what-the-package-does" class="level2">
<h2 class="anchored" data-anchor-id="what-the-package-does">What the package does</h2>
<p>ThSQCA does not implement its own minimization algorithm. Truth table construction and minimization are delegated to the <a href="https://cran.r-project.org/package=QCA">QCA</a> package, so the computational core is the same as in a standard analysis. ThSQCA adds the workflow around it:</p>
<ul>
<li>the same consistency threshold, frequency threshold, solution type, and directional expectations are applied at every step of the sweep;</li>
<li>product terms, solution consistency, and coverage are collected into one common format;</li>
<li>cases with no solution or with multiple minimal solutions are recorded rather than lost;</li>
<li>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.</li>
</ul>
</section>
<section id="four-sweep-functions" class="level2">
<h2 class="anchored" data-anchor-id="four-sweep-functions">Four sweep functions</h2>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Question</th>
<th>Function</th>
<th>Threshold varied</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>How does the solution change as the target outcome level changes?</td>
<td><code>otSweep()</code></td>
<td>Outcome</td>
</tr>
<tr class="even">
<td>How does it change as the criterion for one condition changes?</td>
<td><code>ctSweepS()</code></td>
<td>One condition</td>
</tr>
<tr class="odd">
<td>What happens when the criteria for several conditions change together?</td>
<td><code>ctSweepM()</code></td>
<td>Several conditions</td>
</tr>
<tr class="even">
<td>How does it change when outcome and condition criteria change together?</td>
<td><code>dtSweep()</code></td>
<td>Outcome and conditions</td>
</tr>
</tbody>
</table>
</section>
<section id="getting-started" class="level2">
<h2 class="anchored" data-anchor-id="getting-started">Getting started</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">install.packages</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ThSQCA"</span>)</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span></code></pre></div></div>
<p>The package includes a small example data set, <code>sample_data</code>, with an outcome <code>Y</code> and three conditions <code>X1</code>, <code>X2</code>, and <code>X3</code>, all scored from 0 to 10. The following is a minimal outcome-threshold sweep that runs as it is:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(ThSQCA)</span>
<span id="cb2-2"></span>
<span id="cb2-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">head</span>(sample_data)</span>
<span id="cb2-4"></span>
<span id="cb2-5">res <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">otSweep</span>(</span>
<span id="cb2-6">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">dat         =</span> sample_data,</span>
<span id="cb2-7">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">outcome     =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Y"</span>,</span>
<span id="cb2-8">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">conditions  =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X1"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X2"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"X3"</span>),</span>
<span id="cb2-9">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">sweep_range =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb2-10">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">thrX        =</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">c</span>(<span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">X1 =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">X2 =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">X3 =</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span>
<span id="cb2-11">)</span>
<span id="cb2-12"></span>
<span id="cb2-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">summary</span>(res)</span></code></pre></div></div>
<p>This sweep asks how the sufficiency solution changes when “high outcome” is defined as <code>Y &gt;= 6</code>, <code>Y &gt;= 7</code>, <code>Y &gt;= 8</code>, and <code>Y &gt;= 9</code>. 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 <a href="../thsqca-beginners-1/index.html">part 1 of the beginner’s series</a>.</p>
<p>Running it prints a table like this (only the result part is shown):</p>
<pre><code> 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</code></pre>
<p>Each row is one outcome threshold. In the <code>expression</code> column, <code>*</code> means AND, <code>+</code> means OR, and <code>~</code> means NOT. At <code>Y &gt;= 6</code> and <code>Y &gt;= 7</code>, the same three sufficient paths appear. At <code>Y &gt;= 8</code> and <code>Y &gt;= 9</code>, no solution meets the consistency requirement. A single-threshold analysis cannot show where an answer stops holding; a sweep can.</p>
<p>The package vignette covers all four functions with worked examples.</p>
</section>
<section id="a-note-on-use" class="level2">
<h2 class="anchored" data-anchor-id="a-note-on-use">A note on use</h2>
<p>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 <code>generate_report()</code> function is designed to keep that record.</p>
</section>
<section id="links" class="level2">
<h2 class="anchored" data-anchor-id="links">Links</h2>
<ul>
<li>Paper: Toyoda, Y. (2026). Threshold-sweep QCA: threshold dependence as an analytical dimension. <em>Quality &amp; Quantity</em>. <a href="https://doi.org/10.1007/s11135-026-03092-3">https://doi.org/10.1007/s11135-026-03092-3</a></li>
<li>Package on CRAN: <a href="https://cran.r-project.org/package=ThSQCA">ThSQCA</a></li>
<li>Source code: <a href="https://github.com/im-research-yt/ThSQCA">GitHub</a></li>
<li>Documentation: <a href="https://im-research-yt.github.io/ThSQCA/">im-research-yt.github.io/ThSQCA</a></li>
<li>Browser tools: <a href="https://im-research-yt.github.io/analysis-tools/qca-quickstart.html">QCA Quickstart</a> and <a href="https://im-research-yt.github.io/analysis-tools/sweep-builder.html">Sweep Builder</a></li>
</ul>


</section>

 ]]></description>
  <category>ThSQCA</category>
  <guid>https://im-research-yt.github.io/posts/introducing-thsqca/</guid>
  <pubDate>Thu, 01 Oct 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/introducing-thsqca/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
<item>
  <title>Welcome</title>
  <dc:creator>Yuki Toyoda</dc:creator>
  <link>https://im-research-yt.github.io/posts/welcome/</link>
  <description><![CDATA[ 





<p>This blog collects notes on threshold-sweep QCA, the ThSQCA R package, and data analysis for marketing research.</p>
<p>Three browser tools are already available for generating R code: the <a href="https://im-research-yt.github.io/analysis-tools/qca-quickstart.html">QCA Quickstart</a> for a first <code>truthTable()</code> and <code>minimize()</code> script, the <a href="https://im-research-yt.github.io/analysis-tools/sweep-builder.html">Sweep Builder</a> for turning a fixed-threshold QCA setup into ThSQCA sweep code, and the <a href="https://im-research-yt.github.io/analysis-tools/scale_maker.html">Scale Maker</a> for building a scale from survey items step by step, together with the matching R script.</p>
<p>The articles are arranged in reading order on the <a href="../../index.html">home page</a>. If you are new, start from the top. Technical posts with reproducible R code are in the beginner’s series for ThSQCA.</p>



 ]]></description>
  <category>news</category>
  <guid>https://im-research-yt.github.io/posts/welcome/</guid>
  <pubDate>Wed, 30 Sep 2026 15:00:00 GMT</pubDate>
  <media:content url="https://im-research-yt.github.io/posts/welcome/thumbnail.png" medium="image" type="image/png" height="76" width="144"/>
</item>
</channel>
</rss>
