In früheren Beiträgen haben wir die Identifizierung von Kausalmodellen und die Berechnung von ATEs mithilfe von Kausaldiagrammen erörtert. Was aber, wenn wir keinen Zugriff auf einen Kausalgraphen haben? In solchen Situationen können kausale Entdeckungsmethoden unglaublich hilfreich sein. Diese Techniken bieten eine spannende Möglichkeit, Einblicke in Datenstrukturen und kausale Zusammenhänge direkt aus den Daten selbst zu gewinnen.
Wir haben bereits die Markov-Annahme erwähnt. Um Ihr Gedächtnis aufzufrischen, hier die globale Markov-Annahme:
Vorausgesetzt, dass P Markov in Bezug auf G ist (erfüllt die lokale Markov-Annahme), sind X und Y unabhängig in P, bedingt durch Z, wenn X und Y in G bedingt durch Z d-getrennt sind. Dies kann wie folgt geschrieben werden:
Wenn wir mit einem unbekannten Kausalgraphen arbeiten, haben wir nicht die erste Komponente des Theorems, können aber die zweite berechnen. Daher müssen wir die Annahme der Treue treffen:
Diese Annahme ist ziemlich stark und trifft in einigen Strukturmodellen möglicherweise nicht zu. Betrachten wir ein Beispiel von Brady Neal:
In diesem Fall können wir die Parameter Alpha, Beta, Gamma und Delta finden, sodass A unabhängig von D ist. Wie Sie in der Grafik sehen können, ist dies jedoch nicht der Fall.
Zusätzlich zu den zuvor genannten Annahmen müssen wir auch berücksichtigen Kausale Suffizienz:
Für keine der Variablen im Diagramm gibt es unbeobachtete Störfaktoren.
Darüber hinaus gehen wir davon aus, dass der Graph vorhanden ist Azyklisch.
Eine Herausforderung bei der Ursachenforschung besteht darin, dass bestimmte Diagramme nicht allein anhand der Daten unterschieden werden können. Solche Graphen werden Markov-Äquivalent genannt. Vielleicht erinnern Sie sich zum Beispiel an Strukturen wie Ketten und Gabeln aus unseren vorherigen Beiträgen:
Diese drei Diagramme sind Markov-äquivalent. Bei der Untersuchung der Daten stellen wir fest, dass X1 und X3 unabhängig sind, wenn sie von X2 konditioniert werden, während sie ohne Konditionierung alle paarweise abhängig sind. In solchen Situationen ist die einzige Info, die wir extrahieren können, ein sogenanntes Skelett:
Daher besteht unsere einzige Likelihood, Graphen zu unterscheiden, wenn ihre Markov-Äquivalenzklasse nur einen Graphen enthält, was bedeutet, dass sie nicht Markov-äquivalent sind.
Davon können wir oft profitieren Unmoral in der Ursachenfindung. Wie Sie sich vielleicht erinnern, tritt Unmoral auf, wenn wir zwei Elternteile und einen Collider haben. Darüber hinaus sind die beiden Eltern unabhängig, und die Steuerung des Colliders öffnet einen Hintertürpfad, der sie bedingt abhängig macht. Dies führt zu Situationen, in denen wir die Struktur des Diagramms sicher aus den Daten bestimmen können, solange wir die drei Annahmen im Hinterkopf behalten.
Im folgenden Algorithmus, der als PC-Algorithmus bekannt ist, dienen Unmoralien und Skelette als unsere primären Werkzeuge für die kausale Entdeckung:
PC-Algorithmus:
- Erstellen Sie das vollständige Diagramm
- Identifizieren Sie das Skelett
- Identifizieren und orientieren Sie die Unmorallichkeiten
- Richten Sie qualifizierende Kanten aus, die auf Collider einfallen
Betrachten Sie die folgende Grafik:
Wir kennen nur die Werte aller fünf Variablen. Lassen Sie uns zunächst das vollständige Diagramm erstellen:
Der nächste Schritt besteht darin, das Skelett zu identifizieren. Dazu müssen wir veraltete Kanten aus dem Diagramm entfernen. Wenn wir paarweise Abhängigkeiten mit einem leeren Konditionierungssatz untersuchen, stellen wir fest, dass A und B unabhängig sind. Dadurch können wir den AB-Hyperlink eliminieren. Nachdem wir den Konditionierungssatz um eine Variable erweitert haben, betrachten wir erneut bedingte Abhängigkeiten zwischen verschiedenen Variablenpaaren. Wir entdecken, dass die Bedingung von C, A und B abhängig wird. Dies weist darauf hin, dass ACB mit Collider C eine Unmoral bildet. Darüber hinaus werden alle anderen Paare (BE, BD, AD, AE, DE) unabhängig, wenn sie an C konditioniert werden, was es uns ermöglicht, fünf weitere Verbindungen zu eliminieren. Wir erhalten die folgende Grafik:
Der letzte Schritt besteht darin, die Kanten DC und EC auszurichten. In diesem Fall ist es ganz einfach. Da wir festgestellt haben, dass C nur in der Immoralität ACB ein Collider ist, gibt es keine weiteren Immoralitäten und wir können definitiv sagen, dass die Kanten DC und EC nicht auf den C-Knoten gerichtet sind. Dies ermöglicht es uns, auf den Kausalgraphen zu schließen.
Betrachten wir ein praktisches Beispiel und versuchen wir, aus Rohdaten ein Kausaldiagramm zu erstellen. Wir werden Daten aus der Grafik generieren, die wir im vorherigen Beitrag gesehen haben:
Der Datengenerierungsprozess ist wie folgt:
np.random.seed(11)alpha = 0.5
beta = -5
delta = 0.4
gamma = -0.7
Z = np.random.regular(loc=1, dimension=500)
T = alpha * Z + np.random.regular(loc=2, dimension=500)
M = beta * T + np.random.regular(dimension=500)
Y = delta * Z + gamma* M + np.random.regular(dimension=500)
C = T + Y + np.random.regular(dimension=500)
df = pd.DataFrame(np.stack((Z, T, M, Y, C), axis=1),
columns=['Z', 'T', 'M', 'Y', 'C'])
Um eine kausale Entdeckung durchzuführen, verwenden wir die CausalNex-Bibliothek und wenden den zuvor besprochenen PC-Algorithmus an. Lassen Sie uns die erforderlichen Bibliotheken importieren und die Analyse durchführen.
import networkx as nx
import matplotlib.pyplot as plt
from causalnex.construction.notears import from_pandas_lasso# Studying the causal graph utilizing the PC algorithm
sm = from_pandas_lasso(df, beta=0, w_threshold=0.3)
Der from_pandas_lasso Die Methode verwendet eine Modifikation des PC-Algorithmus. Indem Beta auf Null gesetzt wird, wird es zum Customary-PC-Algorithmus mit einem Schwellenwert von 0,3 für eine Verbindung. Je höher der Schwellenwert, desto mehr Hyperlinks werden beschnitten. Lassen Sie uns das endgültige Diagramm visualisieren:
# Changing the StructureModel to a networkx graph
G = nx.DiGraph(sm.edges)# Visualizing the graph
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='grey',
node_size=3000, font_size=18, font_weight='daring')
plt.present()
Wie wir sehen, ist das genau unsere Grafik! Jetzt können wir die kausale Wirkung von T auf Y mithilfe der doWhy-Bibliothek abschätzen (die Methoden verwendet, die denen bekannt sind, die die vorherigen Beiträge gelesen haben).
from dowhy import CausalModel# Convert networkX illustration to GLM - appropriate with Causal Mannequin
nx.write_gml(G, 'take a look at.gml')
# Create the dowhy Causal Mannequin
mannequin = CausalModel(
knowledge=df,
therapy='T',
end result='Y',
graph='take a look at.gml'
)
Mit doWhy können wir nun die Annahmen und Methoden explizit zeigen und dann den Effekt abschätzen:
# Figuring out the causal impact
identified_estimand = mannequin.identify_effect()
print(identified_estimand)
Dies gibt aus:
Estimand kind: nonparametric-ate### Estimand : 1
Estimand title: backdoor
Estimand expression:
d
────(Expectation(Y|Z))
d[T]
Estimand assumption 1, Unconfoundedness: If U→{T} and U→Y then P(Y|T,Z,U) = P(Y|T,Z)
### Estimand : 2
Estimand title: iv
No such variable(s) discovered!
### Estimand : 3
Estimand title: frontdoor
Estimand expression:
Expectation(By-product(Y, [M])*By-product([M], [T]))
Estimand assumption 1, Full-mediation: M intercepts (blocks) all directed paths from T to Y.
Estimand assumption 2, First-stage-unconfoundedness: If U→{T} and U→{M} then P(M|T,U) = P(M|T)
Estimand assumption 3, Second-stage-unconfoundedness: If U→{M} and U→Y then P(Y|M, T, U) = P(Y|M, T)
Die Ausgabe zeigt, dass sowohl Backdoor- als auch Frontdoor-Ansätze auf dieses Diagramm angewendet werden können. Lass es uns versuchen:
# Estimating the causal impact
estimate = mannequin.estimate_effect(identified_estimand,
method_name='backdoor.linear_regression',
confidence_intervals=True)print("Causal Estimate:", estimate.worth)
print("Confidence Intervals: ", estimate.get_confidence_intervals())
Dies bietet:
Causal Estimate: 3.5563634704585154
Confidence Intervals: [[3.45063871 3.66208824]]
Das Ergebnis kommt dem, was wir für dieses Diagramm in unserem vorherigen Beitrag erhalten haben, sehr nahe. Die Frontdoor-Methode führt zum gleichen Ergebnis.
DoWhy bietet auch ein weiteres nützliches Device – die Möglichkeit, Ergebnisse auf Robustheit zu testen (als Widerlegungsschritt bezeichnet). Wir werden mehrere Widerlegungsmethoden verwenden:
- Zufällige häufige Ursache: Diese Methode fügt dem Datensatz einen zufälligen Störfaktor hinzu und schätzt den kausalen Effekt neu. Wenn die neue Schätzung der ursprünglichen ähnlich ist, weist dies darauf hin, dass die ursprüngliche Schätzung sturdy gegenüber dem Vorhandensein eines unbeobachteten Störfaktors ist.
- Placebo-Behandlung Refuter: Diese Methode ersetzt die ursprüngliche Behandlungsvariable durch eine zufällig generierte Placebovariable (ohne Bezug zum Ergebnis) und schätzt den kausalen Effekt neu. Wenn die neue Schätzung nahe bei Null liegt, deutet dies darauf hin, dass die ursprüngliche Schätzung nicht nur das Ergebnis falscher Korrelationen ist.
- Refuter für Datenteilmengen: Diese Methode schätzt den kausalen Effekt auf zufällige Teilmengen der Daten neu. Wenn die neuen Schätzungen der ursprünglichen Schätzung ähneln, deutet dies darauf hin, dass die ursprüngliche Schätzung sturdy gegenüber Schwankungen in den Daten ist.
Schauen wir uns die Ergebnisse an:
refutation = mannequin.refute_estimate(identified_estimand, estimate, method_name='random_common_cause')
print(refutation)
Refute: Add a random frequent trigger
Estimated impact:3.5563634704585154
New impact:3.5564561606343172
p worth:0.5
Die hier getestete Hypothese ist, dass sich der neue Effekt nach der Widerlegung deutlich vom zuvor geschätzten Effekt unterscheidet. Die Nullhypothese besagt, dass sie sich nicht unterscheiden.
Ähnliche Ergebnisse erhalten wir auch bei den anderen Refuterern. Dies gibt uns die Gewissheit, dass unsere Ergebnisse sturdy sind.
Lassen Sie uns nun auf einige näher eingehen theoretischer Bonus:
Der Satz der Markov-Vollständigkeit Zustände:
Wenn wir multinomiale Verteilungen oder lineare Gaußsche Strukturgleichungen haben, können wir einen Graphen nur bis zu seiner Markov-Äquivalenzklasse identifizieren.
Dies impliziert, dass es keine Methode gibt, die uns dabei helfen kann, Strukturen wie Gabelungen oder Ketten zu identifizieren oder X → Y von Y → X zu unterscheiden. Ohne Annahmen sollten die von uns verwendeten Ergebnisse den Satz erfüllen. Was würde jedoch passieren, wenn wir von nichtlinearen Gaußschen Strukturgleichungen und nichtmultinomialen Verteilungen ausgehen?
Betrachten Sie eine lineare nicht-Gaußsche Strukturgleichung:
Dabei ist f eine lineare Funktion und U eine nicht-Gaußsche Zufallsvariable. In diesem Fall haben wir eine Satz welche Staaten:
Wenn in der linearen nicht-Gaußschen Umgebung das wahre Strukturkausalmodell (SCM) wie folgt lautet:
dann existiert kein SCM in umgekehrter Richtung:
das Daten erzeugen kann, die mit P(x, y) konsistent sind.
Der Beweis ist ganz einfach. Ich ermutige Sie, es in Brady Neals Buch zu erkunden.
Beispiel für Nicht-Gauß-Funktion
Betrachten wir ein einfaches Beispiel mit zwei verbundenen Knoten A und B (A→B). Aus der Theorie wissen wir, dass wir nur feststellen können, ob sie verbunden sind oder nicht – mit anderen Worten, wir können nur das Skelett und nicht die Richtung der Kanten ermitteln.
np.random.seed(11)A = 3 + np.random.uniform(-1,1, dimension=500)
B = A + np.random.standard_t(5, dimension=500)
df = pd.DataFrame(np.stack((A,B), axis=1),
columns=['A', 'B'])
Lassen Sie uns die Abhängigkeit visualisieren:
Transponiert:
Von hier aus ist es schwierig zu bestimmen, welche Variable von der anderen abhängt, da beide Regressionen signifikante Koeffizienten haben, was natürlich zu erwarten ist:
Wenn wir jedoch die Verteilung der Residuen aus diesen Regressionen nach Kovariate untersuchen, beobachten wir Folgendes:
Wir können sehen, dass das linke (das die Residuen aus dem Kausalmodell zeigt) Residuen aufweist, die von der Kovariate A unabhängig sind. Im Gegensatz dazu weist das rechte eine starke Heteroskedastizität auf, und trotz E(resid|B) = 0 ist dies nicht möglich Betrachten Sie das Residuum und B als unabhängig.
Zusammenfassend lässt sich sagen, dass die Kausalerkennung ein leistungsstarkes Werkzeug im Bereich der Kausalinferenz ist und es uns ermöglicht, Kausalzusammenhänge direkt aus den Daten aufzudecken, wenn wir keinen Zugriff auf einen Kausalgraphen haben. Durch die Nutzung von Annahmen wie Treue, Kausale SuffizienzUnd Azyklizitätkönnen wir Algorithmen wie den PC-Algorithmus anwenden, um Skelette und Unmoralien zu identifizieren, die uns wiederum dabei helfen, kausale Strukturen abzuleiten.
In diesem Beitrag haben wir ein praktisches Beispiel mit synthetischen Daten untersucht und gezeigt, wie die Entdeckung von Kausalitäten zu genauen Kausaldiagrammen führen kann. Wir diskutierten auch die Einschränkungen der Methoden im Kontext linearer Gauß- und Multinomialverteilungen sowie die Möglichkeit, kausale Richtungen zu identifizieren, wenn mit linearen nicht-Gauß-Strukturgleichungen gearbeitet wird.
Obwohl Techniken zur Kausalerkennung wertvolle Erkenntnisse liefern können, ist es wichtig zu bedenken, dass die Genauigkeit dieser Methoden von der Gültigkeit der getroffenen Annahmen abhängt. Darüber hinaus sind möglicherweise zusätzliche Fachkenntnisse oder Expertenbeiträge erforderlich, um die Ergebnisse vollständig zu interpretieren und zu verstehen. Insgesamt ist die Kausalforschung ein spannendes und vielversprechendes Forschungsgebiet, das unser Verständnis von Kausalzusammenhängen weiter vorantreibt und unsere Fähigkeit verbessert, datengesteuerte Entscheidungen zu treffen.
Begleiten Sie mich auf dieser Reise in die Welt der kausalen Schlussfolgerungen und wir werden uns in zukünftigen Beiträgen mit Instrumentvariablen, CATEs und mehr befassen!