我想将连续变量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
答案 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
的情况。因此,avprcat
中avpr
的相应缺失的任何观察都会从一开始就排除在外。继续这个例子,我们有:
. 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 <= 1
,egen, cut()
不会为xcut
产生任何遗漏,因此不会显示任何遗漏。无条件tabulate
会产生不同的结果。