📄 statsby.ado
字号:
// save labels for the generated vars
forval i = 1/`K' {
local name : word `i' of `names'
local label = substr(`"`exp`i''"',1,80)
label variable `name' `"`label'"'
}
label data `"statsby: `cmdname'"'
if `"`filetmp'"' == "" {
quietly save `"`saving'"', replace
}
else {
// make c(changed) != 0
tempname changed
unab vlist : *
gettoken n1 vlist : vlist
while substr("`n1'",1,1) == "_" {
gettoken n1 vlist : vlist
}
if "`n1'" != "" {
if substr("`:type `n1''",1,3) == "str" {
local changed = `n1'[1]
quietly replace `n1' ///
= cond(mi("`changed'"),"junk","") in 1
quietly replace `n1' = "`changed'" in 1
}
else {
scalar `changed' = `n1'[1]
quietly replace `n1' ///
= cond(missing(`changed'),0,.) in 1
quietly replace `n1' = `changed' in 1
}
}
else {
// all the variable start with "_"
quietly generate changed = . in 1
drop changed
}
}
global S_FN
global S_FNDATE
return local by `by'
end
program PostGroups, rclass
version 8, missing
local version : di "version " string(_caller()) ", missing:"
// parse
syntax varlist(max=1) =exp, /// tousevar = # of exps
cmd(string asis) ///
command1(string asis) ///
postname(string) ///
[ ///
command2(string asis) ///
by(varlist) ///
by0(varlist) ///
count(integer 0) ///
dots(string) ///
NOIsily ///
TRace ///
subset ///
total ///
express(string asis) ///
inable ///
]
local touse `varlist'
if `"`command2'"' != "" {
local command2 `", `command2'"'
}
// get expressions
local K `exp'
confirm integer number `K'
forval i = 1/`K' {
gettoken stuff express : express , match(parens)
local exp`i' `stuff'
}
if `"`subset'"' == "" {
local subset group
}
// by varlist with individual parens: for -post-
tempname byobs
scalar `byobs' = 1
foreach name of local by {
local misby `misby' (.)
local pby `pby' (`name'[`byobs'])
}
if "`trace'" != "" {
local noisily noisily
local traceon set trace on
local traceoff set trace off
}
local noi = cond("`noisily'"=="", "*", "noi")
forval i = 1/`K' {
tempname x`i'
local misexps `misexps' (.)
local pexps `pexps' (`x`i'')
}
if `"`by'"' == "" | `"`by0'"' == "" {
local count = `count' + 1
// run command and post results
`noi' di as txt _n ///
"running (" as inp `"`cmd'"' as txt ") on `subset' `count'" _n
`noi' di as inp ". `cmd'"
`traceon'
capture `noisily' `version' `cmd'
`traceoff'
if (c(rc) == 1) error 1
`dots' `count' `c(rc)'
if c(rc) {
`noi' di in smcl as err ///
`"{p 0 0 2}captured error running (`cmd'), posting missing values{p_end}"'
post `postname' `pby' `misexps'
}
else {
forval i = 1/`K' {
capture scalar `x`i'' = `exp`i''
if (c(rc) == 1) error 1
if c(rc) {
if c(rc) == 1 {
error 1
}
`noi' di in smcl as error ///
`"{p 0 0 2}captured error in `exp`i'', posting missing value{p_end}"'
scalar `x`i'' = .
}
}
post `postname' `pby' `pexps'
}
}
else {
if "`total'" != "" {
`traceon'
capture `cmd'
`traceoff'
if (c(rc) == 1) error 1
if c(rc) {
`noi' di in smcl as err ///
`"{p 0 0 2}captured error running (`cmd'), posting missing values{p_end}"'
post `postname' `pby' `misexps'
}
else {
forval i = 1/`K' {
capture scalar `x`i'' = `exp`i''
if (c(rc) == 1) error 1
if c(rc) {
`noi' di in smcl as error ///
`"{p 0 0 2}captured error in `exp`i'', posting missing value{p_end}"'
scalar `x`i'' = .
}
}
post `postname' `misby' `pexps'
}
}
// groups
local sortvars : sortedby
if "`inable'" == "" {
local fast 0
}
else {
capture tsset
if c(rc) {
local fast 1
}
else {
local fast 0
}
}
// begin code split for tsset data
if !(`fast') { // data is tsset
sort `touse' `by0'
tempvar group
by `touse' `by0' : gen `group' = (_n==1)
quietly replace `group' = sum(`group')
quietly replace `group' = . if missing(`touse')
summ `group', mean
local ngrp = r(max)
if `"`sortvars'"' != "" {
sort `sortvars'
}
tempvar id
quietly gen `id' = _n
forvalues i = 1/`ngrp' {
local count = `count' + 1
sum `id' if `group'==`i', mean
scalar `byobs' = r(min)
`noi' di as txt _n ///
"running (" as inp `"`cmd'"' as txt ") on `subset' `count'" _n
`noi' di as inp ". `cmd'"
`traceon'
capture `noisily' `command1' ///
if `touse' == 1 & `group' == `i' ///
`command2'
`traceoff'
if (c(rc) == 1) error 1
local bad = c(rc) != 0
if c(rc) {
`noi' di in smcl as err ///
`"{p 0 0 2}captured error running (`cmd'), posting missing values{p_end}"'
post `postname' `pby' `misexps'
}
else {
forval i = 1/`K' {
capture scalar `x`i'' = `exp`i''
if (c(rc) == 1) error 1
if c(rc) {
local bad 1
`noi' di in smcl as error ///
`"{p 0 0 2}captured error in `exp`i'', posting missing value{p_end}"'
scalar `x`i'' = .
}
}
post `postname' `pby' `pexps'
}
`dots' `count' `bad'
}
}
else { // data is not tsset (`fast' == 1)
sort `touse' `by0' `sortvars'
local sortvarsbase: sortedby
tempvar grpcnt
quietly bys `touse' `by0' ///
: gen `grpcnt' = _N if `touse'==1
quietly count if `touse'==1
local usecnt=r(N)
local j=1
while `j'<=`usecnt' {
local sortvarsnow : sortedby
local samesort ///
: list sortvarsnow == sortvarsbase
if !`samesort' sort `sortvarsbase'
local end=`j'+`grpcnt'[`j']-1
local count = `count' + 1
scalar `byobs' = `j'
`noi' di as txt _n ///
"running (" as inp `"`cmd'"' as txt ") on `subset' `count'" _n
`noi' di as inp ". `cmd'"
`traceon'
capture `noisily' `command1' ///
in `j'/`end' `command2'
`traceoff'
if (c(rc) == 1) error 1
local bad = c(rc) != 0
if c(rc) {
`noi' di in smcl as err ///
`"{p 0 0 2}captured error running (`cmd'), posting missing values{p_end}"'
post `postname' `pby' `misexps'
}
else {
forval i = 1/`K' {
capture scalar ///
`x`i'' = `exp`i''
if (c(rc) == 1) error 1
if c(rc) {
local bad 1
`noi' di in smcl as error ///
`"{p 0 0 2}captured error in `exp`i'', posting missing value{p_end}"'
scalar `x`i'' = .
}
}
post `postname' `pby' `pexps'
}
local j=`end'+1
`dots' `count' `bad'
}
} // end of code split for tsset data
}
return scalar N_groups = `count'
end
program SubSets, rclass
version 8, missing
local version : di "version " string(_caller()) ", missing:"
// parse
syntax varlist(max=1) =exp, /// tousevar = # of exps
[ ///
by(varlist) ///
express(passthru) ///
* ///
]
local bynum : word count `by'
tempname M
GetMat `bynum' `M'
local rnum = 2^`bynum'
local count = 0
forval i = 1/`rnum' {
tokenize `by'
preserve
local by0
forval j = 1/`bynum' {
if `M'[`i',`j'] {
local by0 `by0' ``j''
}
else quietly replace ``j'' = .
}
`version' PostGroups `varlist' `exp', ///
by(`by') ///
by0(`by0') ///
count(`count') ///
subset ///
`express' ///
`options'
local count = r(N_groups)
restore
}
return scalar N_subsets = `count'
end
// The following generates a matrix of 0's and 1's, each row determining a
// unique subset among all possible subsets.
program GetMat
args bynum M
local rnum = 2^`bynum'
mat `M' = J(`rnum', `bynum',0)
local i 0
while `i' <= `rnum'-1 {
local j = `bynum'
local a `i'
while `j' > = 1 {
if `a' == 0 {
local j = 0
}
else {
local b mod(`a', 2)
local a int(`a'/2)
mat `M'[`i'+1,`j'] = `b'
local j = `j' - 1
}
}
local i = `i' + 1
}
end
exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -