Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Did Imputation

R-CMD-check

Codecov test coverage

Lifecycle: experimental

Estimation of staggered Difference-in-Differences using the imputation approach of Borusyak, Jaravel, and Spiess (2021). The packages allows for:

  • Multiple time periods

  • Staggered design (i.e., units are treated at different time periods)

  • Continuous controls

The package implements an imputation method to estimate the treatment effect and pre-trend testing in difference-in-differences designs with staggered adoption (i.e where units are treated at different time periods). Recent literature stress out the importance of not using the standard twoway fixed effect regression.

The standard DiD setup involves two periods and two groups (one treated and one untreated), it relies on parallel trend assumption to estimate the treatment effect of the treated. The staggered DiD setup is the generalization of this approach to multiple periods and multiple groups (i.e. individuals treated at different time periods.). Recent literature stress out the need to not use the standard two-way fixed effect (TWFE) regression to estimate those models. This package implements a method of imputation to estimate the average treatment effect. The package uses untreated observations to predict the counterfactual outcome on treated observations and provide the appropriate Standard errors. It provides ways to test for parallel trends.

Installation

You can install the github version with devtools or renv(recommended, read more about renv)

devtools::install("CdfInnovLab/didImputation")

Usage

library(didImputation)
data(did_simulated)
res<- didImputation(y0=y~0|i+t,
cohort='g',
data=did_simulated)
summary(res)
#> Event Study: imputation method. Dep. Var.: y #> Counterfactual model: y ~ 0 | i + t #> Number of cohorts: 5 #> Observations: 1500 #> |-Treated: 630 #> |-Untreated: 870 #> Estimate Std. Error t value Pr(>|t|))#> k::-4 0.058 0.228 0.256 0.798 #> k::-3 0.124 0.238 0.518 0.605 #> k::-2 0.204 0.257 0.795 0.428 #> k::-1 0.059 0.284 0.208 0.835 #> k::0 0.974 0.097 10.016 <0.001***#> k::1 2.086 0.110 18.972 <0.001***#> k::2 2.991 0.143 20.899 <0.001***#> k::3 3.981 0.189 21.046 <0.001***#> k::4 4.775 0.259 18.463 <0.001***#> ---#> Signif. Code: 0 '***' 0.01 '**' 0.05 '*' 0.1 '' 1 #> Wald stats for pre-trends:#> Wald (joint nullity): stat = 0.473843, p = 0.754974, on 4 and 860 DoF, VCOV: Clustered (i).

You can print the result easily with didplot

didplot(res)

How it works

didImputation estimates the effects of a binary treatment with staggered timing. It allows for arbitrary heterogeneity of treatment and dynamic effects.

The estimation is a three step procedures

  1. Estimate a linear model on non treated observations only (it \Omega_0) (either not-yet-treated or never-treated).

    Y_{it}(0|it \in \Omega_0) = \alpha_i + \beta_t + X_{it}'\delta + \varepsilon_{it}

  2. Impute the treated observations (it \in \Omega_1) potential outcome Y_{it}(0) and obtain treatment effect \tau_{it} by substracting the predicted outcome from step 1

    \begin{align*} \hat{Y}_{it}(0|it \in \Omega_1) &= \hat{\alpha}_i + \hat{\beta}_t + X_{it}'\hat{\delta} \\ \hat{\tau}_{it} &= Y_{it} - \hat{Y}_{it}(0) \end{align*}

  3. Average estimated treatment effects \tau_{it} to the estimand of interest.

    For the overall average treatment effect, the estimate is defined by

    \hat{\tau} = \sum_{it \in \Omega_1} \tau_{it}

TODO

  • Estimation weights
  • Triple differences
  • Vignette
  • Time invariant controls
  • Unit invariant controls
  • Custom cluster
  • Latex export
  • Allow custom period length
  • Automatic panel balance
  • Interactions in fixed effects
  • Allow weights reuse

Reference

Borusyak, K., Jaravel, X., & Spiess, J. (2021). Revisiting event study designs: Robust and efficient estimation. Working paper.

See also

didimputation: Another implementation using sparse matrix inversion.

Releases

Packages

Contributors

Languages