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 │ └───────────────────────────────────────────────────────────────────────────────┘