WebApps

Interactive apps to explore data and learn methods in the browser: Google Earth Engine dashboards, Streamlit apps and the companion apps of the tutorials.

geometrics — Learn app

geometrics — Learn app

New to the study of regional catching up and inequality? Learn the main ideas through plain-language explanations and small interactive examples that you can run and change yourself. It runs on Streamlit in your web browser.

geometrics — Explore app

geometrics — Explore app

Where are the richest and poorest regions, and do similar regions cluster together on the map? Map regional data, see how much neighboring regions resemble each other, and spot clusters of high and low values over time. It runs on Streamlit in your web browser.

geometrics — Analyze app

geometrics — Analyze app

Are poorer regions catching up with richer ones, and is inequality between regions falling? Measure catching up, regional inequality and how regions move between income groups, with methods that take neighboring regions into account. It runs on Streamlit in your web browser.

expdpy — Learn app

expdpy — Learn app

New to data that follow the same units over many years? Learn the main methods through plain-language explanations and small interactive examples that you can run and change yourself. It runs on Streamlit in your web browser.

expdpy — Explore app

expdpy — Explore app

What patterns hide in data that follow the same countries, firms or people over many years? Explore distributions, missing values, trends over time, and the differences between units and within each unit, with no coding needed. It runs on Streamlit in your web browser.

expdpy — Analyze app

expdpy — Analyze app

How can we measure a relationship when we observe the same countries, firms or people over many years? Fit the standard models for this kind of data, compare them with formal tests, and study what happens before and after an event or whether poorer units catch up. It runs on Streamlit in your web browser.

Split view of nighttime lights (DMSP-like) across the world 1992-2025

Split view of nighttime lights (DMSP-like) across the world 1992-2025

How has the world at night changed between two years? Pick any two years from 1992 to 2025 and compare their nighttime light maps side by side on a split screen, using a long harmonized satellite record that joins older and newer satellites. It runs on Google Earth Engine in your web browser.

Regional monthly time series of nighttime lights (VIIRS-like) 1992-2024

Regional monthly time series of nighttime lights (VIIRS-like) 1992-2024

How does nighttime brightness change from month to month across a whole region? Choose an administrative region, such as a country or province, to see its monthly nighttime light series from 1992 to 2024, using a newer, more detailed night-light series rebuilt back to 1992. It runs on Google Earth Engine in your web browser.

Regional annual time series of nighttime lights (VIIRS-like) 1992-2024

Regional annual time series of nighttime lights (VIIRS-like) 1992-2024

How has nighttime brightness changed year by year across a whole region? Choose an administrative region, such as a country or province, to see its yearly nighttime light series from 1992 to 2024, using a newer, more detailed night-light series rebuilt back to 1992. It runs on Google Earth Engine in your web browser.

Regional annual time series of nighttime lights (DMSP-like) 1992-2025

Regional annual time series of nighttime lights (DMSP-like) 1992-2025

How has a whole region grown brighter at night since 1992? Choose an administrative region, such as a country or province, to see its yearly nighttime light series up to 2025, from a long harmonized satellite record that joins older and newer satellites. It runs on Google Earth Engine in your web browser.

Localized monthly time series of nighttime lights (VIIRS-like) 1992-2024

Localized monthly time series of nighttime lights (VIIRS-like) 1992-2024

How does nighttime brightness change from month to month at a specific place? Click any point on the world map to see its monthly nighttime light series from 1992 to 2024, using a newer, more detailed night-light series rebuilt back to 1992. It runs on Google Earth Engine in your web browser.

Localized annual time series of nighttime lights (VIIRS-like) 1992-2024

Localized annual time series of nighttime lights (VIIRS-like) 1992-2024

How has nighttime brightness changed year by year at a specific place? Click any point on the world map to see its yearly nighttime light series from 1992 to 2024, using a newer, more detailed night-light series rebuilt back to 1992. It runs on Google Earth Engine in your web browser.

Localized annual time series of nighttime lights (DMSP-like) 1992-2025

Localized annual time series of nighttime lights (DMSP-like) 1992-2025

How bright have the nights been at a place you care about since 1992? Click any point on the world map to see its yearly nighttime light series up to 2025, from a long harmonized satellite record that joins older and newer satellites. It runs on Google Earth Engine in your web browser.

Regional dynamics of VIIRS-like nighttime lights 1992-2023

Regional dynamics of VIIRS-like nighttime lights 1992-2023

Which regions of the world are catching up in nighttime brightness, and which are falling behind? See how regions move up or down relative to each other from 1992 to 2023, using a newer, more detailed night-light series rebuilt back to 1992. It runs on Google Earth Engine in your web browser.

Regional dynamics of luminosity-based GDP 1992-2019

Regional dynamics of luminosity-based GDP 1992-2019

Which regions of the world are catching up in economic output, and which are falling behind? See how regions move up or down relative to each other from 1992 to 2019, using fine-grained estimates of economic output built from satellite night lights. It runs on Google Earth Engine in your web browser.

Regional dynamics of DMSP-like nighttime lights 1992-2019

Regional dynamics of DMSP-like nighttime lights 1992-2019

Which regions of the world are catching up in nighttime brightness, and which are falling behind? See how regions move up or down relative to each other from 1992 to 2019, using a long harmonized satellite record that joins older and newer satellites. It runs on Google Earth Engine in your web browser.

Space-time dynamics of nighttime lights: DMSP-like data

Space-time dynamics of nighttime lights: DMSP-like data

Where in the world did nights get brighter, and when? Browse global maps of nighttime lights over time, using a long harmonized series that joins older and newer satellites into one record starting in 1992. It runs on Google Earth Engine in your web browser.

Introduction to the Synthetic Control Method in Python with mlsynth

Introduction to the Synthetic Control Method in Python with mlsynth

How much did Proposition 99, the 1989 California tobacco program, reduce cigarette sales? This beginner Python tutorial teaches the synthetic control method, which builds a look-alike California from other states, finds about 19 fewer packs sold per person each year, and then tries hard to break that result. It comes with an interactive app that runs in your web browser.

Introduction to Panel Data Methods in Python

Introduction to Panel Data Methods in Python

Does joining a union raise wages? Following the same workers over two years in Python, we compare seven ways to analyze repeated data and see that the estimated wage gain nearly triples once each worker is compared with the same worker at another time. It comes with an interactive app that runs in your web browser.

The FWL Theorem: Making Multivariate Regressions Intuitive

The FWL Theorem: Making Multivariate Regressions Intuitive

What does it really mean to control for another factor in a regression? This Python tutorial uses a simulated fast food coupon campaign to show that any such result can be rebuilt by first removing what the other factors explain and then plotting what is left in a simple two-variable chart. It comes with an interactive app that runs in your web browser.

Covariates in Difference-in-Differences: The LaLonde Test in Python

Covariates in Difference-in-Differences: The LaLonde Test in Python

Can we still find the true effect of a job training program on earnings if we compare trainees with ordinary survey respondents instead of a randomized control group? This Python tutorial shows that adding background characteristics fixes the estimate only when they adjust the expected earnings trend of the comparison group. It comes with an interactive app that runs in your web browser.

Double LASSO for Causal Inference: Does Abortion Reduce Crime?

Double LASSO for Causal Inference: Does Abortion Reduce Crime?

Did legal abortion lower crime in the United States, as a famous 2001 study claimed? Instead of hand-picking a few control variables, we let a data-driven method choose among 284 candidates and check whether the original finding holds up. This R tutorial comes with an interactive app that runs in your web browser.

Carbon Taxes and CO2 Emissions: A Synthetic-Control Analysis in Python

Carbon Taxes and CO2 Emissions: A Synthetic-Control Analysis in Python

Did the carbon tax that Sweden introduced in 1991 cut carbon emissions from transport, and did it hurt the economy? This Python tutorial builds a look-alike Sweden from other wealthy countries and finds transport emissions about 11 percent lower each year, with no sign of slower economic growth. It comes with an interactive app that runs in your web browser.

Do Institutions Cause Prosperity? An IV Tutorial in Python

Do Institutions Cause Prosperity? An IV Tutorial in Python

Do good institutions make countries richer? This Python tutorial revisits the 2001 study by Acemoglu, Johnson and Robinson, which uses death rates of early European settlers in 64 former colonies to isolate the effect of institutions, and shows that a simple comparison understates that effect. It comes with an interactive app that runs in your web browser.

Do Institutions Cause Prosperity? An IV Tutorial in Stata

Do Institutions Cause Prosperity? An IV Tutorial in Stata

Do good institutions make countries richer? Following the 2001 study by Acemoglu, Johnson and Robinson in Stata, we use the death rates of early European settlers in 64 former colonies as a natural experiment, and find an effect much larger than a simple comparison suggests. The tutorial includes an interactive app that runs in your web browser.

Causal Machine Learning and the Resource Curse with Python EconML

Causal Machine Learning and the Resource Curse with Python EconML

Does mining wealth help or hurt local development, and do good local institutions make the difference? This Python tutorial uses causal machine learning on simulated district data with known true effects to measure how the impact of mining and mineral prices varies from place to place. It comes with an interactive app that runs in your web browser.

Causal Machine Learning and the Resource Curse with Stata 19

Causal Machine Learning and the Resource Curse with Stata 19

Does mining make places richer or poorer, and does the answer depend on the quality of government? Using simulated data that mirrors a published study, we use machine learning in Stata to estimate how the effects of mining and mineral prices on development differ from place to place. The tutorial comes with an interactive app that runs in your web browser.

A Beginner's Guide to Causal Inference with DoWhy in Python

A Beginner's Guide to Causal Inference with DoWhy in Python

Does working from home make employees more productive, or do productive people simply choose to work from home? This beginner Python tutorial uses simulated data with a known answer to show a four-step approach to cause and effect: state your assumptions, decide what to compare, estimate the effect and stress-test it. It comes with an interactive app that runs in your web browser.

MGWFER: Causal Spatially Varying Coefficients via Panel Fixed Effects

MGWFER: Causal Spatially Varying Coefficients via Panel Fixed Effects

When we measure how a relationship changes from place to place, hidden features of each place can distort the answer. This Python tutorial follows a 2026 study by Li and Fotheringham and uses simulated data on 225 places over three periods to show how following the same places over time removes that distortion. It comes with an interactive app that runs in your web browser.

Conditional Average Treatment Effects (CATE) with Stata 19

Conditional Average Treatment Effects (CATE) with Stata 19

Does access to a workplace retirement savings plan help some households build more wealth than others? Instead of reporting one average effect, we use machine learning in Stata to estimate how the effect differs across households by income and other traits. The tutorial comes with an interactive app that runs in your web browser.

Beta and Sigma Convergence Across Countries: A Stata Tutorial

Beta and Sigma Convergence Across Countries: A Stata Tutorial

Are poorer countries catching up to richer ones? Using international income data, we test whether poorer countries grow faster and whether income gaps across the world are shrinking, and we see how the answer changed after 2000. This Stata tutorial comes with an interactive app that runs in your web browser.

Basic Synthetic Control with R: The Basque Country Case Study

Basic Synthetic Control with R: The Basque Country Case Study

What did years of terrorist violence cost the economy of the Basque Country in Spain? This beginner R tutorial builds a look-alike Basque Country from other Spanish regions, mostly Catalonia and Madrid, and finds income per person roughly 8 percent lower at the widest point of the gap. It comes with an interactive app that runs in your web browser.

Introduction to Difference-in-Differences (DiD) in Python

Introduction to Difference-in-Differences (DiD) in Python

Did an after-school tutoring program really raise student grades, or were grades rising everywhere? This Python tutorial compares 10 tutored high schools with 25 others, before and after the program, to separate its effect from the general upward trend. It comes with an interactive app that runs in your web browser.

IV Estimation with Panel Data: Economic Shocks and Civil Conflict

IV Estimation with Panel Data: Economic Shocks and Civil Conflict

Does an economic downturn make civil conflict more likely? Using yearly data on more than 5,000 African regions in Stata, we treat rainfall shocks as a natural experiment for local economic activity, measured by night lights seen from space, and find that economic decline raises the risk of conflict. It comes with an interactive app that runs in your web browser.

Introduction to Difference-in-Differences (DiD) in Stata

Introduction to Difference-in-Differences (DiD) in Stata

Did an after-school tutoring program raise the grades of low-income high school students? Using simulated data on 35 schools in Stata, we compare how grades changed in schools with and without the program, and we check whether both groups were on similar paths before it started. It comes with an interactive app that runs in your web browser.

What Does TWFE Actually Do? Manual Demeaning and the FWL Theorem

What Does TWFE Actually Do? Manual Demeaning and the FWL Theorem

What does a regression that adjusts for country and year differences actually do to the data? Using simulated data for 150 countries in R, we show step by step that it equals subtracting country and year averages before a simple regression, and why the usual margins of error then need a fix. It comes with an interactive app that runs in your web browser.

Standard Errors in Panel Data: A Beginner's Guide in Python

Standard Errors in Panel Data: A Beginner's Guide in Python

How sure can we be about an estimate when the same firms are observed year after year? Using simulated data for 100 firms in Python, we compare several ways of measuring the margin of error and show that no margin of error can fix an estimate that is biased to begin with. It includes an interactive app that runs in your web browser.

Dynamic Panel BMA: Which Factors Truly Drive Economic Growth?

Dynamic Panel BMA: Which Factors Truly Drive Economic Growth?

Which factors truly drive economic growth, such as investment, education or trade? Using 73 countries over four decades, we average across every possible combination of factors instead of betting on a single model, while allowing growth itself to shape those factors. This R tutorial comes with an interactive app that runs in your web browser.

Visualizing Regression with the FWL Theorem in Stata

Visualizing Regression with the FWL Theorem in Stata

What does it really mean to control for a variable in a regression? In Stata, we turn that idea into a picture: we strip out the influence of other factors and plot what is left, using examples on store sales, airline flights and worker wages. It comes with an interactive app that runs in your web browser.

Visualizing Regression with the FWL Theorem in R

Visualizing Regression with the FWL Theorem in R

What does it really mean to control for a variable in a regression? We use a classic result from statistics to turn that idea into simple scatter plots, first with simulated data and then with real data that follows the same people over time. This R tutorial comes with an interactive app that runs in your web browser.

Difference-in-Differences for Policy Evaluation: A Tutorial using R

Difference-in-Differences for Policy Evaluation: A Tutorial using R

Did raising the minimum wage cost teenagers their jobs? Using American states that raised their wage floors at different times, we compare states before and after each increase and show why the classic shortcut can mislead when policies start on different dates. This R tutorial comes with an interactive app that runs in your web browser.

Evaluating a Cash Transfer Program (RCT) with Panel Data in Stata

Evaluating a Cash Transfer Program (RCT) with Panel Data in Stata

Does giving cash to poor households raise what they spend on everyday needs? Using a simulated randomized experiment with 2,000 households in Stata, we compare several ways of estimating the effect and see that all of them recover the true gain of about 12 percent. It comes with an interactive app that runs in your web browser.

Three Methods for Robust Variable Selection: BMA, LASSO, and WALS

Three Methods for Robust Variable Selection: BMA, LASSO, and WALS

When many factors could explain carbon emissions, which ones truly matter? Using simulated data for 120 fictional countries where the right answer is known, this R tutorial compares three methods for choosing which factors to keep and shows that factors flagged by all three are the safest bets. It comes with an interactive app that runs in your web browser.

Pooled PCA for Building Development Indicators Across Time

Pooled PCA for Building Development Indicators Across Time

How can we tell whether regions are developing over time when the measuring stick itself must stay the same? Using education, health and income data for 153 South American regions in 2013 and 2019, this Python tutorial builds one development index from both years together so that scores can be compared across time. It comes with an interactive app that runs in your web browser.

Introduction to PCA Analysis for Building Development Indicators

Introduction to PCA Analysis for Building Development Indicators

How can two health measures, life expectancy and infant mortality, be combined into one fair health score? Using simulated data for 50 countries, this Python tutorial builds the index step by step with principal component analysis, a method that finds the single direction capturing most of the shared information. It comes with an interactive app that runs in your web browser.

High-Dimensional Fixed Effects Regression: An Introduction in Python

High-Dimensional Fixed Effects Regression: An Introduction in Python

How much of the higher pay of union workers comes from the union itself, and how much from who joins? This Python tutorial shows how fixed effects, which compare each worker only with the same worker over time, remove hidden differences and cut the apparent union pay gain from about 18 to 8 percent. It comes with an interactive app that runs in your web browser.

Introduction to Difference-in-Differences in Python

Introduction to Difference-in-Differences in Python

Did a new policy really change outcomes, or were things already improving? This Python tutorial introduces the difference-in-differences method, which compares changes over time between places that got the policy and places that did not, using simulated data, and checks how solid the answer is. It comes with an interactive app that runs in your web browser.

Introduction to Machine Learning: Random Forest Regression

Introduction to Machine Learning: Random Forest Regression

Can satellite images tell us how well each municipality in Bolivia is developing? This beginner-friendly Python tutorial trains a random forest, a machine learning model that averages many decision trees, tests it on places it never saw, and finds that the images hold real but limited information. It comes with an interactive app that runs in your web browser.

Introduction to Causal Inference: Double Machine Learning

Introduction to Causal Inference: Double Machine Learning

Does a cash bonus help unemployed workers find jobs faster? This Python tutorial uses double machine learning, which lets flexible prediction models strip out the influence of background characteristics, on data from a real experiment in Pennsylvania. It comes with an interactive app that runs in your web browser.