1. Name the variables
A Treatment is the action you set. An Outcome is the measured quantity whose mean you want. Covariates are observed variables used in the proposed causal graph.
- Select No unmeasured confounding.
- Enter Treatment
A, CovariatesC, and OutcomesY. - Select Update graph.
Use distinct names starting with a letter and containing letters, digits or underscores. A name such as X(x1, x2) groups ordered source columns inside one graph variable. The graph node and its bound CSV columns are different parts of the input.
APO requests the mean under one fixed action. ATE subtracts a reference-action mean. For a binary A, action 1 and reference 0 compare those two settings. The default public score route requires declared discrete actions; it does not execute continuous fixed-point interventions.
2. Review the assumed graph
The initial template adds C → A, C → Y, and A → Y. These arrows are your causal assumptions. The app does not learn their truth from a CSV.
Select Identify to call cs.identify_query on the current graph and query. No data are needed. Read the returned status, method and reason. An unfinished or unsupported search is not a proof that the effect is unidentifiable.
Front-door and Sequential are graph templates. Their names do not guarantee that a particular query can be identified or numerically executed. Estimate calls cs.fit_query_mean, which performs its own identification.
Variables measured at different times
For a Sequential template, give each measurement a distinct name, such as C1, A1, C2, A2 and Y. Review the generated time order and arrows. Later measurements are not automatically valid baseline adjustment variables.
The app submits the actual graph and complete fixed-action assignments to the SDK. It does not replace a failed graph query with a user-assumed sequential formula.
3. Upload and bind your CSV
- Select Estimate → Upload CSV.
- Choose the CSV file. If the file dialog is unavailable, open Other ways to load CSV and paste or drop the file.
- Open Data columns. Bind every observed graph variable to its numeric source column or ordered member columns. Unobserved variables need no column.
- Declare the column types and supports needed by the SDK.
binarydeclares support 0/1; observed unique values are not a population-support certificate. - Check the action and reference values, then select Run estimate.
For example, a CSV with columns customer_id, pre_spend, promotion, revenue can bind C to pre_spend, A to promotion, and Y to revenue. An unused identifier is not an adjustment variable unless you deliberately add and bind it. Row-level processing does not establish independence for repeated customers.
Duplicate headers and missing, nonnumeric or nonfinite selected cells must be corrected. The input adapter reports the offending binding or cell; it does not silently impute or drop rows. Read any error before treating a newly selected file as the active dataset.
Use Head to inspect the retained rows. Download CSV saves the retained dataset. Neither action estimates an effect or generates new records.
4. Read the actual SDK result
Identification status and estimation status answer different questions. Identification ACCEPT can coexist with estimation UNSUPPORTED. Only a returned numerical estimate is shown as an estimate; an unsupported result keeps its reason.
The public default is backend="score". Details retains the SDK's identification method, such as fixed_MC, and computation mode, such as UCA_SCORE, as separate values. These names are not relabelled as the former AIPW, IPW or Outcome Regression methods.
Identify submits the complete ordered outcome list in one call. APO uses one fit_query_mean call for that full list. ATE uses two regime calls with the same original graph, complete outcome list, rows and options, then subtracts the returned vectors. Each outcome card displays its coordinates from that SDK vector; it does not fit the outcome separately. The app does not combine their individual score intervals into a causal ATE interval.
causal_interval=None and confidence_interval=None mean the SDK returned no such interval. A returned conditional_score_interval concerns a fitted score under the recorded assumptions. It is not an automatic causal confidence interval.
Inspect actual options, runtime versions, support and weighting diagnostics, and inference assumptions in Details. A finite value or a successful solver does not establish a correct graph, population overlap or accurate nuisance learning.
Arbitrary Conditioning on, counterfactual evidence and unsupported numerical routes remain UNSUPPORTED in this integration. No legacy estimator, graph-free template or simulated answer is used as a fallback.
5. Edit, then replay the same request
Use Edit tools to add or delete variables and arrows, or mark a variable Observed/Unobserved. Review the graph after every causal change. Moving a node changes its position, not its causal meaning.
Open Details → Calculation code. Download the retained data and the adapter-generated Python script. The code restores the original graph, column metadata and bindings, complete actions, seed, backend and search options, then calls import causalscience as cs.
Install CausalScience==0.1.0a13 using Code & installation. The replay checks the recorded SDK/dependency versions and data hash and stops on a mismatch. Match the recorded versions before comparing the calculation and diagnostics; native Python and browser builds can still differ.
Supported synthetic generation retains its own settings, separately from estimation. Random Data model-reference comparisons are not connected in this integration and remain N/A. A benchmark reference can be displayed as separate source metadata only when dataset ID, row count, factual-data hash, treatment/outcome bindings and requested regime match. Its definition and provenance appear separately from the SDK result. LaLonde retains N/A with its source reason. Hidden simulator values and benchmark reference answers are not estimation inputs.
Help
My CSV will not run: correct the reported header, cell, type, support or binding. A selected file name alone does not show that loading succeeded.
Identify accepts but Estimate does not: inspect estimation_status and reason. A valid identifying expression can be outside the numerical backend's supported scope.
I need a conditional effect, continuous intervention or another method: consult the public API documentation for its separate contracts. A capability elsewhere in the package is not automatically an active app workflow.