You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

212 lines
6.9 KiB
Plaintext

7 months ago
*! version 1.1.0 2009-12-22
* - add extended missing values - s. rohrman
capture program drop misschk
program define misschk
version 9.0 // 2009-12-22
syntax [varlist] [if] [in] ///
, [GENerate(string)] /// stub for indicator variables
[dummy] /// dummy indicator variables
[replace] /// replace variables if they exist
[NONUMber] /// . in table for missing, not #
[NOSort] /// Don't sort pattern list
[help] /// explain what is going on
[SPace] /// blank rather than _ if not missing
[EXTmiss] // show extended missing // 1.1.0
tempvar ifin
mark `ifin' `if' `in'
local notmissstr "_"
if ("`space'"=="space") {
local notmissstr " "
}
else if "`nonumber'"=="nonumber" | "`extmiss'"=="extmiss" { // 1.1.0
local notmissstr "-"
}
local sort "sort"
if "`nosort'"=="nosort" {
local sort ""
}
// using extmiss and nonumber options together = error // 1.1.0
if "`nonumber'"=="nonumber" & "`extmiss'"=="extmiss" {
di in red "Error: cannot use nonumber and extmiss options together."
exit
}
// if dummy variable option
if "`dummy'"~="" {
if "`generate'"=="" {
di in red "Error: dummy options requires use of generate option."
exit
}
capture label def lmisschk 0 NotMissing 1 Missing
}
local gennm = "`generate'"
// information on individual variables
di _n in g "Variables examined for missing values"
if "`if'" ~="" | "`in'"~="" {
di in g "For sample defined by: " in y "`if' `in'"
}
// strip off string variables
parse "`varlist'", parse(" ")
local vars
while "`1'" != "" { // loop through variables
capture confirm numeric variable `1'
if _rc==0 {
local vars "`vars' `1'"
}
mac shift
}
local varlist "`vars'"
parse "`varlist'", parse(" ")
local nvar = 0
di _n in g " # Variable # Missing % Missing"
di in g "--------------------------------------------"
quietly tab `ifin'
local total = r(N)
while "`1'" != "" { // loop through variables
local ++nvar
qui count if `1'>=. & `ifin' // count missing; changed == 1.1.0
* create binary variables indicating if observation is missing
if "`dummy'"~="" {
if "`replace'"=="replace" {
capture drop `gennm'`1'
}
quietly gen `gennm'`1' = (`1'>=.) if `ifin' // changed == 1.1.0
label var `gennm'`1' "Missing value for `1'?"
label val `gennm'`1' lmisschk
}
* list # and percent missing
di in y %3.0f " `nvar' " _col(7) "`1'" ///
_col(23) %7.0f r(N) _col(36) %6.1f 100*r(N)/`total'
mac shift
} // loop through list of variables
parse "`varlist'", parse(" ")
// loop through all variables and count missing
tempvar ismissn ismissw missw missn
quietly gen `missn' = 0 if `ifin'
label var `missn' "Missing for how many variables?"
quietly gen str1 `missw' = "" if `ifin'
label var `missw' "Missing for which variables?"
local nvar = 0
local i = 0
local ext "a b c d e f g h i j k l m n o p q r s t u v w x y z" // 1.1.0
while "`1'" != "" {
local ++nvar
* ones has only one's digit of variable number
local ones = mod(`nvar',10)
* drop tempvars from last loop
capture drop `ismissn' `ismissw'
* 1 if mssing, else 0; . if not in if in
capture quietly gen `ismissn' = (`1'>=.) if `ifin' // changed == 1.1.0
* string with indicator of missing status. Space if no missing;
* then if missing, either . or digit number.
capture quietly gen str1 `ismissw' = "`notmissstr'"
if "`nonumber'"=="nonumber" & "`extmiss'"=="" { // 1.1.0
quietly replace `ismissw' = "." if `1'>=. & `ifin' // changed == 1.1.0
}
else if "`extmiss'"=="extmiss" & "`nonumber'"=="" { // changed == 1.1.0
quietly replace `ismissw' = "." if `1'==. & `ifin'
foreach ltr in `ext' {
quietly replace `ismissw' = "`ltr'" if `1'==.`ltr' & `ifin'
}
}
else if "`nonumber'"=="" & "`extmiss'"=="" {
quietly replace `ismissw' = "`ones'" if `1'>=. & `ifin' // changed == 1.1.0
}
* add blank every 5th variable
if mod(`nvar'-1,5) == 0 {
quietly replace `missw' = `missw' + " "
}
* build string with pattern of missing data
quietly replace `missw' = `missw' + `ismissw'
* count total number of missing for given case
quietly replace `missn' = `missn' + `ismissn'
mac shift
}
capture drop `ismissn' `ismissw'
// List results
* patterns of missing data
if "`extmiss'"=="" { // 1.1.0
di _n in y "Warning: " in g ///
"this output does not differentiate among extended missing."
di in g ///
"To generate patterns for extended missing, use extmiss option."
}
if "`help'"=="help" {
di in g _n ///
"The columns in the table below correspond to the # in the table above."
di in g ///
"If a column is blank, there were no missing cases for that variable."
}
if "`help'"=="help" & "`extmiss'"=="extmiss" { //1.1.0
di _n
di _n in g ///
"Letters in each column refer to the extended missing for the"
di in g ///
"corresponding variable"
}
tab `missw' if `ifin', `nosort'
* number missing for given observations
if "`help'"=="help" {
di _n in g ///
"Table indicates the number of variables for which an observation"
di in g ///
"has missing data."
}
tab `missn' if `ifin'
// create variables with pattern and number of missing cases
if "`generate'" != "" {
if "`replace'"=="replace" {
capture drop `gennm'pattern
capture drop `gennm'number
}
clonevar `gennm'pattern = `missw'
clonevar `gennm'number = `missn'
if "`help'"=="help" {
di _n in g "Variables created:" // added end quote 1.1.0
di in y " `gennm'pattern" in g ///
" is a string variable showing the pattern of missing data."
di in y " `gennm'number" in g ///
" is the number of variables for which a case has missing data."
di in y " `gennm'<varnm>" in g ///
" is a binary variable indicating missing data for <varnm>."
}
}
end
exit
* version 1.0.1 06Jul2005
* version 1.0.0 13Apr2005