-
Notifications
You must be signed in to change notification settings - Fork 2
/
btable.ado
3381 lines (2881 loc) · 87.3 KB
/
btable.ado
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
*! version 1.0.2 31aug2021
cap program drop btable
program btable, nclass
version 15
syntax varlist [if] [in], SAVing(string) ///
[BY(varname) ///
CATegorical(varlist) CONTInuous(varlist) ///
order(numlist) ///
count(varlist) exp_time(varlist) exp_time_units(string) nbreg ///
tte(varlist) fail(varlist) trunc_time(string) surv_time_units(string) ///
ALLlevels DENOMinator(string) ///
effect(string) test(string) ///
user_var(string) user_command(string) user_parse(string) MARgins ///
user_post(string) user_name(string) ///
Level(cilevel) ///
prci(string) ///
rdci(string) rrci(string) orci(string) hlmdci(string) mwsci(string) ///
irrci(string) ///
ttest(string) qreg(string) ///
lr(string) ///
chi2_lr ///
cox_lr poisson_lr nbreg_lr ///
ranksum_exact ///
poisson_test(string) ///
rmst_model(string) ///
hr_model(string) ///
fpm_df(string) ///
type(string) /// old option, not used anymore, only for compatibility
parent(varlist) kid(varlist) parent_level(string) ///
]
marksample touse, novarlist
**************
*entry checks
****************
qui ds `varlist', has(type string)
local wcs: word count `r(varlist)'
if `wcs'!=0 {
dis as error "String variables not allowed: `r(varlist)'"
exit
//exit= 999, clear
}
capture confirm string variable `by'
if _rc==0 {
dis as error "Group variable cannot be a string."
exit
}
cap assert "`type'"=="" if "`categorical'" !="" | "`continuous'" !=""
if _rc {
dis as error "Options type and categorical/continuous cannot be combined"
exit
}
if "`type'"!="" {
dis as text "Option type has been replaced, consider using categorical and continuous."
}
if "`denominator'"!="" {
cap assert "`denominator'"=="nonmiss"
if _rc {
dis as text "Option for denominator not recognized, nonmiss assumed"
}
}
if "`lr'"!="" {
local lrwc: word count `lr'
forvalues lri = 1/`lrwc' {
local lrwi: word `lri' of `lr'
cap assert inlist("`lrwi'","chi2","cox","poisson","nbreg")
if _rc {
dis as text "`lrwi' is not a valid option for lr --- will be ignored"
}
}
}
*varname that corresponds to variable type:
local key conti cat count tte miss
foreach v of local varlist {
cap assert !inlist("`v'","conti","cat","count","tte","miss")
if _rc {
dis as text "Variable name `v' corresponds to a variable type. May cause problems with btable_format."
}
}
if "`count'"!="" {
local cwc: word count `count'
local twc: word count `exp_time'
local lwc: word count `exp_time_units'
cap assert `cwc'==`twc'
if _rc & `twc'!=1 {
dis as error "For each count variable, an exposure time variable has to be specified via exp_time."
exit
}
cap assert `twc'==`lwc'
if _rc & `lwc'!=1 & `lwc'!=0 {
local text1 "The number of units for the exposure time does not correspond to"
local text2 "the number of exposure time variables - option exp_time_units is ignored."
dis as text "`text1' `text2'"
local exp_time_units
local lwc 0
local etime_unit
local etime_post
}
if `lwc'==0 {
local etime_unit
local etime_post
}
if `lwc'>0 {
local etime_unit str244 etime_unit
local etime_post
local etime_post ("")
}
}
if "`tte'"!="" {
local ttewc: word count `tte'
local ttefwc: word count `fail'
local trtwc: word count `trunc_time'
local stuwc: word count `surv_time_units'
local rmwc: word count `rmst_model'
local dfwc: word count `fpm_df'
//failure
cap assert `ttewc'==`ttefwc'
if _rc {
dis as error "For each time-to-event variable a failure variable has to be given."
exit
}
foreach l of local fail {
cap assert inlist(`l',0,1,.)
if _rc {
dis as error "Variable `l' contains invalid numbers."
dis as error "Variables defined in fail have to be coded as 0 (censored) and 1 (failure)."
exit
}
}
//trunc_time
cap assert `ttewc'==`trtwc'
if _rc & `trtwc'!=1 & `trtwc'!=0 {
dis as text "Trunction time has to be given for each variable - option trunc_time is ignored."
local trunc_time
}
foreach l of local trunc_time {
cap confirm number `l'
if _rc {
dis as text "Only numbers allowed in trunc_time - option trunc_time is ignored."
local trunc_time
}
}
cap assert `ttewc'==`stuwc'
if _rc & `stuwc'!=1 & `stuwc'!=0 {
local text1 "The number of units for the survival time does not correspond to"
local text2 "the number of time-to-event variables - option surv_time_units is ignored."
dis as text "`text1' `text2'"
local surv_time_units
local stuwc 0
local stime_unit
local stime_post
}
if `stuwc'==0 {
local stime_unit
local stime_post
}
if `stuwc'>0 {
local stime_unit str244 stime_unit
local stime_post
local stime_post ("")
}
cap assert inlist(`rmwc',0,1,`ttewc')
if _rc {
local text1 "Length of rmst_model has to be either one or correspond to the number of tte variables - "
local text2 "default (npar) used."
dis as text "`text1' `text2'"
local rmst_model npar
}
if "`rmst_model'" != "" {
local fpmwc = 0
foreach l of local rmst_model {
cap assert inlist("`l'","npar","fpm") //pseudo would be a possibility
if _rc {
dis as text "Option for rmst_model not recognized. Only npar and fpm allowed. Default (npar) used."
local rmst_model npar
}
if "`l'" == "fpm" {
local fpmwc = `fpmwc' + 1
}
}
cap assert inlist(`dfwc',0,1,`fpmwc')
if _rc {
local text1 "The numbers of elements in fpm_df has to be 1 or correspond to the number of fpm in rmst_model - "
local text2 "default (3) used."
dis as text "`text1' `text2'"
local fpm_df 3
}
if "`fpm_df'" !="" {
foreach l of local fpm_df {
cap confirm integer number `l'
if _rc {
dis as text "Only integers allowed in fpm_df - default (3) used."
local fpm_df 3
}
}
}
}
}
if "`parent'"!="" {
cap assert "`kid'"!=""
if _rc {
dis as text "Option kid not specified, parent has no effect."
local parent
}
}
if "`kid'"!="" {
cap assert "`parent'"!=""
if _rc {
dis as text "Option parent not specified, kid has no effect."
local kid
}
else {
cap assert "`parent_level'"!=""
if _rc {
dis as text "Option parent_level not specifed --- 1 is assumed."
local parent_level 1
}
local kwc: word count `kid'
local pwc: word count `parent'
local plwc: word count `parent_level'
cap assert `kwc'==`pwc'
if _rc {
dis as text "Options kid and parent do not have the same number of words --- options ignored."
local kid
local parent
local parent_level
}
else {
cap assert inlist(`plwc',1,`kwc')
if _rc {
dis as text "Options parent_level does not have the same number of words as kid and parent --- 1 is assumed."
local parent_level 1
}
}
}
}
*ordering
*****************
if "`by'"!="" {
qui levelsof `by', local(glev)
local wc: word count `glev'
if "`order'" != "" {
local wcg: word count `order'
cap assert `wc'==`wcg'
if _rc {
dis as text "All levels of by variable have to be included in order --- ordering ignored."
local order=""
}
foreach o of local order {
cap assert strpos("`glev'","`o'")>0
if _rc {
dis as text "Level `o' not in by variable --- ordering ignored."
local order=""
}
local ocomp=subinstr("`order'","`o'","",1)
cap assert strpos("`ocomp'","`o'")==0
if _rc {
dis as text "Duplicates in order option --- ordering ignored."
local order=""
}
}
}
}
*options for test
******************
if "`test'" == "none" {
local testlist
}
else {
local testlist fisher chi2 ttest ranksum qreg anova kwallis poisson logrank cox rmstd
if "`test'" != "" & "`test'" !="all" {
tempname lent lcheck ldiff
local `lent' = strlower("`test'")
local `lcheck': list `lent' in testlist
if ``lcheck'' == 0 {
local `ldiff': list `lent' - testlist
local `ldiff' = subinstr("``ldiff''"," ",", ",.)
dis as text "Unrecognized test (``ldiff''), will be ignored. Only fisher, chi2, ttest, ranksum, qreg, anova, kwallis, poisson, logrank, cox and rmstd are allowed."
}
local testlist = strlower("`test'")
}
}
if strpos("`testlist'","fisher")>0 {
local fisher fisher
}
*options for effect measure
********************************
if "`effect'" == "none" {
local effectlist
}
else {
local effectlist rd rr or meand medd hlmd mws ird irr hr rmstd
if "`effect'" != "" & "`effect'" !="all" {
tempname lent lcheck ldiff
local `lent' = strlower("`effect'")
local `lcheck': list `lent' in effectlist
if ``lcheck'' == 0 {
local `ldiff': list `lent' - effectlist
local `ldiff' = subinstr("``ldiff''"," ",", ",.)
dis as text "Unrecognized effect measures (``ldiff''), will be ignored. Only rd, rr, or, meand, medd, hlmd, mws, ird, irr, hr and rmstd are allowed."
}
local effectlist=strlower("`effect'")
}
}
*nbreg
************************
if "`nbreg'"!="" & "`test'" != "none" {
local testlist `testlist' nbreg
}
*options for confidence intervals
***********************************
*prop
if "`prci'"=="" {
local prci="wilson"
}
else {
local prci=strlower("`prci'")
}
if "`prci'"!="" & !inlist("`prci'","exact","wald","wilson","agresti","jeffreys") {
dis as text "Unknown option for prci, only exact, wald, wilson, agresti and jeffreys are allowed. Default (wilson) is used."
local prci="wilson"
}
*rd
if "`rdci'"!="" {
local rdci=strlower("`rdci'")
}
if "`rdci'"!="" & strpos("`effectlist'","rd")==0 {
dis as text "Risk difference (rd) not included in effect list, option rdci ignored."
}
if "`rdci'"!="" & !inlist("`rdci'","wald","ac","nhs","wall","mn") {
dis as text "Unknown option for rdci, only wald, AC, NHS, wall, or MN are allowed. Default (wald) is used."
local rdci=""
}
*rr
if "`rrci'"!="" {
local rrci=strlower("`rrci'")
}
if "`rrci'"!="" & strpos("`effectlist'","rr")==0 {
dis as text "Risk ratio (rr) not included in effect list, option rrci ignored."
}
if "`rrci'"!="" & !inlist("`rrci'","katz","koopman") {
dis as text "Unknown option for rrci, only katz and koopman are allowed. Default (katz) is used."
local rrci=""
}
*or
if "`orci'"!="" {
local orci=strlower("`orci'")
}
if "`orci'"!="" & strpos("`effectlist'","or")==0 {
dis as text "Odds ratio (or) not included in effect list, option orci ignored."
}
if "`orci'"!="" & !inlist("`orci'","woolf","exact","cornfield","agresti","gart") {
dis as text "Unknown option for orci, only woolf, exact, cornfield, agresti, gart are allowed. Default (woolf) is used."
local orci=""
}
*hlmd
if "`hlmdci'"!="" {
local hlmdci=strlower("`hlmdci'")
}
if "`hlmdci'"!="" & strpos("`effectlist'","hlmd")==0 {
dis as text "Hodges-Lehmann difference (hlmd) not included in effect list, option hlmdci ignored."
}
if "`hlmdci'"!="" & !inlist("`hlmdci'","lehmann","newson") {
dis as text "Unknown option for hlmdci, only newson and lehmann are allowed. Default (newson) is used."
local hlmdci=""
}
*mws
if "`mwsci'"!="" {
local mwsci=strlower("`mwsci'")
}
if "`mwsci'"!="" & strpos("`effectlist'","mws")==0 {
dis as text "Mann-Whitney statistic (mws) not included in effect list, option mwsci ignored."
}
if "`mwsci'"!="" & !inlist("`mwsci'","jackknife","delong","bamber","hanley","fay") {
dis as text "Unknown option for mwsci, only delong, jackknife, bamber, and hanley are allowed. Default (delong) is used."
local mwsci=""
}
*irr
if "`irrci'"!="" {
local irrci=strlower("`irrci'")
}
if "`irrci'"!="" & strpos("`effectlist'","irr")==0 {
dis as text "Incidence rate ratio (irr) not included in effect list, option irrci ignored."
}
if "`irrci'"!="" & !inlist("`irrci'","exact","oim","robust") {
dis as text "Unknown option for irrci, only exact, oim, and robust are allowed. Default (exact) is used."
local irrci=""
}
if "`irrci'"!="" & "`nbreg'" != "" {
dis as text "Incidence rate ratio (irr) calculated by negative binomial regression, irrci is ignored."
}
*options for test
*******************
if "`ttest'"!="" {
cap assert strpos("`testlist'","ttest")>0
if _rc {
dis as text "ttest not included in test, option ttest has no effect."
}
}
if "`chi2_lr'"!="" | strpos("`lr'","chi2")>0 {
cap assert strpos("`testlist'","chi2")>0
if _rc {
dis as text "chi2 not included in test, option lr(chi2) has no effect."
}
}
if "`ranksum_exact'"!="" {
cap assert strpos("`testlist'","ranksum")>0
if _rc {
dis as text "ranksum not included in test, option ranksum_exact has no effect."
}
}
if "`cox_lr'"!="" | strpos("`lr'","cox")>0 {
cap assert strpos("`testlist'","cox")>0
if _rc {
dis as text "cox not included in test, option lr(cox) has no effect."
}
}
if "`poisson_test'"!="" {
cap assert strpos("`testlist'","poisson")>0
if _rc {
dis as text "Poisson not included in test, option poisson_test has no effect."
}
}
if "`poisson_lr'"!="" | strpos("`lr'","poisson")>0 {
cap assert strpos("`testlist'","poisson")>0
if _rc {
dis as text "Poisson not included in test, option lr(poisson) has no effect."
}
cap assert "`poisson_test'" !=""
if _rc {
dis as text "poisson_test not specified, option lr(poisson) has no effect."
}
cap assert "`poisson_test'" != "robust"
if _rc {
dis as text "Likelihood ratio test nor possible with robust standard errors, option lr(poisson) has no effect."
}
}
if "`nbreg_lr'"!="" | strpos("`lr'","nbreg")>0 {
cap assert "`nbreg'" !=""
if _rc {
dis as text "Option nbreg not specified, lr(nbreg) has no effect."
}
}
*defaults for tte
************************
if "`rmst_model'" == "" {
local rmst_model npar
}
if "`fpm_df'" == "" {
local fpm_df = 3
}
local counter_fpm = 0
*install auxilliary files
***********************
if !inlist("`rdci'","","wald") & strpos("`effectlist'","rd")>0 {
cap which rdci
if _rc {
dis as error "rdci is required; type -ssc install rdci- to obtain it"
exit 499
//dis "Installing auxiliary ado-file rdci: "
//ssc install rdci
}
}
if "`rrci'"=="koopman" & strpos("`effectlist'","rr")>0 {
cap which koopman
if _rc {
dis as error "koopman is required; type -net install sg154, from(http://www.stata.com/stb/stb58)- to obtain it"
exit 499
//dis "Installing auxiliary ado-file koopman: "
//net install sg154, from(http://www.stata.com/stb/stb58)
}
}
if ("`orci'"=="gart" | "`orci'"=="agresti") & strpos("`effectlist'","or")>0 {
cap which oddsrci
if _rc {
dis as error "oddsrci is required; type -net install sbe30, from(http://www.stata.com/stb/stb51)- to obtain it"
exit 499
//dis "Installing auxiliary ado-file oddsrci: "
//net install sbe30, from(http://www.stata.com/stb/stb51)
}
}
if "`hlmdci'"=="lehmann" & strpos("`effectlist'","hlmd")>0 {
cap which npshift
if _rc {
dis as error "npshift is required; type -net install sg123, from(http://www.stata.com/stb/stb52)- to obtain it"
exit 499
//dis "Installing auxiliary ado-file npshift: "
//net install sg123, from(http://www.stata.com/stb/stb52)
}
}
if (strpos("`effectlist'","hlmd")>0 & "`hlmdci'"!="lehmann") ///
| strpos("`effectlist'","mws")>0 & "`mwsci'"=="jackknife" {
cap which somersd
if _rc {
dis as error "somersd is required; type -ssc install somersd- to obtain it"
exit 499
//dis "Installing auxiliary package somersd: "
//ssc install somersd
}
}
***************
*sample size
****************
qui count if `touse'
local nt=r(N)
//sample size limit for Fisher's exact test
local nlimfish=5000
local nclimfish=10
*******************
*by group
*************
local pvar
if "`by'"!="" {
cap assert !missing(`by')
if _rc {
dis as text "Missings in by variable will be ignored."
}
*effect measures and tests for postfile
qui levelsof `by' if `touse', local(glev)
if "`order'" != "" {
//local glev `intervention' `=subinstr("`glev'","`intervention'","",1)' //"
local glev `order'
}
local gc: word count `glev'
local pvar
local i=0
foreach g of local glev {
local i=`i'+1
local pvar `pvar' ntot_`i' nnonmiss_`i' nlev_`i' ///
pr_`i' prlci_`i' pruci_`i' ///
mean_`i' sd_`i' meanlci_`i' meanuci_`i' ///
p50_`i' p25_`i' p75_`i' iqr_`i' min_`i' max_`i' range_`i' sum_`i' ///
nevents_`i' etime_`i' ir_`i' irlci_`i' iruci_`i' ///
nfails_`i' stime_`i' ///
st50_`i' st50lci_`i' st50uci_`i' st25_`i' st75_`i' ///
rmst_`i' rmstlci_`i' rmstuci_`i'
qui count if `by'==`g' & `touse'
local nt_`g'=r(N)
local gl_`g': label (`by') `g'
}
if `gc'==2 {
local diff p_chi2 p_fisher ///
rd rd_lci rd_uci ///
rr rr_lci rr_uci ///
or or_lci or_uci ///
p_ttest p_ranksum p_qreg ///
meand meand_lci meand_uci ///
medd medd_lci medd_uci ///
hlmd hlmd_lci hlmd_uci ///
mws mws_lci mws_uci ///
p_poisson p_nbreg ///
ird ird_lci ird_uci ///
irr irr_lci irr_uci ///
p_logrank p_cox p_rmstd ///
hr hr_lci hr_uci ///
rmstd rmstd_lci rmstd_uci
}
if `gc'>2 {
local diff p_chi2 p_fisher p_anova p_kwallis ///
p_poisson p_nbreg ///
p_logrank p_cox
}
local pvar `pvar' `diff'
*prepare and save group file
preserve
local vlab: val label `by'
local varlab: var label `by'
local nall
if "`vlab'"!="" {
cap uselabel `vlab', clear
if _rc==0 {
qui gen vname="`by'"
qui gen vlabel="`varlab'"
qui gen nt=`nt'
qui gen ntg=.
qui count
forvalues i=1/`r(N)' {
local na=value[`i']
if "`nt_`na''"!="" {
qui replace ntg=`nt_`na'' in `i'
}
else {
qui replace ntg=0 in `i'
}
}
qui sum nt
local nls1=r(mean)
qui sum ntg
local nls2=r(sum)
qui count
if `r(N)'!=`gc' | `nls1' != `nls2' {
display "Not all levels of the by variable are labeled."
local nall=1
}
else {
if "`order'"!="" {
local i=1
tempvar seqg
qui gen `seqg' = .
foreach o of local order {
qui replace `seqg' = `o' in `i'
local i=`i'+1
}
sort `seqg'
qui drop `seqg'
}
}
}
}
if "`vlab'"=="" | _rc==111 | "`nall'" != "" {
clear
qui set obs `gc'
qui gen lname=""
qui gen value=.
qui gen label=""
qui gen vname="`by'"
qui gen vlabel="`varlab'"
qui gen nt=`nt'
qui gen ntg=.
local i=0
foreach g of local glev {
local i=`i'+1
qui replace ntg=`nt_`g'' in `i'
qui replace value=`g' in `i'
qui replace label="`gl_`g''" in `i'
}
}
qui count
forvalues i=1/`r(N)' {
local glab`i'=label[`i']
}
cap drop trunc
qui save "`saving'_group", replace
restore
}
***************************
*user defined commands
*****************************
//defaults
local add_user_var
local add_user_var_base user_pe user_lci user_uci user_p
local add_user_var_post
local add_user_var_post_base
local uname = 0
if "`user_parse'"=="" {
local user_parse "|"
}
//check number of entries
if "`user_var'" != "" {
//check that user_var contain only valid varnames or parsing character
local blockcheck = 1
tempname v
foreach `v' of local user_var {
if "``v''" != "`user_parse'" {
cap ds ``v''
if _rc {
cap assert inlist("``v''","conti","cat","tte","count")
if _rc {
dis as text "Error in user_var: ``v'' is not an existing variable, conti, cat, tte or count---user options ignored"
local blockcheck = 0
}
}
}
}
cap assert "`user_command'" != ""
if _rc {
dis as text "user_command not given, user options ignored"
local blockcheck = 0
}
tempname bcount bcount1 bcount2 bcount3 bcount4
tempname a
local `a': subinstr local user_var "`user_parse'" "`user_parse'", all count(local `bcount')
local `bcount1' = ``bcount'' + 1
tempname a
local user_command_h = subinstr("`user_command'","||","",.)
local `a': subinstr local user_command_h "`user_parse'" "`user_parse'", all count(local `bcount')
local `bcount2' = ``bcount'' + 1
cap assert ``bcount1'' == ``bcount2''
if _rc {
dis as text "The number of user_var does not match the number of user_command---user options ignored"
local blockcheck = 0
}
if "`user_post'" != "" {
tempname a
local `a': subinstr local user_post "`user_parse'" "`user_parse'", all count(local `bcount')
local `bcount3' = ``bcount'' + 1
cap assert ``bcount1'' == ``bcount3'' | ``bcount3''==1
if _rc {
dis as text "The number of user_post does not match the number of user_var---user options ignored"
local blockcheck = 0
}
}
if "`user_name'" != "" {
tempname a
local `a': subinstr local user_name "`user_parse'" "`user_parse'", all count(local `bcount')
local `bcount4' = ``bcount'' + 1
if "`user_post'" != "" {
cap assert ``bcount3'' == ``bcount4'' | ``bcount4''==1
if _rc {
dis as text "The number of user_name does not match the number of user_post---user options ignored"
local blockcheck = 0
}
}
else {
cap assert ``bcount1'' == ``bcount4'' | ``bcount4''==1
if _rc {
dis as text "The number of user_name does not match the number of user_var---user options ignored"
local blockcheck = 0
}
}
}
if `blockcheck'==1 {
//repair for || in mixed
tempname cr1
local user_commandr = subinstr("`user_command'","||","`cr1'",.)
tknz "`user_var'", parse("`user_parse'") nochar stub(var)
tknz "`user_commandr'", parse("`user_parse'") nochar stub(command)
if "`user_post'" != "" {
tknz "`user_post'", parse("`user_parse'") nochar stub(post)
}
if "`user_name'" != "" {
tknz "`user_name'", parse("`user_parse'") nochar stub(name)
}
if "`user_post'" != "" {
local add_user_var
forvalues cun = 1/``bcount3'' {
local uwc: word count `post`cun''
if "`user_name'" != "" {
if ``bcount4''==1 {
if `cun'==1 {
local unu: list uniq user_name
local uwcn: word count `unu'
cap assert `uwc' == `uwcn'
if _rc {
dis as text "Number of unique words in user_name does not match user_post---user_name ignored."
local user_name
}
else {
local add_user_var `user_name'
local uname = 1
}
}
}
else {
local unu: list uniq name`cun'
local uwcn: word count `unu'
cap assert `uwc' == `uwcn'
if _rc {
dis as text "Number of unique words in user_name does not match user_post---user_name ignored."
local user_name
}
else {
local add_user_var `add_user_var' `name`cun''
}
}
}
if "`user_name'" == "" {
forvalues i=1/`uwc' {
if ``bcount3''==1 & ``bcount1''==1 {
local add_user_var `add_user_var' user`i'
}
else {
if ``bcount3''==1 & ``bcount1''>1 {
forvalues j=1/``bcount1'' {
local add_user_var `add_user_var' user`j'`i'
}
}
else {
local add_user_var `add_user_var' user`cun'`i'
}
}
}
}
}
}
else {
if "`user_name'" != "" {
local ern 0
local add_user_var
if "`by'"=="" | inlist("`gc'","1","2") {
local checkno 4
}
else {
local checkno 1
}
if ``bcount4''==1 {
local unu: list uniq user_name
local wcun: word count `unu'
cap assert `wcun'==`checkno'
if _rc {
local ern 1
}
else {
local add_user_var `user_name'
}
}
else {
forvalues i=1/``bcount4'' {
local unu: list uniq name`i'
local wcun: word count `unu'
cap assert `wcun'==`checkno'
if _rc {
local ern 1
}
else {
local add_user_var `add_user_var' `name`i''
}
}
}
if `ern'==1 {
dis as text "Incorrect number of user_names---user_name ignored"
local user_name
}
}
if "`user_name'" == "" {
if ``bcount1''==1 {
local add_user_var user_pe user_lci user_uci user_p
}
else {
local add_user_var
forvalues i=1/``bcount1'' {
local add_user_var `add_user_var' user`i'_pe user`i'_lci user`i'_uci user`i'_p
}
}
}
}
//name of variables to post and empty post
local add_user_var_un: list uniq add_user_var
local awc: word count `add_user_var_un'
forvalues i=1/`awc' {
local add_user_var_post_base `add_user_var_post_base' (.)
}
}
}
//dis "`add_user_var'"
//dis "`add_user_var_un'"
//dis "`add_user_var_post_base'"
************
*postfile
************
tempname res
postfile `res' str244 varname str244 varlabel str50 vtype ///
level str244 levlabel nlev `etime_unit' `stime_unit' ///
ntot_t nnonmiss_t nlev_t ///
pr_t prlci_t pruci_t ///
mean_t sd_t meanlci_t meanuci_t ///
p50_t p25_t p75_t iqr_t min_t max_t range_t sum_t ///
nevents_t etime_t ir_t irlci_t iruci_t ///
nfails_t stime_t ///
st50_t st50lci_t st50uci_t st25_t st75_t ///
rmst_t rmstlci_t rmstuci_t ///
`pvar' ///
`add_user_var_un' ///
kid ///
using "`saving'", replace
**************
*loop through variables
**************
local counter=0
foreach var of local varlist {