为什么在将连续变量转换为分类变量时会生成缺失值?

时间:2014-07-08 17:11:56

标签: stata

我想将连续变量avepr∈[0,1]转换为以下类别:

  0 ≤ x < 0.1
0.1 ≤ x < 0.2
0.2 ≤ x < 0.3
0.3 ≤ x < 0.4
0.4 ≤ x < 0.5
0.5 ≤ x < 0.6 
0.6 ≤ x < 0.7
0.7 ≤ x < 0.8
0.8 ≤ x < 0.9
0.9 ≤ x ≤ 1

为了实现它,我使用以下代码:

egen aveprcat=cut(avepr),at(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1)

如果我将1而不是1.1,则忽略等于1的观测值。这是确保不跳过1的值的正确方法吗?

我还收到一条消息,表明生成了2175个缺失值。我尝试使用

查看这些值是什么样的
tab aveprcat if avepr<=1, m
tab aveprcat,m

这是我得到的:

tab aveprcat if avepr<=1, m
 aveprcat |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |    499,111       57.69       57.69
         .1 |    238,756       27.60       85.29
         .2 |     85,082        9.83       95.13
         .3 |     27,999        3.24       98.36
         .4 |      7,554        0.87       99.24
         .5 |      2,868        0.33       99.57
         .6 |        757        0.09       99.66
         .7 |        170        0.02       99.67
         .9 |      2,813        0.33      100.00
------------+-----------------------------------
      Total |    865,110      100.00




tab aveprcat,m

   aveprcat |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |    499,111       57.55       57.55
         .1 |    238,756       27.53       85.08
         .2 |     85,082        9.81       94.89
         .3 |     27,999        3.23       98.12
         .4 |      7,554        0.87       98.99
         .5 |      2,868        0.33       99.32
         .6 |        757        0.09       99.41
         .7 |        170        0.02       99.42
         .9 |      2,813        0.32       99.75
          . |      2,175        0.25      100.00
------------+-----------------------------------
      Total |    867,285      100.00

我很困惑那些丢失的值,我没有大于1的值。为什么这两个表彼此不同? 我的观察总数是867,285。

经过进一步审核,

tab aveprcat if avepr<=0.1

tab aveprcat if avepr<0.1

生成相同的信息:

   aveprcat |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |    499,111      100.00      100.00
------------+-----------------------------------
      Total |    499,111      100.00

2 个答案:

答案 0 :(得分:3)

从统计数据来看,您只是在丢弃信息,而且很难想象为什么会这样。

就Stata而言:你想要将[0,1]上的变量以.1的间隔向下舍入。我完全没有使用egen, cut(),尤其是因为查找并输入语法是单调乏味的;更重要的是因为我更喜欢在边界处发生的事情的语法。给定这样一个变量y

gen y2 = floor(10 * y)/10

将是我的第一个电话,虽然确切的1会映射到1,这不是你想要的。

你对这些失误的探索并没有告诉我们它们存在的事实。试试

tab avepr if missing(aveprcat)
su avepr if missing(aveprcat), detail 

答案 1 :(得分:3)

我会尝试补充@NickCox给出的答案,只要原始海报仍然怀疑错误的来源。

我认为,最重要的事情是,Stata中的缺失值被认为是“非常大的数字”。一旦理解了这个,神秘就会消失。

对于egen, cut(),如果值不在剪切指定的范围内,则代码将产生缺失。这个值可能是缺失的(我们只是说它被认为是一个非常大的数字)或任何任意的非缺失值。关于缺失,尼克的代码将给出完全相同的结果,但是如果存在超出范围的非缺失,则这不再成立。一个例子:

clear all
set more off

*----- example data -----

set obs 15
set seed 2134976

gen x = runiform()
replace x = 2.5 in 5  // this is an out-of-range non-missing
replace x = . in 10   // this is a missing

list

*----- cut -----

egen xcut = cut(x),at(0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1.1)
gen xnick = floor(10 * x)/10

sort x
list

为什么这两个表的问题

tabulate aveprcat if avepr <= 1, missing
tabulate aveprcat, missing

是不同的,再次与失踪被认为是一个非常大的数字。 tabulate aveprcat if avepr <= 1, missing不会显示错误,因为您限制avepr <= 1的情况。因此,avprcatavpr的相应缺失的任何观察都会从一开始就排除在外。继续这个例子,我们有:

. tabulate xcut, missing

       xcut |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |          3       20.00       20.00
         .1 |          2       13.33       33.33
         .2 |          2       13.33       46.67
         .4 |          1        6.67       53.33
         .5 |          1        6.67       60.00
         .6 |          3       20.00       80.00
         .8 |          1        6.67       86.67
         .9 |          1        6.67       93.33
          . |          1        6.67      100.00
------------+-----------------------------------
      Total |         15      100.00

. tabulate xcut if x <= 1, missing

       xcut |      Freq.     Percent        Cum.
------------+-----------------------------------
          0 |          3       21.43       21.43
         .1 |          2       14.29       35.71
         .2 |          2       14.29       50.00
         .4 |          1        7.14       57.14
         .5 |          1        7.14       64.29
         .6 |          3       21.43       85.71
         .8 |          1        7.14       92.86
         .9 |          1        7.14      100.00
------------+-----------------------------------
      Total |         14      100.00

第二个命令仅在xcut时要求将x <= 1列表。但对于所有x <= 1egen, cut()不会为xcut产生任何遗漏,因此不会显示任何遗漏。无条件tabulate会产生不同的结果。