← zurück zur App

QCA-Primer – eine geführte Einführung

Diese Einführung richtet sich an Neulinge. Sie erklärt die Grundideen der Qualitative Comparative Analysis (QCA) Schritt für Schritt und in der Reihenfolge, in der openQCA dich durch eine Analyse führt. Ziel ist Verständnis, nicht Vollständigkeit – für die Formeln des Rechenkerns siehe engine-notes.md.


1. Was ist QCA?

QCA untersucht, welche Kombinationen von Bedingungen zu einem interessierenden Outcome führen. Sie steht zwischen qualitativer Fallstudie und quantitativer Statistik und eignet sich besonders für mittelgroße Fallzahlen (ca. 10–50 Fälle).

Drei Grundgedanken unterscheiden QCA von der klassischen Regression:

  1. Konjunktion (Kombinationen zählen). Nicht die isolierte Wirkung einer Variablen interessiert, sondern das Zusammenspiel: Bedingung A wirkt vielleicht nur zusammen mit B.
  2. Äquifinalität (mehrere Wege). Verschiedene Kombinationen können zum gleichen Outcome führen. Es gibt oft mehr als einen "Pfad".
  3. Asymmetrie. Die Erklärung für das Eintreten des Outcomes ist nicht einfach die Umkehrung der Erklärung für sein Ausbleiben. Man analysiert beide Seiten getrennt.

Die Sprache der QCA ist die Mengenlehre: Ein Fall ist mehr oder weniger Mitglied einer Menge ("wohlhabende Länder", "stabile Demokratien"). Aussagen haben die Form notwendig und hinreichend.

Crisp Sets und Fuzzy Sets

openQCA unterstützt beide. Beispieldatensätze findest du in ../datasets/.


2. Kalibrierung: von Rohwerten zur Mengenzugehörigkeit

Rohdaten (Prozente, Indizes, Skalen) müssen erst in Mengenzugehörigkeit übersetzt werden. Das nennt man Kalibrierung. Sie ist der wichtigste – und theorielastigste – Schritt der QCA. Eine Set-Zugehörigkeit ist keine Prozentzahl, sondern beantwortet die Frage: Wie sehr gehört dieser Fall in die Menge?

Theorie vor Daten

Kalibrierung ist kein rein statistischer Vorgang. Die Anker sollten aus inhaltlichem/theoretischem Wissen über die Menge kommen, nicht aus der Verteilung der Stichprobe (also nicht einfach der Mittelwert oder Median). Die Frage lautet: Ab welchem Rohwert ist ein Fall inhaltlich "voll drinnen"? – nicht: Wo liegt das obere Quartil?

Direkte Methode und die drei Anker

Die direkte Methode (nach Ragin 2008) verlangt drei Anker:

AnkerBedeutungZiel-Zugehörigkeit
Voll draußen (fullOut)ab hier klar nicht in der Menge≈ 0,05
Kreuzungspunkt (crossover)Punkt maximaler Unentschiedenheitexakt 0,5
Voll drinnen (fullIn)ab hier klar in der Menge≈ 0,95

Die Anker müssen aufsteigend sein (fullOut < crossover < fullIn). Zwischen ihnen interpoliert eine logistische Funktion. Im openQCA-Rechenkern bildet der Kreuzungspunkt exakt auf 0,5 ab, der Voll-drinnen-Anker auf ≈ 0,9526 und der Voll-draußen-Anker auf ≈ 0,0474 (das sind die eingebauten Fixpunkte).

Kleines Beispiel. Wohlstand als BIP pro Kopf, Anker voll draußen = 300, Kreuzung = 600, voll drinnen = 1000:

Neben der logistischen gibt es eine lineare Variante (gleiche Anker, gerade statt s-förmig), eine Crisp-Kalibrierung (eine Schwelle → 0/1) und eine Vier-Werte-Kalibrierung (drei Schwellen → 0 / 0,33 / 0,67 / 1).

Die lineare Variante verbindet die Anker stückweise: bis zum Anker e ergibt sie 0, zwischen e und c steigt sie bis 0,5, zwischen c und i bis 1, danach bleibt sie bei 1. Sie entspricht im R-Paket QCA calibrate(..., logistic = FALSE). Auch hier stammen die Anker aus einer substantiven Set-Definition, nicht automatisch aus Medianen oder Quantilen.

Das 0,5-Problem

Der Wert 0,5 ist heikel: Ein Fall mit exakt 0,5 ist weder "eher drinnen" noch "eher draußen" und lässt sich keiner Ecke der Truth Table eindeutig zuordnen. Deshalb gilt die Faustregel: Kein Fall sollte nach der Kalibrierung genau auf 0,5 liegen. openQCA markiert solche Fälle ausdrücklich (Feld atCrossover in der Truth Table), damit du die Anker anpassen kannst. Der Datensatz fuzzy-sets-beispiel.csv ist bewusst so gebaut, dass dieses Problem nicht auftritt.

Schiefe (skew)

Wenn fast alle Fälle in einer Menge sehr hohe (oder sehr niedrige) Zugehörigkeiten haben, ist die Menge schief besetzt. Das ist inhaltlich oft korrekt, kann aber Konsistenzmaße "aufblähen" (eine Menge, in der fast alle voll drinnen sind, ist leicht Teilmenge von fast allem). Schiefe ist deshalb immer mitzudenken – prüfe die Verteilung der kalibrierten Werte, bevor du interpretierst.


3. Notwendige und hinreichende Bedingungen

Das mengentheoretische Herz der QCA. X sei die Zugehörigkeit zu einer Bedingung (oder Kombination), Y die Zugehörigkeit zum Outcome.

Ein Merksatz: Bei Hinreichendheit liegen die Punkte im XY-Diagramm oberhalb der Diagonale (Y ≥ X), bei Notwendigkeit unterhalb (X ≥ Y).

QCA analysiert beide getrennt: zuerst meist die Suche nach notwendigen Bedingungen (einzeln), dann die Analyse hinreichender Kombinationen über die Truth Table.


4. Truth Table (Wahrheitstafel)

Bei k Bedingungen gibt es 2^k logisch mögliche Kombinationen – die Ecken (Konfigurationen) des Eigenschaftsraums. Die Truth Table listet alle 2^k Zeilen und ordnet jeden Fall der Ecke zu, der er am nächsten liegt (jede Bedingung > 0,5 → "anwesend", ≤ 0,5 → "abwesend").

Jede Zeile bekommt:

Zwei Cutoffs entscheiden über den Output

  1. Frequenz-Cutoff (freqCut): Wie viele Fälle muss eine Ecke mindestens enthalten, um überhaupt bewertet zu werden? Ecken mit zu wenig (oder null) Fällen bleiben Remainder und bekommen Output ?. Bei kleinen Datensätzen ist der Cutoff meist 1.
  2. Konsistenz-Cutoff (consCut): Ab welcher Konsistenz gilt eine (ausreichend besetzte) Ecke als hinreichend für das Outcome (Output 1), darunter als nicht hinreichend (Output 0)? Übliche Werte liegen bei 0,8 und höher.

Remainder (?) sind logisch mögliche, aber empirisch nicht (ausreichend) beobachtete Konfigurationen. Wie man mit ihnen umgeht, unterscheidet die drei Lösungstypen (Abschnitt 6).


5. Konsistenz, Coverage und PRI

Diese Kennzahlen bewerten, wie gut eine Menge X das Outcome Y erklärt.

Konsistenz der Hinreichendheit (inclusion)

Konsistenz = Σ min(X, Y) / Σ X

Misst, wie nah X daran ist, Teilmenge von Y zu sein (X ≤ Y). 1,0 = perfekt hinreichend. Werte unter ~0,75 gelten meist als zu niedrig, um von Hinreichendheit zu sprechen.

Coverage (Abdeckung)

Raw Coverage = Σ min(X, Y) / Σ Y

Misst, wie viel vom Outcome ein Pfad empirisch erklärt (Anteil der Outcome-Mitgliedschaft, den X abdeckt). Hohe Konsistenz + niedrige Coverage = "korrekt, aber selten".

Konsistenz und Coverage sind ein Zielkonflikt, analog zu Präzision und Trefferquote.

PRI (Proportional Reduction in Inconsistency)

PRI = (Σ min(X,Y) − Σ min(X,Y,1−Y)) / (Σ X − Σ min(X,Y,1−Y))

Ein strengeres Konsistenzmaß, das dagegen absichert, dass eine Konfiguration zugleich für das Outcome und sein Gegenteil hinreichend erscheint (ein Problem bei stark schiefen Daten). Große Lücke zwischen Konsistenz und PRI ist ein Warnsignal: dann trägt die Ecke viel "widersprüchliche" Mitgliedschaft. Faustregel: PRI sollte nicht deutlich unter dem Konsistenz-Cutoff liegen.

Notwendigkeit

Für notwendige Bedingungen sind die Rollen von Zähler/Nenner vertauscht:

Notwendigkeits-Konsistenz = Σ min(X, Y) / Σ Y (misst Y ⊆ X) Relevanz/Coverage = Σ min(X, Y) / Σ X

Eine Bedingung gilt üblicherweise als Kandidat für Notwendigkeit ab einer Konsistenz von ≥ 0,9 (openQCA markiert diese). Die Coverage schützt vor trivialer Notwendigkeit: Eine fast allgegenwärtige Bedingung ist zwar formal "notwendig", aber inhaltlich nichtssagend.


6. Boolesche Minimierung und die drei Lösungen

Aus allen Ecken mit Output 1 wird eine möglichst einfache logische Formel gebildet. Das Verfahren heißt Quine-McCluskey: Zwei Konfigurationen, die sich in genau einer Bedingung unterscheiden, werden zusammengefasst und diese Bedingung fällt weg.

Beispiel: WOHLSTAND*BILDUNG*STAAT und WOHLSTAND*BILDUNG*~STAAT unterscheiden sich nur in STAAT → zusammengefasst zu WOHLSTAND*BILDUNG.

Übrig bleiben Primimplikanten; eine minimale Auswahl davon deckt alle positiven Ecken ab (essenzielle Primimplikanten zuerst). Notation im Rechenkern: * = UND, + = ODER, ~ = NICHT.

Der Umgang mit Remaindern (?) unterscheidet drei Lösungen:

LösungRemainder-NutzungCharakter
Komplex (konservativ)keine Remaindernur beobachtete Ecken; am nächsten an den Daten, oft lang
Sparsam (parsimonious)alle hilfreichen Remaindererlaubt jede vereinfachende Annahme; kürzeste Formel
Intermediärnur theoretisch plausible RemainderMittelweg; empfohlen für die Interpretation
Stand im openQCA-Rechenkern: Der Kern berechnet aktuell die komplexe (complexSolution), die sparsame (parsimoniousSolution) und die intermediäre (intermediateSolution) Lösung. Die intermediäre Lösung nutzt nur Remainder, die zu den festgelegten Richtungserwartungen passen (Enhanced Standard Analysis). Siehe engine-notes.md.

Durchgerechnetes Beispiel (aus den Datensätzen)

Mit ../datasets/fuzzy-sets-beispiel.csv (freqCut = 1, consCut = 0,85) liefert der Rechenkern:

Lesart: Eine stabile Demokratie entsteht, wenn der Staat leistungsfähig ist, oder wenn Wohlstand und Bildung gemeinsam hoch sind. Die sparsame Lösung vereinfacht den ersten Pfad zu STAATSKAPAZITAET, weil sie unbeobachtete Ecken als vereinfachende Annahmen zulässt; die komplexe behält den vollständigen, nur aus Daten belegten Pfad.


7. Ein typischer Ablauf in openQCA

  1. Daten laden (CSV: Fall-Spalte, Bedingungen, Outcome).
  2. Kalibrieren – Anker aus Theorie wählen; auf 0,5-Fälle und Schiefe achten.
  3. Notwendige Bedingungen prüfen (Konsistenz ≥ 0,9, Coverage beachten).
  4. Truth Table bauen; Frequenz- und Konsistenz-Cutoff setzen; Remainder und atCrossover-Fälle prüfen.
  5. Minimieren – komplexe, sparsame und intermediäre Lösung berechnen.
  6. Interpretieren – Solution-/Pfad-Konsistenz und -Coverage lesen, typische Fälle je Pfad benennen, an die Theorie zurückbinden.

8. Häufige Fallstricke


Für die konkrete Programmier-Schnittstelle (Funktionen, Typen, Beispiele) siehe engine-notes.md. Alle Beispieldaten liegen unter ../datasets/ und sind rein illustrativ.

Formeln & Definitionen (exakt wie implementiert)

Die folgenden Definitionen entsprechen wörtlich der Implementierung in packages/engine. Sie dienen als exakte Referenz für die Formeln, die openQCA tatsächlich berechnet — nicht als allgemeine Einführung (dafür siehe den Primer oben).

Direkte Kalibrierung (logistisch)

l(x)={3(xc)icxc3(xc)cex<cl(x) = \begin{cases} \dfrac{3(x-c)}{i-c} & x \ge c \\[6pt] \dfrac{3(x-c)}{c-e} & x < c \end{cases}
m(x)=11+el(x)m(x) = \dfrac{1}{1+e^{-l(x)}}

Wandelt einen Rohwert x anhand dreier Anker in eine Fuzzy-Set- Zugehörigkeit m(x) ∈ [0, 1] um: e (voll draußen), c (Kreuzungspunkt, 0,5-Grenze) und i (voll drinnen), mit e < c < i. Zunächst wird ein log-odds-Wert l(x) linear zum Abstand von c berechnet — mit unterschiedlicher Steigung ober- und unterhalb des Kreuzungspunkts —, anschließend liefert die logistische Funktion die Zugehörigkeit.

Daraus ergeben sich exakte Fixpunkte: m(c) = 0,5, m(i) = 1/(1+e⁻³) ≈ 0,9526 und m(e) = 1/(1+e³) ≈ 0,0474. Diese drei Werte sind ein guter Test, ob eine Kalibrierung korrekt implementiert ist.

Quelle: Ragin (2008), Kap. 5.
Implementiert in packages/engine/src/calibrate.ts (calibrateDirect)

Lineare Fuzzy-Kalibrierung (stückweise)

m(x)={0xe12xecee<x<c12+12xciccx<i1xim(x) = \begin{cases} 0 & x \le e \\[2pt] \dfrac{1}{2}\dfrac{x-e}{c-e} & e < x < c \\[6pt] \dfrac{1}{2}+\dfrac{1}{2}\dfrac{x-c}{i-c} & c \le x < i \\[6pt] 1 & x \ge i \end{cases}

Verbindet dieselben drei qualitativen Anker — e (voll draußen), c (Kreuzungspunkt, 0,5) und i (voll drinnen) — mit zwei linearen Teilstücken. Werte außerhalb der Anker werden auf 0 bzw. 1 begrenzt; bei c ergibt sich exakt 0,5. Das ist die stückweise-lineare Variante von QCA::calibrate(logistic = FALSE), nicht eine automatische Wahl der Anker aus der Datenverteilung.

Quelle: Dusa (2019), QCA with R; R-Paket QCA::calibrate(logistic = FALSE).
Implementiert in packages/engine/src/calibrate.ts (calibrateLinear)

Fuzzy-Operationen (Zadeh)

¬x=1xxy=min(x,y)xy=max(x,y)\neg x = 1-x \qquad x \wedge y = \min(x,y) \qquad x \vee y = \max(x,y)
mT(u)=minjTj(u)mS(u)=maxTSmT(u)m_T(u) = \min_{j \in T} \ell_j(u) \qquad\qquad m_S(u) = \max_{T \in S} m_T(u)

Negation, UND und ODER folgen der Zadeh'schen Fuzzy-Logik: Negation ist 1 − x, UND ist das Minimum, ODER das Maximum der beteiligten Zugehörigkeiten. Die Zugehörigkeit eines Terms (einer Konjunktion von Bedingungen/Negationen, „Pfad") zu einem Fall u ist das Minimum über seine literalen Bedingungen ℓⱼ; eliminierte (don't-care) Bedingungen tragen nicht zum Minimum bei. Die Zugehörigkeit einer gesamten Lösung ist das Maximum über alle ihre Terme (Pfade).

Quelle: Zadeh-Fuzzy-Logik, Standard in Ragin (2008).
Implementiert in packages/engine/src/solutions.ts (termMembership, membershipOf)

Konsistenz der Hinreichendheit

incl(XY)=imin(Xi,Yi)iXi\mathrm{incl}(X \to Y) = \dfrac{\displaystyle\sum_i \min(X_i, Y_i)}{\displaystyle\sum_i X_i}

Misst, in welchem Ausmaß die Fälle, die X (eine Bedingung, einen Pfad oder eine Truth-Table-Konfiguration) erfüllen, auch das Outcome Y erfüllen — also wie gut die Teilmengenbeziehung X ⊆ Y empirisch eingehalten wird. Werte nahe 1 bedeuten fast perfekte Hinreichendheit; in der Praxis gilt oft ≥ 0,75 (teils ≥ 0,8) als Mindestschwelle für eine als hinreichend akzeptierte Konfiguration.

Quelle: Ragin (2006).
Implementiert in packages/engine/src/measures.ts (inclusionConsistency); auch in truthTable.ts und solutions.ts verwendet

Coverage der Hinreichendheit (Raw & Unique)

cov(XY)=imin(Xi,Yi)iYi\mathrm{cov}(X \to Y) = \dfrac{\displaystyle\sum_i \min(X_i, Y_i)}{\displaystyle\sum_i Y_i}
covU(P)=imin(Si,Yi)imin(Si,Yi)iYi\mathrm{cov}_U(P) = \dfrac{\displaystyle\sum_i \min(S_i,Y_i) - \sum_i \min(S^-_i,Y_i)}{\displaystyle\sum_i Y_i}

Coverage zeigt, welcher Anteil der Fälle mit Outcome Y durch X erklärt wird — die empirische Relevanz eines hinreichenden Pfades. Raw Coverage wird je Pfad mit dessen Zugehörigkeit als X berechnet. Unique Coverage isoliert den Beitrag, der ausschließlich diesem Pfad zuzuschreiben ist: S ist die Zugehörigkeit zur gesamten Lösung (Maximum über alle Pfade), S⁻ dieselbe Zugehörigkeit ohne den betrachteten Pfad — die Differenz ergibt dessen Alleinstellungs-Beitrag zur Gesamtcoverage.

Quelle: Ragin (2006).
Implementiert in packages/engine/src/measures.ts (rawCoverage); packages/engine/src/solutions.ts (computeModel)

PRI (Proportional Reduction in Inconsistency)

PRI=imin(Xi,Yi)imin(Xi,Yi,1Yi)iXiimin(Xi,Yi,1Yi)\mathrm{PRI} = \dfrac{\displaystyle\sum_i \min(X_i,Y_i) - \sum_i \min(X_i,Y_i,1-Y_i)}{\displaystyle\sum_i X_i - \sum_i \min(X_i,Y_i,1-Y_i)}

PRI deckt auf, ob X gleichzeitig eine Teilmenge von Y UND eine Teilmenge von dessen Komplement ~Y ist — ein Fall, den die einfache Konsistenz übersehen kann, weil ein hoher Rohwert trotzdem mit substanzieller Übereinstimmung mit ~Y einhergehen kann (simultane Subset-Beziehung). Fällt PRI deutlich niedriger aus als die Rohkonsistenz, ist das ein Warnsignal für eine solche Ambiguität und ein Grund, die Konfiguration genauer zu prüfen.

Quelle: Schneider & Wagemann (2012); Ragin (2008).
Implementiert in packages/engine/src/measures.ts (priConsistency); auch in truthTable.ts (Zeilen-PRI)

Notwendigkeit

inclnec(YX)=imin(Xi,Yi)iYi\mathrm{incl}_{\text{nec}}(Y \to X) = \dfrac{\displaystyle\sum_i \min(X_i,Y_i)}{\displaystyle\sum_i Y_i}
covnec(YX)=imin(Xi,Yi)iXi\mathrm{cov}_{\text{nec}}(Y \to X) = \dfrac{\displaystyle\sum_i \min(X_i,Y_i)}{\displaystyle\sum_i X_i}

Prüft die umgekehrte Teilmengenbeziehung Y ⊆ X: ist eine Bedingung notwendig für das Outcome? Die Notwendigkeits-Konsistenz misst, wie gut X die Fälle mit Y abdeckt; konventionell gilt ein Wert ≥ 0,90 als Kandidat für eine notwendige Bedingung. Die Notwendigkeits-Coverage (ein Relevanz-Hinweis) zeigt, wie trivial ein hoher Konsistenzwert sein kann — ist X selbst schon fast immer erfüllt, sagt hohe Konsistenz wenig aus. Die Implementierung prüft dies für jede Bedingung und ihre Negation.

Quelle: Ragin (2006); Schneider & Wagemann (2012).
Implementiert in packages/engine/src/measures.ts (necessityConsistency, necessityCoverage); packages/engine/src/solutions.ts (necessityAnalysis)

Truth-Table-Zuordnung

mi=minjj(xij),j={xijBitj=11xijBitj=0m_i = \min_j \ell_j(x_{ij}), \qquad \ell_j = \begin{cases} x_{ij} & \text{Bit}_j = 1 \\ 1-x_{ij} & \text{Bit}_j = 0 \end{cases}

Für jede der 2ᵏ logisch möglichen Konfigurationen erhält jeder Fall eine kontinuierliche Zugehörigkeit mᵢ (Minimum über die literalen Bedingungen). Formal einer Konfiguration zugeordnet wird ein Fall aber nur, wenn er in jeder Bedingung strikt auf der passenden Seite von 0,5 liegt (x > 0,5, wenn die Bedingung im Bit vorhanden ist; x ≤ 0,5, wenn sie negiert ist) UND zusätzlich mᵢ > 0,5 gilt. Fälle mit exakt 0,5 in mindestens einer Bedingung werden separat vermerkt — das klassische „0,5-Problem", bei dem eine eindeutige Zuordnung nicht möglich ist.

Zeilen-Konsistenz und Zeilen-PRI werden dagegen über alle Fälle mit ihrer kontinuierlichen Zugehörigkeit mᵢ berechnet — analog zu Konsistenz und PRI oben, mit X = mᵢ.

Quelle: Ragin (2008); Schneider & Wagemann (2012).
Implementiert in packages/engine/src/truthTable.ts (buildTruthTable)

Lösungstypen: konservativ, sparsam, intermediär

Die konservative (komplexe) Lösung minimiert ausschließlich anhand beobachteter, positiver Konfigurationen — keine Remainder (unbeobachtete Kombinationen) werden als Vereinfachungsannahme zugelassen, was zu einer wenig reduzierten, aber „sicheren" Lösung führt. Die sparsame Lösung lässt umgekehrt alle Remainder als Vereinfachungsannahmen zu, unabhängig von inhaltlicher Plausibilität, und liefert die kürzestmögliche Lösung. Die intermediäre Lösung (Enhanced Standard Analysis) liegt dazwischen: Nur Remainder, die den vorab festgelegten Richtungserwartungen je Bedingung entsprechen („easy counterfactuals"), werden als Vereinfachungsannahme zugelassen.

Quelle: Ragin & Sonnett (2005).
Implementiert in packages/engine/src/solutions.ts (complexSolution, parsimoniousSolution, intermediateSolution)

Literatur

  • Ragin, C. C. (2006). Set Relations in Social Research: Evaluating Their Consistency and Coverage. Political Analysis, 14(3), 291–310.
  • Ragin, C. C. (2008). Redesigning Social Inquiry: Fuzzy Sets and Beyond. University of Chicago Press.
  • Ragin, C. C., & Sonnett, J. (2005). Between Complexity and Parsimony: Limited Diversity, Counterfactual Cases, and Comparative Analysis. In S. Kropp & M. Minkenberg (Eds.), Comparing in Political Science. VS Verlag.
  • Schneider, C. Q., & Wagemann, C. (2012). Set-Theoretic Methods for the Social Sciences: A Guide to Qualitative Comparative Analysis. Cambridge University Press.
  • Duša, A. (2019). QCA with R: A Comprehensive Resource. Springer.

Verifizierte Referenzen für Kalibrierung und Robustheit

  • Charles C. Ragin (2008), Redesigning Social Inquiry: Fuzzy Sets and Beyond, University of Chicago Press. Fuzzy-set calibration and the distinction between calibration and measurement. DOI: 10.7208/chicago/9780226702797.001.0001
  • Carsten Q. Schneider and Claudius Wagemann (2012), Set-Theoretic Methods for the Social Sciences, Cambridge University Press, S. 35–36. Chapter 4, calibration and substantive qualitative anchors. DOI: 10.1017/CBO9781139004244
  • Adrian Dușa (2019), QCA with R: A Comprehensive Resource, Springer. QCA workflows and the QCA package. DOI: 10.1007/978-3-319-75668-4
  • Ioana-Elena Oana and Carsten Q. Schneider (online 2021; print 2024), A Robustness Test Protocol for Applied QCA: Theory and R Software Application, Sociological Methods & Research, 53(1), 57–88, S. 57–88. Background on robustness testing in QCA; openQCA implements a scenario/cutoff grid, not the protocol's RF_incl/RF_cov/RF_case measures. DOI: 10.1177/00491241211036158
  • Adrian Dușa, QCA package reference manual v3.25, S. 4–8. Official calibrate() reference. https://cran.r-project.org/web/packages/QCA/QCA.pdf