impute(type, [saveimp]) imputes missing values in policyvar and uses the imputed variable as the independent policy variable in estimation. type determines the imputation rule. The suboption saveimp adds the new variable to the database as policyvar_imputed. The following imputation types are available:
impute(nuchange) imputes missing values in policyvar under an assumption of no unobserved changes. It assumes that for each unit: i) The policy variable’s value is the same as the first observed value in periods before the first observed value, and ii) The policy variable’s value is the same as the last observed value in periods after the last observed value
impute(stag) imputes missing values in the policyvar under an assumption of no unobserved changes and staggered adoption. policyvar must satisfy staggered-adoption assumptions for all units: i) policyvar must be binaryl; ii) once policyvar reaches the adopted-policy state, it never reverts to the unadopted-policy state; iii) the first-observed value must be the unadopted-policy-state value, and the last-observed value must be the adopted-policy-state value, and iv) all policyvar values in the observed data range must be either adopted-policy-state values or unadopted-policy-state values.
impute(instag) imputes missing values in the policyvar under staggered adoption assumptions and additionally imputes missing values inside the observed data range: xtevent imputes a missing value or a group of them only if they are both preceded and followed by values corresponding to the unadopted-policy state or the adopted-policy state.
We want to estimate the dynamic effects of being a union member on the wage. We will use the National Longitudinal Survey data from Stata’s example datasets.
. webuse nlswork, clear (National Longitudinal Survey. Young Women 14-26 years of age in 1968)
This dataset has many missing observations. For the sake of the example, we will create a time variable that ignores these gaps.
. by idcode (year): gen time=_n
. xtset idcode time
panel variable: idcode (unbalanced)
time variable: time, 1 to 15
delta: 1 unit
The policyvar union reverts to the unadopted-policy-state for several units. We generate a policyvar that follows staggered adoption.
. by idcode (time): gen union2=sum(union) . replace union2=1 if union2>1 (4,177 real changes made) . order time union union2, after(year)
Now we add some missing values to the policyvar for this example and display how the policyvar looks for unit 2.
. replace union2=. if idcode==2 & inlist(time, 1,8,9,11,12) (5 real changes made, 5 to missing) . list idcode time union2 if idcode==2, noobs ┌────────────────────────┐ │ idcode time union2 │ ├────────────────────────┤ │ 2 1 . │ │ 2 2 0 │ │ 2 3 0 │ │ 2 4 0 │ │ 2 5 1 │ ├────────────────────────┤ │ 2 6 1 │ │ 2 7 1 │ │ 2 8 . │ │ 2 9 . │ │ 2 10 1 │ ├────────────────────────┤ │ 2 11 . │ │ 2 12 . │ └────────────────────────┘
First, we estimate an event-study where we impute outer missing values in the policyvar without verifying staggered adoption, i.e., according to nuchange. We also want to add the new policyvar to the database. We can do this using the saveimp suboption.
. xtevent ln_w age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure , ///
> policyvar(union2) window(3) impute(nuchange, saveimp)
Using options panelvar and timevar from xtset
No proxy or instruments provided. Implementing OLS estimator
Linear regression, absorbing indicators Number of obs = 23,533
Absorbed variable: idcode No. of categories = 2,771
F( 27, 20735) = 177.64
Prob > F = 0.0000
R-squared = 0.6662
Adj R-squared = 0.6211
Root MSE = 0.2872
────────────────────┬────────────────────────────────────────────────────────────────
ln_wage │ Coef. Std. Err. t P>|t| [95% Conf. Interval]
────────────────────┼────────────────────────────────────────────────────────────────
_k_eq_m4 │ -.044991 .0129656 -3.47 0.001 -.0704046 -.0195773
_k_eq_m3 │ -.056602 .0146577 -3.86 0.000 -.0853324 -.0278717
_k_eq_m2 │ -.0421076 .0132848 -3.17 0.002 -.0681469 -.0160683
_k_eq_p0 │ .089006 .0126565 7.03 0.000 .0641984 .1138137
_k_eq_p1 │ .0816302 .0130645 6.25 0.000 .0560227 .1072377
_k_eq_p2 │ .0805316 .0137205 5.87 0.000 .0536383 .1074249
_k_eq_p3 │ .0636236 .0146177 4.35 0.000 .0349717 .0922754
_k_eq_p4 │ .0299571 .0131044 2.29 0.022 .0042715 .0556428
age │ .0200429 .0039789 5.04 0.000 .012244 .0278418
│
c.age#c.age │ -.0005227 .0000592 -8.83 0.000 -.0006388 -.0004067
│
ttl_exp │ .0491641 .0035992 13.66 0.000 .0421095 .0562188
│
c.ttl_exp#c.ttl_exp │ -.0004481 .0001315 -3.41 0.001 -.000706 -.0001903
│
tenure │ .009586 .0009319 10.29 0.000 .0077594 .0114126
│
time │
2 │ .0560126 .0085424 6.56 0.000 .0392688 .0727564
3 │ .0575009 .0102856 5.59 0.000 .0373404 .0776614
4 │ .0602892 .0126124 4.78 0.000 .0355678 .0850106
5 │ .0485475 .0152863 3.18 0.001 .0185852 .0785099
6 │ .0484402 .0181939 2.66 0.008 .0127786 .0841017
7 │ .0293352 .0212178 1.38 0.167 -.0122535 .0709238
8 │ .02131 .0241125 0.88 0.377 -.0259524 .0685723
9 │ .0151379 .0269115 0.56 0.574 -.0376107 .0678866
10 │ -.001417 .0298443 -0.05 0.962 -.0599142 .0570803
11 │ -.0124587 .032712 -0.38 0.703 -.0765768 .0516593
12 │ -.017273 .0355159 -0.49 0.627 -.086887 .0523411
13 │ -.0346884 .0388956 -0.89 0.372 -.1109267 .0415499
14 │ -.0097704 .0431507 -0.23 0.821 -.0943492 .0748084
15 │ -.0288539 .0509617 -0.57 0.571 -.1287429 .0710351
│
_cons │ 1.221635 .0606818 20.13 0.000 1.102694 1.340576
────────────────────┴────────────────────────────────────────────────────────────────
F test of absorbed indicators: F(2770, 20735) = 9.920 Prob > F = 0.000
Compare the original policyvar and the imputed policyvar for unit 2.
. list idcode time union2 union2_imputed if idcode==2, noobs ┌───────────────────────────────────┐ │ idcode time union2 union2~d │ ├───────────────────────────────────┤ │ 2 1 . 0 │ │ 2 2 0 0 │ │ 2 3 0 0 │ │ 2 4 0 0 │ │ 2 5 1 1 │ ├───────────────────────────────────┤ │ 2 6 1 1 │ │ 2 7 1 1 │ │ 2 8 . . │ │ 2 9 . . │ │ 2 10 1 1 │ ├───────────────────────────────────┤ │ 2 11 . 1 │ │ 2 12 . 1 │ └───────────────────────────────────┘
Drop the imputed policyvar.
. drop union2_imputed
Now, we estimate an event-study imputing outer missing values in the policyvar verifying staggered adoption, i.e., according to stag, and save the imputed policyvar.
. xtevent ln_w age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure , ///
> policyvar(union2) window(3) impute(stag, saveimp)
Using options panelvar and timevar from xtset
No proxy or instruments provided. Implementing OLS estimator
Linear regression, absorbing indicators Number of obs = 23,533
Absorbed variable: idcode No. of categories = 2,771
F( 27, 20735) = 177.64
Prob > F = 0.0000
R-squared = 0.6662
Adj R-squared = 0.6211
Root MSE = 0.2872
────────────────────┬────────────────────────────────────────────────────────────────
ln_wage │ Coef. Std. Err. t P>|t| [95% Conf. Interval]
────────────────────┼────────────────────────────────────────────────────────────────
_k_eq_m4 │ -.044991 .0129656 -3.47 0.001 -.0704046 -.0195773
_k_eq_m3 │ -.056602 .0146577 -3.86 0.000 -.0853324 -.0278717
_k_eq_m2 │ -.0421076 .0132848 -3.17 0.002 -.0681469 -.0160683
_k_eq_p0 │ .089006 .0126565 7.03 0.000 .0641984 .1138137
_k_eq_p1 │ .0816302 .0130645 6.25 0.000 .0560227 .1072377
_k_eq_p2 │ .0805316 .0137205 5.87 0.000 .0536383 .1074249
_k_eq_p3 │ .0636236 .0146177 4.35 0.000 .0349717 .0922754
_k_eq_p4 │ .0299571 .0131044 2.29 0.022 .0042715 .0556428
age │ .0200429 .0039789 5.04 0.000 .012244 .0278418
│
c.age#c.age │ -.0005227 .0000592 -8.83 0.000 -.0006388 -.0004067
│
ttl_exp │ .0491641 .0035992 13.66 0.000 .0421095 .0562188
│
c.ttl_exp#c.ttl_exp │ -.0004481 .0001315 -3.41 0.001 -.000706 -.0001903
│
tenure │ .009586 .0009319 10.29 0.000 .0077594 .0114126
│
time │
2 │ .0560126 .0085424 6.56 0.000 .0392688 .0727564
3 │ .0575009 .0102856 5.59 0.000 .0373404 .0776614
4 │ .0602892 .0126124 4.78 0.000 .0355678 .0850106
5 │ .0485475 .0152863 3.18 0.001 .0185852 .0785099
6 │ .0484402 .0181939 2.66 0.008 .0127786 .0841017
7 │ .0293352 .0212178 1.38 0.167 -.0122535 .0709238
8 │ .02131 .0241125 0.88 0.377 -.0259524 .0685723
9 │ .0151379 .0269115 0.56 0.574 -.0376107 .0678866
10 │ -.001417 .0298443 -0.05 0.962 -.0599142 .0570803
11 │ -.0124587 .032712 -0.38 0.703 -.0765768 .0516593
12 │ -.017273 .0355159 -0.49 0.627 -.086887 .0523411
13 │ -.0346884 .0388956 -0.89 0.372 -.1109267 .0415499
14 │ -.0097704 .0431507 -0.23 0.821 -.0943492 .0748084
15 │ -.0288539 .0509617 -0.57 0.571 -.1287429 .0710351
│
_cons │ 1.221635 .0606818 20.13 0.000 1.102694 1.340576
────────────────────┴────────────────────────────────────────────────────────────────
F test of absorbed indicators: F(2770, 20735) = 9.920 Prob > F = 0.000
Compare the original policyvar and the imputed policyvar for unit 2.
. list idcode time union2 union2_imputed if idcode==2, noobs ┌───────────────────────────────────┐ │ idcode time union2 union2~d │ ├───────────────────────────────────┤ │ 2 1 . 0 │ │ 2 2 0 0 │ │ 2 3 0 0 │ │ 2 4 0 0 │ │ 2 5 1 1 │ ├───────────────────────────────────┤ │ 2 6 1 1 │ │ 2 7 1 1 │ │ 2 8 . . │ │ 2 9 . . │ │ 2 10 1 1 │ ├───────────────────────────────────┤ │ 2 11 . 1 │ │ 2 12 . 1 │ └───────────────────────────────────┘
Drop the imputed policyvar.
. drop union2_imputed
Last, we estimate an event-study imputing outer and inner missing values in the policyvar verifying staggered adoption, i.e., according to instag, and save the imputed policyvar.
. xtevent ln_w age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure , ///
> policyvar(union2) window(3) impute(instag, saveimp)
Using options panelvar and timevar from xtset
No proxy or instruments provided. Implementing OLS estimator
Linear regression, absorbing indicators Number of obs = 23,541
Absorbed variable: idcode No. of categories = 2,771
F( 27, 20743) = 177.82
Prob > F = 0.0000
R-squared = 0.6662
Adj R-squared = 0.6212
Root MSE = 0.2872
────────────────────┬────────────────────────────────────────────────────────────────
ln_wage │ Coef. Std. Err. t P>|t| [95% Conf. Interval]
────────────────────┼────────────────────────────────────────────────────────────────
_k_eq_m4 │ -.0449924 .0129631 -3.47 0.001 -.0704011 -.0195837
_k_eq_m3 │ -.0565855 .0146546 -3.86 0.000 -.0853096 -.0278614
_k_eq_m2 │ -.0421016 .0132823 -3.17 0.002 -.0681359 -.0160673
_k_eq_p0 │ .089023 .0126502 7.04 0.000 .0642277 .1138183
_k_eq_p1 │ .0815659 .0130576 6.25 0.000 .0559719 .1071598
_k_eq_p2 │ .0804259 .0137127 5.87 0.000 .053548 .1073037
_k_eq_p3 │ .0635638 .0146083 4.35 0.000 .0349305 .0921971
_k_eq_p4 │ .0299474 .0130957 2.29 0.022 .0042789 .0556159
age │ .0200353 .0039778 5.04 0.000 .0122385 .0278322
│
c.age#c.age │ -.0005226 .0000592 -8.83 0.000 -.0006386 -.0004065
│
ttl_exp │ .0491603 .0035979 13.66 0.000 .0421082 .0562125
│
c.ttl_exp#c.ttl_exp │ -.0004479 .0001315 -3.41 0.001 -.0007057 -.0001902
│
tenure │ .0095845 .0009314 10.29 0.000 .0077588 .0114102
│
time │
2 │ .0560166 .0085406 6.56 0.000 .0392763 .0727568
3 │ .0575122 .0102831 5.59 0.000 .0373564 .077668
4 │ .0603109 .0126093 4.78 0.000 .0355958 .0850261
5 │ .0485817 .0152818 3.18 0.001 .0186282 .0785352
6 │ .0484417 .0181883 2.66 0.008 .0127912 .0840921
7 │ .0293154 .0212118 1.38 0.167 -.0122613 .0708922
8 │ .021307 .0241059 0.88 0.377 -.0259425 .0685565
9 │ .0151769 .0269039 0.56 0.573 -.0375569 .0679106
10 │ -.0014045 .0298363 -0.05 0.962 -.059886 .0570769
11 │ -.0124446 .0327037 -0.38 0.704 -.0765463 .0516572
12 │ -.0173009 .035506 -0.49 0.626 -.0868955 .0522938
13 │ -.0346925 .0388867 -0.89 0.372 -.1109135 .0415284
14 │ -.0097838 .0431413 -0.23 0.821 -.0943442 .0747766
15 │ -.0288719 .0509512 -0.57 0.571 -.1287403 .0709964
│
_cons │ 1.221736 .0606651 20.14 0.000 1.102827 1.340644
────────────────────┴────────────────────────────────────────────────────────────────
F test of absorbed indicators: F(2770, 20743) = 9.924 Prob > F = 0.000
Compare the original policyvar and the imputed policyvar for unit 2.
. list idcode time union2 union2_imputed if idcode==2, noobs ┌───────────────────────────────────┐ │ idcode time union2 union2~d │ ├───────────────────────────────────┤ │ 2 1 . 0 │ │ 2 2 0 0 │ │ 2 3 0 0 │ │ 2 4 0 0 │ │ 2 5 1 1 │ ├───────────────────────────────────┤ │ 2 6 1 1 │ │ 2 7 1 1 │ │ 2 8 . 1 │ │ 2 9 . 1 │ │ 2 10 1 1 │ ├───────────────────────────────────┤ │ 2 11 . 1 │ │ 2 12 . 1 │ └───────────────────────────────────┘
Now we display how the imputation works on the event-time dummies. First, we differentiate the policyvar.
. gen union2_d=d.union2 (4,717 missing values generated)
Estimate an event study without imputing the policyvar and save the event-time dummies by the savek option.
. xtevent ln_w age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure , ///
> policyvar(union2) window(3) savek(vv)
Using options panelvar and timevar from xtset
No proxy or instruments provided. Implementing OLS estimator
Linear regression, absorbing indicators Number of obs = 5,672
Absorbed variable: idcode No. of categories = 1,600
F( 20, 4052) = 16.82
Prob > F = 0.0000
R-squared = 0.8030
Adj R-squared = 0.7243
Root MSE = 0.2162
────────────────────┬────────────────────────────────────────────────────────────────
ln_wage │ Coef. Std. Err. t P>|t| [95% Conf. Interval]
────────────────────┼────────────────────────────────────────────────────────────────
_k_eq_m4 │ -.0486214 .0268491 -1.81 0.070 -.1012604 .0040177
_k_eq_m3 │ -.0501976 .0245746 -2.04 0.041 -.0983773 -.0020179
_k_eq_m2 │ -.052895 .0219346 -2.41 0.016 -.095899 -.0098911
_k_eq_p0 │ .0405804 .0215074 1.89 0.059 -.001586 .0827468
_k_eq_p1 │ .0206119 .022553 0.91 0.361 -.0236043 .0648281
_k_eq_p2 │ .0282941 .0244515 1.16 0.247 -.0196443 .0762325
_k_eq_p3 │ .0152028 .0273227 0.56 0.578 -.0383647 .0687703
_k_eq_p4 │ -.0092743 .0298438 -0.31 0.756 -.0677845 .0492359
age │ -.0080527 .0146572 -0.55 0.583 -.0367888 .0206835
│
c.age#c.age │ -.0002118 .0002247 -0.94 0.346 -.0006524 .0002287
│
ttl_exp │ .040395 .0105632 3.82 0.000 .0196853 .0611047
│
c.ttl_exp#c.ttl_exp │ -.0006165 .0004356 -1.42 0.157 -.0014706 .0002375
│
tenure │ .0074825 .0018953 3.95 0.000 .0037666 .0111984
│
time │
6 │ .0274323 .0136636 2.01 0.045 .0006441 .0542204
7 │ .0364149 .0241351 1.51 0.131 -.0109032 .083733
8 │ .0677196 .03455 1.96 0.050 -.0000174 .1354565
9 │ .0935328 .0442389 2.11 0.035 .0068002 .1802655
10 │ .0944863 .0554168 1.71 0.088 -.014161 .2031336
11 │ .1177996 .0662023 1.78 0.075 -.0119933 .2475924
12 │ .134973 .0756575 1.78 0.074 -.0133573 .2833033
│
_cons │ 1.864822 .2456629 7.59 0.000 1.383187 2.346456
────────────────────┴────────────────────────────────────────────────────────────────
F test of absorbed indicators: F(1599, 4052) = 8.310 Prob > F = 0.000
Now, we display the event-time dummies for a unit. We can verify that this set of event-time dummies corresponds to different leads of the differentiated policyvar (see equation 2 in Freyaldenhoven et al. (2021)).
. list idcode time union2 union2_d vv_eq_m4 vv_eq_m3 vv_eq_m2 vv_eq_m1 if idcode==24, noobs ┌───────────────────────────────────────────────────────────────────────────────┐ │ idcode time union2 union2_d vv_eq_m4 vv_eq_m3 vv_eq_m2 vv_eq_m1 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 1 0 . 1 0 0 0 │ │ 24 2 0 0 1 0 0 0 │ │ 24 3 0 0 1 0 0 0 │ │ 24 4 0 0 1 0 0 0 │ │ 24 5 0 0 1 0 0 0 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 6 0 0 1 0 0 0 │ │ 24 7 0 0 0 1 0 0 │ │ 24 8 0 0 0 0 1 0 │ │ 24 9 0 0 0 0 0 1 │ │ 24 10 1 1 0 0 0 0 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 11 1 0 0 0 0 0 │ │ 24 12 1 0 0 0 0 0 │ │ 24 13 1 0 . . 0 0 │ │ 24 14 1 0 . . . 0 │ │ 24 15 1 0 . . . . │ └───────────────────────────────────────────────────────────────────────────────┘
Drop the event-time dummies.
. drop vv*
Estimate the same model, but with imputation according to stag.
. xtevent ln_w age c.age#c.age ttl_exp c.ttl_exp#c.ttl_exp tenure , ///
> policyvar(union2) window(3) savek(vv) impute(stag)
Using options panelvar and timevar from xtset
No proxy or instruments provided. Implementing OLS estimator
Linear regression, absorbing indicators Number of obs = 23,533
Absorbed variable: idcode No. of categories = 2,771
F( 27, 20735) = 177.64
Prob > F = 0.0000
R-squared = 0.6662
Adj R-squared = 0.6211
Root MSE = 0.2872
────────────────────┬────────────────────────────────────────────────────────────────
ln_wage │ Coef. Std. Err. t P>|t| [95% Conf. Interval]
────────────────────┼────────────────────────────────────────────────────────────────
_k_eq_m4 │ -.044991 .0129656 -3.47 0.001 -.0704046 -.0195773
_k_eq_m3 │ -.056602 .0146577 -3.86 0.000 -.0853324 -.0278717
_k_eq_m2 │ -.0421076 .0132848 -3.17 0.002 -.0681469 -.0160683
_k_eq_p0 │ .089006 .0126565 7.03 0.000 .0641984 .1138137
_k_eq_p1 │ .0816302 .0130645 6.25 0.000 .0560227 .1072377
_k_eq_p2 │ .0805316 .0137205 5.87 0.000 .0536383 .1074249
_k_eq_p3 │ .0636236 .0146177 4.35 0.000 .0349717 .0922754
_k_eq_p4 │ .0299571 .0131044 2.29 0.022 .0042715 .0556428
age │ .0200429 .0039789 5.04 0.000 .012244 .0278418
│
c.age#c.age │ -.0005227 .0000592 -8.83 0.000 -.0006388 -.0004067
│
ttl_exp │ .0491641 .0035992 13.66 0.000 .0421095 .0562188
│
c.ttl_exp#c.ttl_exp │ -.0004481 .0001315 -3.41 0.001 -.000706 -.0001903
│
tenure │ .009586 .0009319 10.29 0.000 .0077594 .0114126
│
time │
2 │ .0560126 .0085424 6.56 0.000 .0392688 .0727564
3 │ .0575009 .0102856 5.59 0.000 .0373404 .0776614
4 │ .0602892 .0126124 4.78 0.000 .0355678 .0850106
5 │ .0485475 .0152863 3.18 0.001 .0185852 .0785099
6 │ .0484402 .0181939 2.66 0.008 .0127786 .0841017
7 │ .0293352 .0212178 1.38 0.167 -.0122535 .0709238
8 │ .02131 .0241125 0.88 0.377 -.0259524 .0685723
9 │ .0151379 .0269115 0.56 0.574 -.0376107 .0678866
10 │ -.001417 .0298443 -0.05 0.962 -.0599142 .0570803
11 │ -.0124587 .032712 -0.38 0.703 -.0765768 .0516593
12 │ -.017273 .0355159 -0.49 0.627 -.086887 .0523411
13 │ -.0346884 .0388956 -0.89 0.372 -.1109267 .0415499
14 │ -.0097704 .0431507 -0.23 0.821 -.0943492 .0748084
15 │ -.0288539 .0509617 -0.57 0.571 -.1287429 .0710351
│
_cons │ 1.221635 .0606818 20.13 0.000 1.102694 1.340576
────────────────────┴────────────────────────────────────────────────────────────────
F test of absorbed indicators: F(2770, 20735) = 9.920 Prob > F = 0.000
Now, we display the event-time dummies for the same unit. We can verify that xtevent imputed event-time dummies despite the policyvar not having missing values in its observed data range. This imputation happens because the imputation works on both the observed and the unobserved data range of the policyvar.
. list idcode time union2 union2_d vv_eq_m4 vv_eq_m3 vv_eq_m2 vv_eq_m1 if idcode==24, noobs ┌───────────────────────────────────────────────────────────────────────────────┐ │ idcode time union2 union2_d vv_eq_m4 vv_eq_m3 vv_eq_m2 vv_eq_m1 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 1 0 . 1 0 0 0 │ │ 24 2 0 0 1 0 0 0 │ │ 24 3 0 0 1 0 0 0 │ │ 24 4 0 0 1 0 0 0 │ │ 24 5 0 0 1 0 0 0 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 6 0 0 1 0 0 0 │ │ 24 7 0 0 0 1 0 0 │ │ 24 8 0 0 0 0 1 0 │ │ 24 9 0 0 0 0 0 1 │ │ 24 10 1 1 0 0 0 0 │ ├───────────────────────────────────────────────────────────────────────────────┤ │ 24 11 1 0 0 0 0 0 │ │ 24 12 1 0 0 0 0 0 │ │ 24 13 1 0 0 0 0 0 │ │ 24 14 1 0 0 0 0 0 │ │ 24 15 1 0 0 0 0 0 │ └───────────────────────────────────────────────────────────────────────────────┘