楼主: xingxf
22810 41

[编程问题求助] 数据分组并标记 [推广有奖]

11
sungmoo 发表于 2013-1-26 12:38:54
bys Year (MV MB),这个括号是什么意思?这里面我直接bys Year MV:不也可以么?
bys Year (MV MB):
*等价于
sort Year MV MB
by Year:

12
xingxf 发表于 2013-1-27 01:01:57
sungmoo 发表于 2013-1-25 12:08
*把缺失值去除,且年份仍然是最高分组
use example,clear
drop if MV==.|MB==.
取整的方法执行效率很高,但是出现的问题是第一组(p,q编号为0)的观察值相对少一些,最后一组(p编号9,q编号5)的观察值会多一些。
为了解决这个问题,受您_n/_N的启发,我编写了下列程序
gen MV_Deciles=1
forvalues i=1/10{
bys Year (MV): replace MV_Decile=`i' if 10*_n/_N<=`i'&10*_n/_N>`i'-1
}
gen MB_Quintiles=1
forvalues i=1/5{
bys Year MV_Deciles (MB): replace MB_Quintiles=`i' if 5*_n/_N<=`i'&5*_n/_N>`i'-1
}

13
sungmoo 发表于 2013-1-28 12:00:16
gen MV_Deciles=1
forvalues i=1/10{
bys Year (MV): replace MV_Decile=`i' if 10*_n/_N<=`i'&10*_n/_N>`i'-1
}
gen MB_Quintiles=1
forvalues i=1/5{
bys Year MV_Deciles (MB): replace MB_Quintiles=`i' if 5*_n/_N<=`i'&5*_n/_N>`i'-1
}
bys Year (MV MB): g p=ceil(10*_n/_N)
bys Year p (MB MV): g q=ceil(5*_n/_N)

*int()、floor()、ceil()对应三种取整规则。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
xingxf + 5 + 5 + 5 热心帮助其他会员

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

14
xingxf 发表于 2013-1-28 19:52:07
sungmoo 发表于 2013-1-28 12:00
bys Year (MV MB): g p=ceil(10*_n/_N)
bys Year p (MB MV): g q=ceil(5*_n/_N)
明白了,ceil的效果和我写的那个循环是一样的。就是直接进位是吧。

15
liangsky 发表于 2013-1-29 15:11:18
sungmoo的做法的确可以,
但如果数据中有很多值相等的话这种做法就未必精准。
xtile may solve 。不过要生成一个组别并循环一下。

16
xingxf 发表于 2013-1-29 19:17:57
liangsky 发表于 2013-1-29 15:11
sungmoo的做法的确可以,
但如果数据中有很多值相等的话这种做法就未必精准。
xtile may solve 。不过要生 ...
如果数据中很多值相等的话,xtile和pctile也会出现每组不等分的情况。

17
liangsky 发表于 2013-1-29 20:11:34
xingxf 发表于 2013-1-29 19:17
如果数据中很多值相等的话,xtile和pctile也会出现每组不等分的情况。
不等分问题不大,把相同值归为不同组的检验结果更不稳健。

18
xingxf 发表于 2013-1-29 20:15:10
liangsky 发表于 2013-1-29 20:11
不等分问题不大,把相同值归为不同组的检验结果更不稳健。
恩,你说这个有道理。但是用pctile做循环怎么做呢?

19
liangsky 发表于 2013-1-29 20:21:58
gen n1=.
forv i=2000/2010 {
xtile n`i'=var1 if year==`i',n(10)
replace n1=n`i' if year==`i'
drop n`i'
}

gen n2=.
forv i=2000/2010 {
forv j=1/10 {
xtile n`i'`j'=var2 if year==`i' & n1==`j',n(5)
replace n2=n`i'`j' if year==`i' & n1==`j'
drop n`i'`j'
}
}
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
xingxf + 5 + 5 + 5 热心帮助其他会员

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

20
xingxf 发表于 2013-1-29 20:56:07
liangsky 发表于 2013-1-29 20:21
gen n1=.
forv i=2000/2010 {
xtile n`i'=var1 if year==`i',n(10)
xtile这个函数是不是和egen cut, group()性质一样啊?我再仔细去查查help文档。遇到相似数值,这个函数的处理机制是什么。
这个xtile分组更科学,唯一缺点是执行效率低一些,另外一开始forv i=2000/2010这行,遇到不同数据要更改时间范围。不过分组严谨性是最重要的。
非常感谢!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-30 21:44