Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Causal Forge</title> | |
| <style> | |
| :root { color-scheme: dark; font-family: Inter, ui-sans-serif, system-ui; } | |
| * { box-sizing: border-box; } | |
| body { margin: 0; min-height: 100vh; background: #060817; color: #edf4ff; } | |
| canvas { position: fixed; inset: 0; width: 100%; height: 100%; opacity: .55; } | |
| main { position: relative; z-index: 1; width: min(1080px, 92vw); margin: auto; | |
| padding: 72px 0 96px; } | |
| .eyebrow { color: #73e6ff; letter-spacing: .18em; text-transform: uppercase; | |
| font-size: .75rem; font-weight: 800; } | |
| h1 { font-size: clamp(3rem, 8vw, 7rem); line-height: .9; margin: 14px 0 24px; | |
| background: linear-gradient(120deg,#fff,#74e7ff 55%,#b48cff); | |
| -webkit-background-clip: text; color: transparent; } | |
| .lead { max-width: 760px; color: #b8c7e6; font-size: 1.2rem; line-height: 1.65; } | |
| .actions { display: flex; flex-wrap: wrap; gap: 12px; margin: 30px 0 48px; } | |
| a { color: inherit; } | |
| .button { padding: 12px 18px; border-radius: 999px; text-decoration: none; | |
| background: #eaf8ff; color: #07101c; font-weight: 800; } | |
| .button.alt { background: #171d38cc; color: #dce8ff; border: 1px solid #415078; } | |
| .grid { display: grid; grid-template-columns: 1.1fr .9fr; gap: 20px; } | |
| .card { border: 1px solid #344269; background: #0c1128dd; border-radius: 24px; | |
| padding: 24px; backdrop-filter: blur(18px); box-shadow: 0 24px 80px #0008; } | |
| h2 { margin-top: 0; } | |
| pre { white-space: pre-wrap; word-break: break-word; color: #a9bddf; | |
| max-height: 520px; overflow: auto; } | |
| ul { max-height: 520px; overflow: auto; padding-left: 1.2rem; color: #a9bddf; } | |
| li { margin: 8px 0; } | |
| input { width: 100%; padding: 12px; border-radius: 12px; border: 1px solid #344269; | |
| background: #070b1a; color: white; margin-bottom: 12px; } | |
| @media (max-width: 780px) { .grid { grid-template-columns: 1fr; } } | |
| </style> | |
| </head> | |
| <body> | |
| <canvas id="field"></canvas> | |
| <main> | |
| <div class="eyebrow">Jacob Garcia · Hugging Face Model Foundry</div> | |
| <h1>Causal Forge</h1> | |
| <p class="lead">Interactive association-versus-causation laboratory. This showcase backs up the | |
| trained artifacts, measured evaluation, and complete runnable source.</p> | |
| <div class="actions"> | |
| <a class="button" href="https://huggingface.co/spaces/ARotting/causal-forge/tree/main">Explore every file</a> | |
| <a class="button alt" href="https://huggingface.co/ARotting">View the full foundry</a> | |
| </div> | |
| <div class="grid"> | |
| <section class="card"> | |
| <h2>Verified project card</h2> | |
| <pre># Causal Forge | |
| Causal Forge is a ground-truth causal inference laboratory. Its structural causal | |
| model creates confounding, heterogeneous treatment effects, nonlinear outcomes, and | |
| known counterfactuals. The benchmark measures whether estimators recover the | |
| population average treatment effect rather than merely predicting observed outcomes. | |
| The evaluation compares: | |
| - the unadjusted difference in observed group means; | |
| - inverse-propensity weighting (IPW); | |
| - outcome regression with separate treatment/control response surfaces; | |
| - the augmented IPW (AIPW) doubly robust estimator; | |
| - four nuisance-model regimes where the propensity model, outcome model, both, or | |
| neither receive the correct nonlinear feature basis. | |
| The exact potential outcomes and treatment probabilities are retained only because | |
| this is a synthetic benchmark. They make estimator bias directly measurable. | |
| ## Verified results | |
| The benchmark ran 100 independent replications with 3,000 observations and five-fold | |
| cross-fitting in each replication. | |
| | Nuisance-model regime | Naive MAE | IPW MAE | Outcome MAE | AIPW MAE | AIPW bias | | |
| | --- | ---: | ---: | ---: | ---: | ---: | | |
| | Both correct | 1.1109 | 0.0644 | 0.0388 | 0.0426 | 0.0004 | | |
| | Propensity misspecified | 1.1109 | 0.1342 | 0.0388 | 0.0414 | 0.0008 | | |
| | Outcome misspecified | 1.1109 | 0.0644 | 0.2688 | 0.0481 | 0.0078 | | |
| | Both misspecified | 1.1109 | 0.1342 | 0.2688 | 0.3953 | 0.3953 | | |
| This demonstrates the intended double-robustness boundary: AIPW remains accurate | |
| when either the treatment or outcome nuisance model is correct, but not when both | |
| are wrong. Results are Monte Carlo measurements on this synthetic SCM, not claims | |
| about arbitrary real-world observational data. | |
| ## Reproduce | |
| ```powershell | |
| uv run python projects/causal-forge/train.py | |
| ``` | |
| </pre> | |
| <h2>Evaluation snapshot</h2> | |
| <pre>{ | |
| "benchmark": "Causal Forge", | |
| "replications": 100, | |
| "samples_per_replication": 3000, | |
| "cross_fitting_folds": 5, | |
| "structural_truth": "known heterogeneous individual treatment effects", | |
| "summary": { | |
| "both_correct": { | |
| "naive": { | |
| "mean_estimate": 3.1123144027184075, | |
| "bias": 1.110939263534936, | |
| "mean_absolute_error": 1.110939263534936, | |
| "rmse": 1.1132682867094192 | |
| }, | |
| "ipw": { | |
| "mean_estimate": 2.005159416540855, | |
| "bias": 0.0037842773573832744, | |
| "mean_absolute_error": 0.0643549025548575, | |
| "rmse": 0.07985124612336089 | |
| }, | |
| "outcome_regression": { | |
| "mean_estimate": 2.0031127881794304, | |
| "bias": 0.0017376489959579633, | |
| "mean_absolute_error": 0.038795035337436425, | |
| "rmse": 0.04801133697032812 | |
| }, | |
| "aipw": { | |
| "mean_estimate": 2.0017294974257873, | |
| "bias": 0.00035435824231527135, | |
| "mean_absolute_error": 0.04261334125461211, | |
| "rmse": 0.05444966094807796, | |
| "confidence_interval_coverage": 0.89 | |
| } | |
| }, | |
| "propensity_misspecified": { | |
| "naive": { | |
| "mean_estimate": 3.1123144027184075, | |
| "bias": 1.110939263534936, | |
| "mean_absolute_error": 1.110939263534936, | |
| "rmse": 1.1132682867094192 | |
| }, | |
| "ipw": { | |
| "mean_estimate": 2.1339948243616265, | |
| "bias": 0.13261968517815434, | |
| "mean_absolute_error": 0.1341636821632256, | |
| "rmse": 0.14885056735045618 | |
| }, | |
| "outcome_regression": { | |
| "mean_estimate": 2.0031127881794304, | |
| "bias": 0.0017376489959579633, | |
| "mean_absolute_error": 0.038795035337436425, | |
| "rmse": 0.04801133697032812 | |
| }, | |
| "aipw": { | |
| "mean_estimate": 2.002138366914246, | |
| "bias": 0.0007632277307738455, | |
| "mean_absolute_error": 0.04142272629021512, | |
| "rmse": 0.05271409176654249, | |
| "confidence_interval_coverage": 0.92 | |
| } | |
| }, | |
| "outcome_misspecified": { | |
| "naive": { | |
| "mean_estimate": 3.1123144027184075, | |
| "bias": 1.110939263534936, | |
| "mean_absolute_error": 1.110939263534936, | |
| "rmse": 1.1132682867094192 | |
| }, | |
| "ipw": { | |
| "mean_estimate": 2.005159416540855, | |
| "bias": 0.0037842773573832744, | |
| "mean_absolute_error": 0.0643549025548575, | |
| "rmse": 0.07985124612336089 | |
| }, | |
| "outcome_regression": { | |
| "mean_estimate": 2.2701977886081592, | |
| "bias": 0.26882264942468725, | |
| "mean_absolute_error": 0.26882264942468725, | |
| "rmse": 0.2753485792353652 | |
| }, | |
| "aipw": { | |
| "mean_estimate": 2.009154042503896, | |
| "bias": 0.007778903320424111, | |
| "mean_absolute_error": 0.048137374861682396, | |
| "rmse": 0.06166591119979539, | |
| "confidence_interval_coverage": 0.99 | |
| } | |
| }, | |
| "both_misspecified": { | |
| "naive": { | |
| "mean_estimate": 3.1123144027184075, | |
| "bias": 1.110939263534936, | |
| "mean_absolute_error": 1.110939263534936, | |
| "rmse": 1.1132682867094192 | |
| }, | |
| "ipw": { | |
| "mean_estimate": 2.1339948243616265, | |
| "bias": 0.13261968517815434, | |
| "mean_absolute_error": 0.1341636821632256, | |
| "rmse": 0.14885056735045618 | |
| }, | |
| "outcome_regression": { | |
| "mean_estimate": 2.2701977886081592, | |
| "bias": 0.26882264942468725, | |
| "mean_absolute_error": 0.26882264942468725, | |
| "rmse": 0.2753485792353652 | |
| }, | |
| "aipw": { | |
| "mean_estimate": 2.396631864687349, | |
| "bias": 0.395256725503877, | |
| "mean_absolute_error": 0.395256725503877, | |
| "rmse": 0.4048953844650616, | |
| "confidence_interval_coverage": 0.01 | |
| } | |
| } | |
| } | |
| }</pre> | |
| </section> | |
| <section class="card"> | |
| <h2>Backed-up artifact tree</h2> | |
| <input id="filter" placeholder="Filter files…" autocomplete="off"> | |
| <ul id="files"><li><code>README.md</code></li> | |
| <li><code>__pycache__/app.cpython-311.pyc</code></li> | |
| <li><code>__pycache__/causal.cpython-311.pyc</code></li> | |
| <li><code>app.py</code></li> | |
| <li><code>artifacts/causal-forge/evaluation.json</code></li> | |
| <li><code>artifacts/causal-forge/nuisance_models.joblib</code></li> | |
| <li><code>artifacts/causal-forge/replication_estimates.parquet</code></li> | |
| <li><code>causal.py</code></li> | |
| <li><code>data/causal_benchmark.parquet</code></li> | |
| <li><code>requirements.txt</code></li> | |
| <li><code>train.py</code></li></ul> | |
| </section> | |
| </div> | |
| </main> | |
| <script> | |
| const canvas=document.querySelector('#field'),ctx=canvas.getContext('2d'); | |
| let dots=[]; | |
| function resize(){canvas.width=innerWidth;canvas.height=innerHeight; | |
| dots=Array.from({length:90},()=>({x:Math.random()*innerWidth, | |
| y:Math.random()*innerHeight,vx:(Math.random()-.5)*.35,vy:(Math.random()-.5)*.35}));} | |
| function draw(){ctx.clearRect(0,0,canvas.width,canvas.height); | |
| for(const d of dots){d.x=(d.x+d.vx+innerWidth)%innerWidth; | |
| d.y=(d.y+d.vy+innerHeight)%innerHeight;ctx.fillStyle='#65dcff99'; | |
| ctx.beginPath();ctx.arc(d.x,d.y,1.4,0,7);ctx.fill();}requestAnimationFrame(draw);} | |
| addEventListener('resize',resize);resize();draw(); | |
| document.querySelector('#filter').addEventListener('input',e=>{ | |
| const q=e.target.value.toLowerCase();for(const li of document.querySelectorAll('li')) | |
| li.hidden=!li.textContent.toLowerCase().includes(q);}); | |
| </script> | |
| </body> | |
| </html> |