作为一个说明性示例,假设这是您的数据集:
cat sex age
1 1 13
1 0 14
1 1 .
2 1 23
2 1 45
2 1 15
如果您要在cat
和sex
之间创建频率表,则tabulate
这两个变量会得到以下结果:
tab cat sex
| sex
cat | 0 1 | Total
-----------+----------------------+----------
1 | 1 2 | 3
2 | 0 3 | 3
-----------+----------------------+----------
Total | 1 5 | 6
我正在编写一个涉及三个变量的Stata程序,即cat
,sex
和age
。获得前两个变量的频率矩阵只是我进一步计算所需的中间步骤。
cap program drop myexample
program def myexample, rclass byable(recall) sortpreserve
version 14
syntax varlist [aweight iweight fweight] [if] [in] [ , AGgregate ]
args var1 var2 var3
tempname F
marksample touse
set more off
if "`aggregate'" == "" {
local var1: word 1 of `varlist'
local var2: word 2 of `varlist'
local var3: word 3 of `varlist'
qui: tab `var1' `var2' [`weight' `exp'] if `touse', matcell(`F') label matcol(`var2')
mat list `F'
}
end
然而,当我跑步时:
myexample cat sex age
我得到的结果不符合我的预期:
__000001[2,2]
c1 c2
r1 1 1
r2 0 3
也就是说,假设age
包含缺失值,即使它没有直接参与制表,程序也会忽略缺失值而不考虑该观察值。我需要得到第一个表格的结果。我尝试使用summarize
代替,但同样的问题出现了。在程序内部实现时,不计算缺失值。
答案 0 :(得分:3)
您正在抱怨您在自己的程序中构建的行为。责任和解释掌握在你手中。
的影响
marksample touse
然后使用限定符
调用命令if `touse'
是忽略缺失值。 marksample
默认标记为"使用"指定所有变量具有非缺失值的观察结果;其他观察结果被标记为被忽略。它还考虑了任何if
或in
限定符和任何零权重。
正如@Noobie所解释的那样,在任何情况下,tabulate
默认情况下,从列表中省略缺失值是正确的。
因此,要获得您希望的结果,您需要修改marksample
来电
marksample touse, novarlist
并使用tabulate
选项调用missing
(如果必须这样)或允许用户指定missing
选项,然后将其传递给{{1 }}。
您还询问tabulate
。通过设计,该命令忽略了缺失值。我不知道你期望summarize
对他们做些什么。它可以报告缺失值的计数。如果您需要,还需要其他几个命令,例如summarize
或codebook
( Stata Journal )。您始终可以在计划中添加有关投失的报告,例如使用missings
计算错失并count
结果。
我了解您的计划正在进行中,因此不会评论您不会提出的详细信息。
答案 1 :(得分:2)
这是由marksample
引起的。 help mark
个州的规则5
标记变量在观察中设置为0,其中任何一个都是 varlist中的数字变量包含数字缺失值。
您应该使用novarlist选项。根据帮助文件,
novarlist用于标记样本。它指定缺少值 varlist中的变量之间不会导致标记变量设置为0。
答案 2 :(得分:0)
如果我理解你想要标签包含缺失值?如果是这样,你只需要求它
tab myvar1 myvar2, mi
来自文档
缺少:像其他值一样处理缺失值