/** Uniform-vs-concentrated analysis as a relative-risk heatmap per stratum. */ import Box from '@mui/material/Box'; import Chip from '@mui/material/Chip'; import Paper from '@mui/material/Paper'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import type { ConcentrationAnalysis } from '../../types/agentic'; import { fmtCi, fmtRate, PanelTitle } from './common'; function riskColor(rr: number | null): string { if (rr === null) return '#37474f'; if (rr >= 10) return '#b71c1c'; if (rr >= 3) return '#d84315'; if (rr >= 1.5) return '#ef6c00'; if (rr >= 0.75) return '#37474f'; return '#1b5e20'; } export default function ConcentrationHeatmap({ conc }: { conc: ConcentrationAnalysis }) { const byDim = new Map(); for (const s of conc.strata) { byDim.set(s.dimension, [...(byDim.get(s.dimension) ?? []), s]); } return ( } /> {conc.concentrated_dimensions.length > 0 ? ( Concentrated in: {conc.concentrated_dimensions.join(', ')} ) : null} {[...byDim.entries()].map(([dim, strata]) => ( {dim} {strata.map((s) => (
rate {fmtRate(s.stratum_rate)} vs population {fmtRate(s.baseline_rate)}
events {s.events} / exposure {s.exposure.toLocaleString()} ({(s.exposure_share * 100).toFixed(1)}%)
odds ratio {s.odds_ratio ?? '—'} · risk diff {fmtRate(s.risk_difference)}
rate CI {fmtCi(s.rate_wilson_ci)}
{s.small_sample_flag ?
⚠ small-sample: estimate unstable
: null}
} > {s.stratum} RR {s.relative_risk === null ? '—' : s.relative_risk.toFixed(1)} {s.small_sample_flag ? ' ⚠' : ''} ))}
))} {conc.method}
); }