diff --git a/app/src/Router.tsx b/app/src/Router.tsx
index 06beac16b..47cc49106 100644
--- a/app/src/Router.tsx
+++ b/app/src/Router.tsx
@@ -7,6 +7,7 @@ import BlogPage from './pages/Blog.page';
import DashboardPage from './pages/Dashboard.page';
import DonatePage from './pages/Donate.page';
import HomePage from './pages/Home.page';
+import MicrosimPage from './pages/Microsim.page';
import PoliciesPage from './pages/Policies.page';
import PopulationsPage from './pages/Populations.page';
import PrivacyPage from './pages/Privacy.page';
@@ -156,6 +157,10 @@ const router = createBrowserRouter(
path: 'support',
element:
Support page
,
},
+ {
+ path: 'microsim',
+ element: ,
+ },
{
path: 'research',
element: ,
diff --git a/app/src/images/posts/how-machine-learning-tools-make-policyengine-more-accurate.png b/app/src/images/posts/how-machine-learning-tools-make-policyengine-more-accurate.png
new file mode 100644
index 000000000..ed9eb6210
Binary files /dev/null and b/app/src/images/posts/how-machine-learning-tools-make-policyengine-more-accurate.png differ
diff --git a/app/src/pages/Microsim.page.tsx b/app/src/pages/Microsim.page.tsx
new file mode 100644
index 000000000..da7b36ed8
--- /dev/null
+++ b/app/src/pages/Microsim.page.tsx
@@ -0,0 +1,232 @@
+import { useNavigate } from 'react-router-dom';
+import { Box, Container, List, Text, Title } from '@mantine/core';
+import CalloutWithImage from '@/components/shared/static/CalloutWithImage';
+import { CardsWithHeader } from '@/components/shared/static/CardsWithHeader';
+import HeroSection from '@/components/shared/static/HeroSection';
+import StaticPageLayout from '@/components/shared/static/StaticPageLayout';
+import { TitleCardWithHeader } from '@/components/shared/static/TextCardWithHeader';
+import TwoColumnView from '@/components/TwoColumnView';
+import { useCurrentCountry } from '@/hooks/useCurrentCountry';
+import heroImage from '@/images/posts/how-machine-learning-tools-make-policyengine-more-accurate.png';
+
+export default function MicrosimPage() {
+ const navigate = useNavigate();
+ const countryId = useCurrentCountry();
+ const isUK = countryId === 'uk';
+ const optimize = isUK ? 'optimise' : 'optimize';
+ const analyze = isUK ? 'analyse' : 'analyze';
+ const modeling = isUK ? 'modelling' : 'modeling';
+
+ return (
+
+
+
+
+ countryId && navigate(`/${countryId}/policies`)}
+ imageSrc={heroImage}
+ imageAlt="Diagram showing PolicyEngine microsimulation"
+ />
+
+
+
+
+
+ Microsimulation is a computational technique used to estimate the effects of
+ policy changes on individuals, households, or other microeconomic units.
+ Unlike macroeconomic models that focus on aggregate variables, microsimulation
+ models:
+
+
+
+
+ Apply tax and benefit rules to representative samples of the population
+
+
+ Calculate outcomes for each household based on their unique characteristics
+
+ Aggregate results to estimate population-wide impacts
+
+ Allow for detailed distributional analysis by income, demographic groups,
+ and more
+
+
+
+
+ PolicyEngine’s microsimulation models implement tax and benefit systems as
+ code, allowing users to modify parameters and see how changes affect different
+ households and the overall population.
+
+ >
+ ),
+ },
+ ]}
+ />
+
+
+
+
+
+ Open-source foundation
+
+
+ PolicyEngine builds on OpenFisca, an open-source microsimulation framework
+ developed by the French government. Our models implement tax and benefit rules as
+ code, creating a computational representation of current policy and allowing for
+ modifications to explore reform impacts.
+
+
+
+ Data-driven approach
+
+
+ Our models use nationally representative household surveys enhanced with
+ administrative data to create accurate population samples:
+
+
+
+ UK: Family Resources Survey with custom survey weights
+
+
+ US: Enhanced Current Population Survey with synthetic tax records
+
+
+
+
+ Machine learning enhancement
+
+
+ We apply machine learning techniques to {optimize} our population samples:
+
+
+
+ Gradient descent algorithms to calibrate survey weights to match administrative
+ totals
+
+
+ Quantile regression forests to synthesize missing tax information for US data
+
+ Statistical validation against administrative benchmarks
+
+ >
+ }
+ rightColumn={
+
+ }
+ />
+
+
+
+
+
+ PolicyEngine continuously validates our models against administrative data to
+ ensure accuracy:
+
+
+
+
+ Aggregate tax and benefit totals compared to government budget figures
+
+
+ Distributional impacts validated against administrative statistics
+
+
+ Tax and benefit calculators tested against official examples
+
+
+ Ongoing calibration to match the latest data from government sources
+
+
+
+
+ Our UK model has achieved up to 80% lower aggregate error rates compared to
+ standard survey-based approaches, and our US Enhanced CPS represents a
+ significant improvement over public microdata for tax {modeling}.
+
+ >
+ ),
+ },
+ ]}
+ />
+
+
+
+ {
+ e?.stopPropagation();
+ window.open(
+ `/${countryId}/research/enhanced-cps-beta`,
+ '_blank',
+ 'noopener,noreferrer'
+ );
+ }) as unknown as () => void,
+ background: 'gray',
+ },
+ {
+ title: 'UK model validation',
+ description:
+ 'Detailed information about the UK tax and benefit model, including data sources, calibration methodology, and validation results.',
+ footerText: 'UK model validation →',
+ onClick: ((e: React.MouseEvent | undefined) => {
+ e?.stopPropagation();
+ window.open(
+ `/${countryId}/research/uk-spi-validation`,
+ '_blank',
+ 'noopener,noreferrer'
+ );
+ }) as unknown as () => void,
+ background: 'gray',
+ },
+ {
+ title: 'GitHub repositories',
+ description:
+ 'Access our open-source code repositories for all PolicyEngine models, including tax-benefit rules, data processing pipelines, and web interface.',
+ footerText: 'PolicyEngine on GitHub →',
+ onClick: ((e: React.MouseEvent | undefined) => {
+ e?.stopPropagation();
+ window.open('https://github.com/PolicyEngine', '_blank', 'noopener,noreferrer');
+ }) as unknown as () => void,
+ background: 'gray',
+ },
+ ]}
+ />
+
+
+
+ );
+}