关于数据五等分

STATA

1、egen命令+cut()函数

这种分割方法,是对感兴趣的变量的取值进行排序,然后变量的实际取值五等分。

 // 收入五等分
egen income2=cut(income), group(5)
 tab income2
// 查看五等分后的均值分布
mean income, over(income2)
income2 Freq. Percent Cum.
0 1,947 19.64 19.64
1 1,586 16 35.65
2 1,754 17.7 53.34
3 2,566 25.89 79.24
4 2,058 20.76 100
Total 9,911 100
Over Mean Std. Err. [95% Conf. Interval]
income
0 645.1798 19.65844 606.6452 683.7143
1 5340.14 46.23396 5249.512 5430.768
2 13028.83 71.89518 12887.9 13169.76
3 25492.33 93.73953 25308.58 25676.08
4 67655.16 1357.951 64993.3 70317.02

2、gen命令+group()函数

这种分割方法是根据感兴趣的变量取值排序,然后对样本五等分。

//根据收入进行排序,然后对数据集五等分。
sort income
gen income3=group(5)
tab income3
mean income, over(income3)
income3 Freq. Percent Cum.
1 1,983 20.01 20.01
2 1,982 20 40.01
3 1,982 20 60
4 1,982 20 80
5 1,982 20 100
Total 9,911 100
Over Mean Std. Err. [95% Conf. Interval]
income
1 687.9299 20.55276 647.6423 728.2175
2 6398.316 56.05585 6288.435 6508.197
3 16010.37 81.97568 15849.68 16171.06
4 27724.18 96.34285 27535.33 27913.03
5 68868.98 1402.875 66119.06 71618.9

R

cut()函数

# 利用cut()函数进行切割,生成新的因子变量income2
> cgss2 <- cgss %>% 
+ mutate(income2=cut(income, breaks=5))
# 分组求均值
> avg_income2 <- cgss2 %>%
+ group_by(income2) %>%
+ summarise(avg=mean(income))
> avg_income2
income2 avg
1 (-1e+03,2e+05] 22143.
2 (2e+05,4e+05] 315116.
3 (4e+05,6e+05] 525000
4 (6e+05,8e+05] 750000
5 (8e+05,1e+06] 1000000

这个结果和STATA的结果差别很大,主要是由于R的cut()函数是先设定最大值和最小值,然后对取值区间进行五等分。
即,上例中的cut(income, breaks=5)相当于
cut(income, breaks=c(0, 200000,400000,600000,800000, 1000000))

参见下面的例子,尤其是等效的hist()函数。

> Z <- stats::rnorm(10000)
> table(cut(Z, breaks = -6:6))

(-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1]  (-1,0]   (0,1]   (1,2]   (2,3]   (3,4]   (4,5]   (5,6] 
      0       2       7     220    1335    3510    3356    1335     225      10       0       0 

> table(cut(cgss$income, breaks=5))

(-1e+03,2e+05]  (2e+05,4e+05]  (4e+05,6e+05]  (6e+05,8e+05]  (8e+05,1e+06] 
          9860             43              4              3              1 

> hist(cgss$income, breaks=5, plot=F)
$breaks
[1] 0e+00 2e+05 4e+05 6e+05 8e+05 1e+06

$counts
[1] 9860   43    4    3    1

$density
[1] 4.974271e-06 2.169307e-08 2.017960e-09 1.513470e-09 5.044900e-10

$mids
[1] 1e+05 3e+05 5e+05 7e+05 9e+05

$xname
[1] "cgss$income"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

很明显,cut()函数是无法满足很多情况下的五等分的切割需求的。
dplyr包中的case_when()函数,是类似if_else条件判断来分组,仍需要事先知道切割点。
如果知道五等分点,不用这些函数,也可以很好地切割。
目前没有找到更好的更好用的R函数。

你可能感兴趣的:(关于数据五等分)