Sometimes we may want to produce the following table to compare the mean and median of two groups:
First of all, please refer to this post to see Stata commands to test equality of mean and median.
However, it is timeconsuming to glean numbers from the output of these Stata commands and place them in a table. It is even more struggling that you have to repeat the tedious process every time you update your sample.
I write Stata codes to streamline the process. The codes vary between unpaired (i.e., unmatched) data and paired data.
Unpaired data
The above example is unpaired data, i.e., suspect firmyears and other firmyears are not 1to1 or 1tom matched. One usage of unpaired data is the first step of Heckman’s twostep procedure, in which two groups of observations (i.e., the group that will be selected into the second step and the group that will not be selected into the second step) are stacked vertically in the dataset. The following codes are used for unpaired data. You only need to modify the first two lines to suit your data. The codes will generate a table in Stata’s output window like this:
You can then select the output and rightclick “Copy as table” and paste in Excel for a quick edit. The codes use ttest for mean and Wilcoxon ranksum test for median.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

local vars retsd cfosd lnilliq authpct //put your variables here local group grpid //"grpid" is your group indicator that takes 1 and 0 foreach v in `vars' { di "`v'" ttest `v', by(`group') local mean_`v'_mean_0=round(r(mu_1),.001) local mean_`v'_mean_1=round(r(mu_2),.001) local mean_`v'_diff=`mean_`v'_mean_1'`mean_`v'_mean_0' local mean_`v'_p=r(p) } foreach v in `vars' { sum `v' if `group'==0, detail local p50_`v'_p50_0=round(r(p50),.001) sum `v' if `group'==1, detail local p50_`v'_p50_1=round(r(p50),.001) ranksum `v', by(`group') local p50_`v'_n_0=r(N_1) local p50_`v'_n_1=r(N_2) local p50_`v'_diff=`p50_`v'_p50_1'`p50_`v'_p50_0' local p50_`v'_p=2*normprob(abs(r(z))) } qui { noi di _newline noi di "{hline 115}" noi di _col(15) "{c } `group' = 1" /// _col(45) "{c } `group' = 0" /// _col(75) "{c } Diff" noi di _col(16) "{hline 100}" noi di _col(15) "{c } Mean" /// _col(25) "{c } Median" /// _col(35) "{c } N" /// _col(45) "{c } Mean" /// _col(55) "{c } Median" /// _col(65) "{c } N" /// _col(75) "{c } Mean" /// _col(85) "{c } P" /// _col(95) "{c } Median" /// _col(105) "{c } P" noi di "{hline 115}" foreach v in `vars' { noi di %12s abbrev("`v'",12) /// _col(15) "{c }" %8.3f `mean_`v'_mean_1' /// _col(25) "{c }" %8.3f `p50_`v'_p50_1' /// _col(35) "{c }" %8.0f `p50_`v'_n_1' /// _col(45) "{c }" %8.3f `mean_`v'_mean_0' /// _col(55) "{c }" %8.3f `p50_`v'_p50_0' /// _col(65) "{c }" %8.0f `p50_`v'_n_0' /// _col(75) "{c }" %8.3f `mean_`v'_diff' /// _col(85) "{c }" %8.3f `mean_`v'_p' /// _col(95) "{c }" %8.3f `p50_`v'_diff' /// _col(105) "{c }" %8.3f `p50_`v'_p' } noi di "{hline 115}" } 
Paired data
A typical usage of paired data is to identify a matched control group for the treatment group. For example, identify a matched firmyear for an event firmyear based on a set of characteristics (same industry, same year, similar size and booktomarket), or identify a matched firm for every event firm based on the closest propensity score (i.e., propensity score matching).
The following table is an example that compares the mean and median of two matched groups—restating firms and nonrestating group. Each restating firm is matched with a nonrestating firm.
Because of this matching relationship, every event firm and its control firm will be placed in the same row in the dataset. In other words, event firms and control firms are aligned horizontally. The following codes are used for paired data. You only need to modify the first two lines to suit your data. You must specify the same number of variables in the matched order in the first two lines. In other words, the first variable in the first line must be paired with the first variable in the second line, and so on. The codes will generate a table in Stata’s output window like this:
The codes use paired ttest for mean and Wilcoxon ranksign test for median.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

//put your paired variables in the first two lines. 1to1 correspondece is must local agrp "drpre4 drpre3 drpre2 drpre1" //e.g., treatment group local bgrp "mdrpre4 mdrpre3 mdrpre2 mdrpre1" //e.g., control group local n : word count `agrp' forvalues i = 1/`n' { local a : word `i' of `agrp' local b : word `i' of `bgrp' ttest `a'=`b' local mean_`a'=round(r(mu_1),.001) local mean_`b'=round(r(mu_2),.001) local mean_`a'_diff=`mean_`a''`mean_`b'' local n_`a'=r(N_1) local mean_p_`a'=r(p) sum `a', detail local p50_`a'=round(r(p50),.001) sum `b', detail local p50_`b'=round(r(p50),.001) signrank `a'=`b' local p50_`a'_diff=round(`p50_`a''`p50_`b'',.001) local p50_p_`a'=2*normprob(abs(r(z))) } qui { noi di _newline noi di "{hline 120}" noi di _col(30) "{c }" /// _col(40) "{c } Var1" /// _col(60) "{c } Var2" /// _col(80) "{c } Diff" noi di _col(41) "{hline 80}" noi di %27s "Paired Var1 and Var2" /// _col(30) "{c } N" /// _col(40) "{c } Mean" /// _col(50) "{c } Median" /// _col(60) "{c } Mean" /// _col(70) "{c } Median" /// _col(80) "{c } Mean" /// _col(90) "{c } P" /// _col(100) "{c } Median" /// _col(110) "{c } P" noi di "{hline 120} forvalues i = 1/`n' { local a : word `i' of `agrp' local b : word `i' of `bgrp' noi di %27s abbrev("`a' vs `b'",27) /// _col(30) "{c }" %8.0f `n_`a'' /// _col(40) "{c }" %8.3f `mean_`a'' /// _col(50) "{c }" %8.3f `p50_`a'' /// _col(60) "{c }" %8.3f `mean_`b'' /// _col(70) "{c }" %8.3f `p50_`b'' /// _col(80) "{c }" %8.3f `mean_`a'_diff' /// _col(90) "{c }" %8.3f `mean_p_`a'' /// _col(100) "{c }" %8.3f `p50_`a'_diff' /// _col(110) "{c }" %8.3f `p50_p_`a'' } noi di "{hline 120} } 