When you need to understand the true impact of a business decision, policy change, or market intervention, the synthetic control method can show patterns that simpler comparisons miss. This technique constructs an artificial comparison group from your existing data, allowing you to answer the critical question: what would have happened if you hadn't taken that action? By uncovering the subtle relationships between similar units and weighting them optimally, synthetic control turns your historical data into a counterfactual you can compare against.
The synthetic control method estimates what would have happened to one treated unit (a region, store or country) without the intervention, by building a weighted average of untreated units, the donor pool, that tracks the treated unit closely before the intervention.
Synthetic outcome: Ŷ1t = Σ wj Yjt, with every weight wj ≥ 0 and the weights summing to 1, chosen to match the treated unit before treatment. The effect in each later period is the gap Y1t − Ŷ1t.
Example: if synthetic Dallas is 45% Houston, 28% Phoenix, 18% Fort Worth and 9% Austin, and those markets sell 100, 90, 110 and 95 in a post-change week, synthetic Dallas is 98.55. Actual Dallas sells 113.3, a gap of 14.75, about 15% (worked through below).
What is Synthetic Control?
The synthetic control method is a statistical technique used in causal inference to estimate the effect of an intervention when you have a single treated unit or a small number of treated units. Unlike traditional comparison methods that rely on finding a single perfect match, synthetic control creates an artificial control group by combining multiple untreated units in an optimal way.
Think of it like creating a custom benchmark. If your company launched a new marketing campaign in California (a made-up scenario), you can't simply compare California to Texas alone. Instead, synthetic control might combine, say, 40% of Texas's data, 30% of Florida's, 20% of New York's, and 10% of Illinois's to create a "synthetic California" that closely matches the real California's characteristics before the campaign launch.
The method is used in causal inference for policy evaluation and business questions such as regional pricing, and the simulated example below shows how it works on data where the true effect is known.
Key Concept: The Counterfactual
At its core, synthetic control addresses the fundamental challenge of causal inference: we can never observe what would have happened to the same unit without the intervention. This unobserved scenario is called the counterfactual. Synthetic control provides a data-driven way to estimate this counterfactual by finding the best weighted combination of similar units that didn't receive the treatment.
How Synthetic Control Differs from Other Methods
Synthetic control occupies a unique space in the causal inference toolkit. While methods like regression discontinuity require specific threshold-based interventions, and difference-in-differences assumes parallel trends, synthetic control offers flexibility when you have:
- Limited treated units: Often just one unit receives the treatment
- No natural control group: No single untreated unit provides a good comparison
- Rich pre-treatment data: Multiple time periods before the intervention
- Multiple potential controls: Several untreated units with varying similarity to the treated unit
The method shines when traditional approaches fall short. It doesn't require randomization, it's transparent about which control units matter most, and it provides a clear visual comparison between actual outcomes and the synthetic counterfactual.
Worked Example (Simulated): Recovering a Known Effect of 5.0
Question. Can nonnegative weights fitted on the pre-period recover a treatment effect we built into one unit, and how does that compare with two naive baselines?
Inputs. Simulated data, seed 11. One treated unit and 15 donor units observed for 30 pre-period and 10 post-period time points. Every unit is driven by two shared latent factors with its own loadings, plus noise (sd 0.3) and a level of 50. The true effect built into the treated unit is +5.0 in every post-period point.
Method. Fit donor weights with scipy.optimize.minimize (SLSQP), constrained to be nonnegative and to sum to 1, by minimizing squared pre-period error. Estimate the effect as the average post-period gap between the treated unit and the weighted donor series. Baselines: the treated unit's own post minus pre average, and the treated unit minus the plain donor average.
import numpy as np
from scipy.optimize import minimize
rng = np.random.default_rng(11)
T0, T1, J, TRUE = 30, 10, 15, 5.0
f = rng.normal(0, 1, (T0 + T1, 2)) # two shared latent factors
load = rng.normal(0, 1, (J + 1, 2))
Y = f @ load.T + rng.normal(0, 0.3, (T0 + T1, J + 1)) + 50
Y[T0:, 0] += TRUE # treated unit is column 0
y, D = Y[:, 0], Y[:, 1:]
def loss(w):
return np.sum((y[:T0] - D[:T0] @ w) ** 2)
w0 = np.full(J, 1 / J)
res = minimize(loss, w0, method="SLSQP", bounds=[(0, 1)] * J,
constraints={"type": "eq", "fun": lambda w: w.sum() - 1})
w = res.x
synth = D @ w
rmse = np.sqrt(np.mean((y[:T0] - synth[:T0]) ** 2))
est = np.mean(y[T0:] - synth[T0:])
naive = np.mean(y[T0:]) - np.mean(y[:T0])
avg = np.mean(y[T0:] - D[T0:].mean(axis=1))
print("donors with weight > 0.01:", int((w > 0.01).sum()), "of", J)
print("weights sum:", round(w.sum(), 3), " min:", round(w.min(), 4))
print("pre-period RMSE:", round(rmse, 3))
print("true effect:", TRUE)
print("synthetic control estimate:", round(est, 3))
print("naive pre/post difference:", round(naive, 3))
print("treated minus donor average:", round(avg, 3))
Printed output:
donors with weight > 0.01: 3 of 15
weights sum: 1.0 min: 0.0
pre-period RMSE: 0.513
true effect: 5.0
synthetic control estimate: 4.769
naive pre/post difference: 5.391
treated minus donor average: 4.963
Result. The fitted weights sum to 1.0 and put more than 0.01 weight on 3 of the 15 donors. The pre-period RMSE is 0.513. The synthetic control estimate is 4.769 against a true effect of 5.0. The naive pre/post difference is 5.391 and the treated-minus-donor-average gap is 4.963. In this run the synthetic control is not the closest of the three to 5.0; the plain donor average happened to be closer, which is a reminder that one run cannot rank the methods.
Limit. This is one simulated run with one seed, so it shows how the numbers are read, not how any real data behaves. The effect is constant and the donor pool was built to contain good matches; there is no placebo test or uncertainty interval here, and the noise in the post-period is part of why the estimate is not exactly 5.0.
When to Use Synthetic Control in Your Analysis
Knowing when to deploy synthetic control is as important as knowing how to use it. This technique excels in specific scenarios where other statistical methods struggle to provide reliable estimates.
Ideal Use Cases
Consider synthetic control when your situation matches these characteristics:
Single or Few Treated Units: You're evaluating the impact of a policy change in one state, a marketing campaign in one region, or a pricing strategy in one store. A standard regression on unit-level data needs many treated units to estimate an average effect, whereas synthetic control builds a comparison for one or a few treated units from a weighted mix of untreated ones.
Clear Intervention Point: There's a specific moment when the treatment began. This could be a product launch date, a regulatory change, or when a competitor entered your market. Synthetic control requires knowing exactly when to split your pre-treatment and post-treatment periods.
Sufficient Pre-Treatment Data: You have multiple time periods of data before the intervention occurred. The more pre-treatment observations you have, the better the method can learn which combination of control units best matches your treated unit's behavior.
Available Donor Pool: You have access to data from several untreated units that could plausibly serve as comparisons. These donor units should be similar enough to the treated unit that a weighted combination could reasonably approximate its trajectory.
Real-World Business Applications
Synthetic control can be applied in several business contexts:
Market Entry Impact: When a competitor opens a location near your store, synthetic control can estimate the sales impact by creating a synthetic version of your store from other unaffected locations. The weights reveal which of your stores share the most similar customer demographics and shopping patterns.
Policy Evaluation: Companies implementing workplace policies in one division can use synthetic control to measure effects on productivity, retention, or satisfaction by comparing to a synthetic control built from other divisions.
Marketing Campaign Analysis: When testing a new advertising strategy in one geographic region, synthetic control constructs a comparison region from your other markets, revealing hidden similarities between markets that might not be obvious from simple demographic data.
Pricing Strategy Assessment: After changing prices in one market, synthetic control helps isolate the price effect from other factors by creating a synthetic market that tracks your treated market's seasonal patterns, economic conditions, and consumer trends.
When to Avoid Synthetic Control
Synthetic control isn't always the right choice. Avoid it when you have many treated units (use difference-in-differences instead), no pre-treatment data, very few potential control units, or when the intervention affects multiple units simultaneously. Also, if you need to control for many confounding variables changing over time, regression-based approaches might be more appropriate.
When you can choose who gets the campaign, a random holdout group is simpler and stronger: see how to measure incrementality.
Data Requirements: Building Your Donor Pool
The foundation of any synthetic control analysis is high-quality data structured appropriately for the method. Understanding what you need before you begin saves time and leads to more reliable results.
Essential Data Components
Panel Data Structure: You need data organized as a panel with units observed over time. Each row represents a unit-time combination. For example, if you're analyzing store sales, you need sales data for each store for each time period in your analysis window.
Outcome Variable: The metric you're trying to measure should be available for all units across all time periods. This might be sales, website traffic, customer satisfaction scores, or any quantifiable business metric. The outcome should be measured consistently across units and time.
Pre-Treatment Period: A longer pre-intervention history is better, and the right length depends on how noisy and seasonal your series is. As a rough rule of thumb (not a tested threshold), analysts often look for at least a couple of dozen periods, and enough to cover a full seasonal cycle. This pre-treatment data is crucial because it's used to determine the optimal weights for creating your synthetic control. The algorithm learns which combination of control units best matches the treated unit's historical patterns.
Predictor Variables: These are characteristics that help match the treated unit to control units. They might include demographic variables, economic indicators, seasonal patterns, or any factors that influence your outcome. Good predictors are strongly related to the outcome and stable over time.
Constructing an Effective Donor Pool
Your donor pool consists of the untreated units available to construct the synthetic control. The quality of your donor pool directly impacts the reliability of your results, and this is where hidden patterns begin to emerge.
Size Considerations: The number of donor units needed depends on how well the donors can match the treated unit; a handful of well-matched donors can beat dozens of poor ones, and a larger pool gives the optimizer more combinations to try. There is no fixed minimum. Too few donor units limit the algorithm's ability to find a good match. However, including units that are clearly dissimilar can actually hurt performance.
Similarity Requirements: Donor units should plausibly be able to approximate the treated unit. If you're analyzing a large urban store, including tiny rural locations in your donor pool may not help. The algorithm might assign them zero weight, but it's better to exclude obviously inappropriate units from the start.
No Interference: Control units must not be affected by the treatment. If your intervention could have spillover effects (like a marketing campaign that reaches neighboring regions), those affected units should be excluded from the donor pool.
Data Quality: All donor pool units need complete data for the same time periods. Missing data requires either imputation or exclusion. Inconsistent measurement or data quality issues in the donor pool will produce unreliable synthetic controls.
Uncovering Hidden Patterns in Your Donor Pool
The weights assigned to donor units often reveal surprising insights about your business. You might discover that a store in a demographically different region actually shares very similar sales patterns with your treated unit, suggesting hidden similarities in customer behavior or market dynamics that weren't apparent from simple descriptive statistics.
Setting Up Your Synthetic Control Analysis
Implementing synthetic control requires careful setup and attention to methodological details. This section walks through the practical steps of conducting the analysis, with emphasis on decisions that impact your results.
Step 1: Define Your Treatment and Time Periods
Begin by clearly identifying when the intervention occurred. This becomes your treatment date, which splits your data into pre-treatment and post-treatment periods. Be precise: if a policy took effect on March 15, that's your cutoff, not March 1.
Your pre-treatment period should be long enough to capture typical patterns and seasonality. If your business has strong quarterly cycles, include at least several full quarters. The post-treatment period should be long enough to observe the intervention's effects but not so long that other major changes confound your analysis.
Step 2: Select and Prepare Your Variables
Choose predictor variables that are both important for your outcome and available across all units. These typically fall into two categories:
Pre-treatment outcome values: Including several pre-treatment values of your outcome variable (like sales in specific prior periods) helps ensure the synthetic control matches the treated unit's trajectory, not just its average level.
Covariates: These are other characteristics that influence the outcome. For a retail analysis, this might include store size, local income levels, competition density, or seasonal weather patterns. Choose covariates that are measured before the treatment and remain stable or follow predictable patterns.
Avoid including variables that could be affected by anticipation of the treatment or that are measured after the treatment begins.
Step 3: Construct the Synthetic Control
The mathematical core of synthetic control involves solving an optimization problem to find weights that minimize the difference between the treated unit and the synthetic control during the pre-treatment period. While the mathematics can be complex, most modern statistical software handles this automatically.
Here's a conceptual overview of what happens:
# Pseudo-code for synthetic control construction
1. Define pre-treatment period predictors (X) for treated unit
2. Define same predictors (X) for all donor pool units
3. Optimize weights (W) to minimize ||X_treated - X_donors * W||
4. Apply constraints: weights sum to 1, all weights >= 0
5. Use resulting weights to create synthetic outcome
The algorithm finds the combination of donor units that best reproduces the treated unit's characteristics before the intervention. These weights then apply to the outcome variable to generate the synthetic control's predicted trajectory.
Step 4: Validate the Pre-Treatment Fit
Before trusting your results, examine how well the synthetic control matches the treated unit during the pre-treatment period. Plot both series and calculate the mean squared prediction error (MSPE) for this period.
A good fit shows the synthetic control closely tracking the treated unit's outcomes before the intervention. If the fit is poor, the synthetic control isn't successfully replicating the treated unit's behavior, and post-treatment comparisons become unreliable. Poor fit might indicate that your donor pool lacks suitable matches or that your predictor variables don't capture important dynamics.
Examining this fit often reveals hidden patterns in your data. You might discover that the treated unit's trajectory was actually quite different from what you assumed, or that certain time periods show unusual deviations that warrant investigation.
Step 5: Estimate the Treatment Effect
Once you've checked the pre-treatment fit, the treatment effect is simply the difference between the actual treated unit and the synthetic control in the post-treatment period. This gap represents your estimate of the intervention's causal impact.
Calculate this gap for each post-treatment time period. You can then aggregate these gaps to estimate the average treatment effect, or examine how the effect evolves over time. Some interventions show immediate impacts, while others build gradually or fade after an initial surge.
Interpreting Synthetic Control Results and Weights
Understanding what your synthetic control analysis tells you requires looking beyond the headline treatment effect. The richest insights often come from examining the weights, pre-treatment fit, and temporal patterns in the estimated effects.
Reading the Treatment Effect Plot
The standard synthetic control visualization shows two lines: the actual treated unit's outcome and the synthetic control's outcome. During the pre-treatment period, these lines should track closely together. After the intervention, any divergence represents the estimated treatment effect.
Look for several key features in this plot:
Pre-treatment fit quality: How closely do the lines match before treatment? Perfect alignment isn't necessary, but systematic deviations suggest problems with your synthetic control.
Treatment effect timing: Does the gap between the lines appear immediately at the intervention date, or does it develop gradually? Immediate effects suggest direct causal impacts, while gradual divergence might indicate spillover effects or adjustment periods.
Effect persistence: Does the treatment effect remain stable, grow over time, or fade? Temporary effects might indicate short-term responses or adaptation, while persistent effects suggest sustained impact.
Effect magnitude: Is the gap large relative to typical fluctuations? Small effects might be real but could also be difficult to distinguish from noise.
Uncovering Hidden Patterns Through Weight Analysis
The weights assigned to donor pool units provide deep insights into the structure of your data. These weights reveal which units best match your treated unit's characteristics and can expose relationships you might not have anticipated.
Many donor units may receive zero weight, as in the simulated examples on this page. The algorithm focuses on the most relevant comparisons. The units receiving positive weights are the ones that contribute to your synthetic control.
Examining these weights can reveal:
Unexpected similarities: A donor unit you thought was very different might receive high weight, indicating hidden similarities in how it responds to market conditions, seasonal patterns, or other dynamics.
Geographic patterns: Do nearby units receive more weight, or do distant units with similar characteristics matter more? This tells you whether proximity or intrinsic characteristics drive similarity.
Temporal stability: Units that closely match your treated unit's trajectory likely share similar underlying processes, even if their characteristics differ superficially.
Validation of domain knowledge: Do the units receiving high weight make sense given what you know about your business? If unexpected units dominate, investigate whether data issues or genuine insights are driving the results.
Practical Weight Interpretation Example
Suppose you're analyzing a marketing campaign in Chicago, and your synthetic control assigns 60% weight to Seattle, 30% to Denver, and 10% to Portland. This tells you that these three cities' combination best reproduces Chicago's pre-treatment patterns. The heavy weight on Seattle suggests it shares Chicago's market dynamics more than geographically closer cities. This insight might inform future campaign rollouts or market segmentation strategies.
Statistical Inference and Uncertainty
Unlike traditional regression methods, synthetic control doesn't produce standard errors through conventional means. Instead, you can assess the reliability of your findings through permutation-based inference, also called placebo tests.
The logic is straightforward: apply the same synthetic control method to donor pool units as if they received the treatment. If your treated unit shows a much larger effect than these placebo units, your finding is more credible. If many placebo units show similar or larger effects, your result might reflect random variation rather than a true treatment effect.
This approach provides a distribution of "effects" under the null hypothesis of no treatment. You can then assess where your actual treatment effect falls in this distribution. A treatment effect far out in the tail of that distribution is evidence against the no-effect null; the smallest possible p-value depends on how many donors you have.
Worked Example on Simulated Data: Recovering a Known Effect
The code below is complete and self-contained. It simulates weekly sales for 16 regions (one treated, 15 donors) with a shared seasonal trend, region-specific loadings and noise, then multiplies the treated region's post-change weeks by 1.15 to inject a known +15% effect. Because the true effect is known, we can check whether synthetic control recovers it. The data is simulated, not real sales, and the output below came from Python 3.14 with NumPy 2.3.5 and SciPy 1.16.3 (default_rng(42)).
import numpy as np
from scipy.optimize import minimize
rng = np.random.default_rng(42)
n_donors, pre, post = 15, 26, 26
total = pre + post
t = np.arange(total)
# Simulate 16 regions: shared seasonal trend, region-specific loadings, noise
trend = 100 + 0.3 * t + 8 * np.sin(2 * np.pi * t / 52)
cycle = 3 * np.cos(2 * np.pi * t / 13)
load1 = rng.uniform(0.7, 1.3, n_donors + 1)
load2 = rng.uniform(-1, 1, n_donors + 1)
Y = np.outer(trend, load1) + np.outer(cycle, 3 * load2) \
+ rng.normal(0, 1.0, (total, n_donors + 1))
Y = Y / Y[:pre].mean(axis=0) * 100 # scale each region to 100 pre-change
treated, donors = Y[:, 0].copy(), Y[:, 1:]
treated[pre:] *= 1.15 # inject a known +15% effect
def fit_weights(y, D):
"""Non-negative weights summing to 1 that best match y over the pre period."""
k = D.shape[1]
loss = lambda w: np.sum((y[:pre] - D[:pre] @ w) ** 2)
res = minimize(loss, np.ones(k) / k, method="SLSQP",
bounds=[(0, 1)] * k,
constraints={"type": "eq", "fun": lambda w: w.sum() - 1},
options={"maxiter": 500, "ftol": 1e-12})
return res.x
def rmspe(a, b):
return np.sqrt(np.mean((a - b) ** 2))
w = fit_weights(treated, donors)
synthetic = donors @ w
ratio = rmspe(treated[pre:], synthetic[pre:]) / rmspe(treated[:pre], synthetic[:pre])
gap = (treated[pre:] / synthetic[pre:] - 1).mean()
print(f"donors with weight > 1%: {(w > 0.01).sum()} of {n_donors}")
print(f"pre-period RMSPE: {rmspe(treated[:pre], synthetic[:pre]):.2f}")
print(f"average post-period gap: {gap:+.1%}")
# Placebo test: pretend each donor was treated, using the other 14 as its pool
ratios = [ratio]
for j in range(n_donors):
y, D = donors[:, j], np.delete(donors, j, axis=1)
s = D @ fit_weights(y, D)
ratios.append(rmspe(y[pre:], s[pre:]) / rmspe(y[:pre], s[:pre]))
ratios = np.array(ratios)
print(f"post/pre RMSPE ratio, treated: {ratios[0]:.1f}")
print(f"post/pre RMSPE ratio, largest placebo: {ratios[1:].max():.2f}")
print(f"rank-based p-value: {(ratios >= ratios[0]).mean():.4f}")
donors with weight > 1%: 9 of 15
pre-period RMSPE: 0.44
average post-period gap: +14.9%
post/pre RMSPE ratio, treated: 33.0
post/pre RMSPE ratio, largest placebo: 1.75
rank-based p-value: 0.0625
- Fit: the optimizer spreads weight over 9 of the 15 donors, and the synthetic region tracks the treated region closely before the change (pre-period RMSPE 0.44 on a series scaled to about 100).
- Effect: the average post-change gap is +14.9%, close to the injected +15%. The gap is not exactly 15% because the synthetic control is itself estimated from noisy data.
- Placebo test: the treated region's post/pre RMSPE ratio is 33.0, against 1.75 for the largest of the 15 placebo regions. The treated region ranks first of 16, so the rank-based p-value is 1/16 = 0.0625, the smallest value this design can give. A tidy result like this needs a large effect; a small true effect would be indistinguishable from the placebos.
- What this does not show: the simulated donors were built to share the treated region's trend, so a good match was always available. Real donor pools may not have one, which is why you check the pre-period fit before trusting any gap.
Hypothetical Example: Analyzing a Regional Price Change
Let's walk through an example to illustrate how synthetic control works in practice. The retailer, the regions and every figure in this section are hypothetical, invented to show the steps; the reproducible worked analysis with real code and output follows it. Suppose you're a retail analytics manager, and your company reduced prices by 10% in the Dallas region on July 1 to test demand elasticity. You want to estimate the causal effect on sales.
Setting Up the Analysis
You have weekly sales data for Dallas and 15 other similar-sized regional markets from January through December. The intervention occurred at the start of July, giving you 26 weeks of pre-treatment data and 26 weeks of post-treatment data.
Your donor pool consists of the 15 regions that didn't experience price changes: Houston, Phoenix, Philadelphia, San Antonio, San Diego, San Jose, Austin, Jacksonville, Fort Worth, Columbus, Charlotte, Indianapolis, Seattle, Denver, and Boston.
Your predictor variables include:
- Average sales in each of the four quarters before the intervention
- Market population
- Median household income
- Number of competitor stores in the region
- Average temperature (affects shopping patterns)
Constructing the Synthetic Dallas
Suppose running the synthetic control algorithm produced these weights:
- Houston: 45%
- Phoenix: 28%
- Fort Worth: 18%
- Austin: 9%
- All other regions: 0%
To see how the weights produce the counterfactual, take one post-change week (illustrative sales index):
| Donor region | Weight | Week-30 sales | Weight × sales |
|---|---|---|---|
| Houston | 45% | 100 | 45.00 |
| Phoenix | 28% | 90 | 25.20 |
| Fort Worth | 18% | 110 | 19.80 |
| Austin | 9% | 95 | 8.55 |
| Synthetic Dallas | 100% | 98.55 | |
| Actual Dallas | 113.3 (gap 14.75, +15%) |
These weights reveal hidden patterns in your regional data. Houston receives the highest weight, which makes sense given geographic proximity and similar market characteristics. But Phoenix, despite being in a very different climate, receives substantial weight because it shares Dallas's suburban growth patterns and customer demographics. Fort Worth and Austin round out the synthetic control, capturing additional local market dynamics.
Evaluating Pre-Treatment Fit
Plotting Dallas's actual sales against the synthetic control for the 26 pre-treatment weeks would show close alignment, with a small mean squared prediction error and no systematic deviations. A fit like that would increase confidence that the synthetic control provides a good counterfactual.
Estimating the Treatment Effect
After the July 1 price reduction, Dallas's actual sales diverge upward from the synthetic control. Suppose the average gap over the 26 post-treatment weeks showed sales about 15% above the counterfactual.
In this hypothetical, a 10% price reduction followed by 15% higher sales would imply a price elasticity of demand around -1.5 (a 1% price decrease leads to a 1.5% quantity increase), provided sales are measured in units rather than revenue. This is valuable information for pricing strategy across other markets.
Validating Through Placebo Tests
To assess whether this 15% effect is statistically meaningful, you conduct placebo tests by applying the same method to each donor pool region. If most placebo regions showed small, inconsistent "effects" while Dallas's was the largest, that would support the conclusion that the price reduction increased sales rather than reflecting random variation. With 15 placebo regions plus Dallas, the smallest possible rank-based p-value is 1/16 = 0.0625, so even the most extreme result cannot clear 0.05 with a pool this small.
Best Practices for Implementing Synthetic Control
Following established best practices helps ensure your synthetic control analysis produces reliable, actionable insights. Here are key recommendations.
Design and Data Preparation
Maximize pre-treatment periods: More pre-treatment observations allow better matching and more reliable weight estimates. How many periods you need depends on how noisy the series is, and you may need more if it has seasonal or cyclical patterns.
Choose predictors wisely: Include variables that strongly influence your outcome and show variation across units. Avoid variables measured after the treatment or that could be affected by anticipation of the treatment. The outcome variable's own lags are often among the most important predictors.
Curate your donor pool: Quality trumps quantity. Including clearly inappropriate control units doesn't help and can sometimes hurt. Remove units affected by the intervention through spillovers, units with obviously different characteristics, or units with data quality issues.
Document your decisions: Keep clear records of how you defined the treatment timing, why you included or excluded certain donors, and what predictor variables you chose. Transparency about these choices builds credibility and facilitates sensitivity analysis.
Analysis and Validation
Always validate pre-treatment fit: Never skip this step. If the synthetic control doesn't match the treated unit well before the intervention, post-treatment comparisons are meaningless. Poor pre-treatment fit indicates you need to revise your approach, perhaps adjusting predictors, refining the donor pool, or reconsidering whether synthetic control is appropriate for your data.
Conduct placebo tests: These in-space placebos, where you apply the method to donor units, provide crucial evidence about whether your finding is unusual or could easily arise by chance. You can also conduct in-time placebos by pretending the intervention occurred at an earlier date when you know no intervention actually happened.
Test sensitivity: Try alternative specifications: different predictor variables, different donor pool compositions, different optimization approaches. If your main finding is robust across reasonable alternatives, it's more credible. If small changes produce dramatically different results, investigate why.
Examine weights for reasonableness: Do the units receiving high weights make sense? If a unit you know is very different receives high weight, investigate whether this reveals genuine hidden similarities or indicates data issues.
Interpretation and Communication
Focus on the graph: The treatment effect plot is your most powerful communication tool. A clear visual showing pre-treatment fit and post-treatment divergence is often more persuasive than tables of numbers.
Explain the counterfactual: Help your audience understand that the synthetic control represents "what would have happened without the intervention." This counterfactual thinking isn't always intuitive, so clear explanation is important.
Acknowledge limitations: Be transparent about assumptions, data limitations, and potential threats to validity. Discussing these proactively builds trust and demonstrates methodological sophistication.
Connect to business decisions: Translate your statistical findings into actionable insights. What does the estimated treatment effect mean for future decisions? What hidden patterns in the weights inform strategy? How confident should decision-makers be in the results?
Common Pitfalls to Avoid
Watch out for these frequent mistakes: using too few pre-treatment periods, including units in the donor pool that were affected by the intervention, choosing predictors that are themselves affected by the treatment, interpreting results when pre-treatment fit is poor, and failing to conduct robustness checks. Each of these can severely compromise your analysis.
Related Causal Inference Techniques
Synthetic control is one of several powerful methods for causal inference. Understanding when to use synthetic control versus alternative approaches helps you choose the right tool for each analytical challenge.
Synthetic Control vs Difference-in-Differences vs Interrupted Time Series
| Synthetic control | Difference-in-differences | Interrupted time series | |
|---|---|---|---|
| Treated units | One, or a few | Usually several | One |
| Comparison | A weighted mix of untreated units, fitted to the pre-period | An existing control group, unweighted | The treated unit's own pre-period trend |
| Key assumption | The mix that tracked the unit before would have kept tracking it | Parallel trends between treated and control groups | The pre-period trend would have continued |
| Inference | Placebo tests on donor units | Standard errors (clustered) | Segmented regression standard errors |
| Needs | A long pre-period and a donor pool not touched by the change | Pre- and post-periods for both groups | Many time points before and after |
Difference-in-Differences (DiD)
Difference-in-differences compares the change in outcomes over time between a treated group and a control group. It requires that treatment and control groups would have followed parallel trends absent the intervention. DiD works well when you have many treated units and a clear control group, but it doesn't reveal which control units are most similar to treated units the way synthetic control weights do.
Choose DiD when you have multiple treated units or when parallel trends seem plausible. Choose synthetic control when you have one or few treated units and want to construct an optimal comparison from multiple potential controls.
Regression Discontinuity Design
Regression discontinuity exploits situations where treatment assignment is determined by whether a running variable crosses a threshold. For example, analyzing outcomes for students who barely passed versus barely failed an exam cutoff.
Regression discontinuity can support strong causal claims when its assumptions hold, but requires the specific discontinuity structure. Synthetic control is more flexible regarding how treatment is assigned but requires a clear pre-treatment period and suitable donor pool.
Matching Methods
Matching methods pair treated units with similar control units based on observable characteristics. They are used in observational studies with many treated and control units.
Synthetic control can be viewed as an advanced matching method that creates optimal weighted combinations rather than selecting discrete matches. It may suit aggregate or geographic units better than individual-level data.
Interrupted Time Series
Interrupted time series analysis examines whether a time series shows a change in level or trend at an intervention point. It uses only the treated unit's data, modeling what would have happened by extrapolating pre-intervention trends.
Synthetic control can provide a more credible counterfactual than extrapolation because it uses actual control unit data. However, interrupted time series can work when no suitable control units exist.
Combining Methods
These methods aren't mutually exclusive. You might use synthetic control as your primary analysis and difference-in-differences as a robustness check, or combine insights from multiple approaches to triangulate your estimate. Cross-method validation strengthens confidence in your findings.
Advanced Topics and Extensions
As synthetic control has gained popularity, researchers have developed extensions that address limitations and expand the method's applicability.
Matrix Completion Methods
Recent advances use matrix completion approaches that allow for multiple treated units at different times and can handle staggered intervention rollouts. These methods maintain synthetic control's core logic while expanding flexibility.
Augmented Synthetic Control
Augmented synthetic control adds a regression adjustment to address potential bias when pre-treatment fit is imperfect. This can improve estimates when the donor pool doesn't contain units similar enough to perfectly reproduce the treated unit's characteristics.
Bayesian Synthetic Control
Bayesian approaches provide a framework for incorporating prior information and quantifying uncertainty through posterior distributions rather than relying solely on permutation-based inference.
Time-Varying Treatments
Standard synthetic control assumes a permanent, one-time intervention. Extensions handle treatments that turn on and off or vary in intensity over time, though these scenarios add complexity to the analysis and interpretation.
Conclusion: Unlocking Hidden Insights Through Synthetic Control
Synthetic control is one way to approach causal questions when randomized experiments aren't feasible. By constructing a comparison unit from available data, the method shows how your business units, markets, or policies relate to each other.
The technique is transparent. The weights show exactly which control units matter and how much they contribute. The pre-treatment fit can be checked visually. The treatment effect plot clearly communicates both the estimated impact and the uncertainty around it.
Synthetic control can also surface information beyond the headline treatment effect. Discovering that a seemingly different market actually shares your treated unit's dynamics, or learning which combination of characteristics best predicts outcomes, can inform strategy well beyond the specific intervention you're analyzing.
As you implement synthetic control in your organization, remember that the method's success depends on thoughtful application. Invest time in understanding your data, carefully constructing your donor pool, and validating your results. The hidden patterns you uncover through this rigorous approach will drive better, more confident decision-making across your business.
Your turn
Bring your own data and the question you actually need answered.
MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai
Frequently Asked Questions
What is the synthetic control method?
The synthetic control method is a statistical technique that creates an artificial comparison group by combining data from multiple untreated units. It constructs a weighted average of control units that closely mimics the treated unit's characteristics before an intervention, allowing you to estimate what would have happened without the intervention.
When should I use synthetic control instead of other methods?
Use synthetic control when you have one or few treated units, a single intervention point in time, parallel pre-treatment trends are uncertain, and multiple control units with similar characteristics. It's ideal for policy evaluations, market entry analysis, and situations where traditional methods like difference-in-differences may not be appropriate.
How many control units do I need for synthetic control?
There is no fixed minimum number of control units. What matters is whether a weighted combination of them can reproduce the treated unit's pre-intervention path: a handful of well-matched donors can work, and a larger pool gives the method more combinations to try. The quality of your donor pool matters more than quantity: you need units that share similar characteristics and trends with your treated unit during the pre-intervention period.
How do I interpret synthetic control weights?
Synthetic control weights show the contribution of each control unit to your synthetic comparison. Higher weights indicate units that better match the treated unit's pre-intervention characteristics. Examining these weights reveals hidden patterns about which units are most similar and helps validate that your synthetic control is reasonable.
What are the main assumptions of synthetic control?
The key assumptions are: the intervention affects only the treated unit (no spillover effects), the donor pool was not affected by the intervention, the post-intervention period doesn't experience extreme shocks that would affect units differently, and the relationship between predictors and outcome is stable over time.
What is a synthetic control group?
It is the comparison group the method builds: a weighted average of untreated units whose combined outcomes match the treated unit before the intervention. Weights are non-negative and sum to one, so the synthetic control is a blend of real units, and the blend shows exactly which units drive the comparison. After the intervention, the gap between the treated unit and its synthetic control is the estimated effect.
What is a well-known example of the synthetic control method?
Published studies have applied the method to questions such as the effect of a state tobacco control program and the economic cost of terrorism in a region. This page does not cite those studies, so read the original papers for their data and results. For a re-runnable example, see the simulated worked examples on this page.