楼主: xingxf
13191 28

[编程问题求助] 按数值相似度编入已有分组并标记 [推广有奖]

11
luckykong 发表于 2013-1-31 23:49:15
看了一会,不明白为什么不用 gen里面的group命令,是有特殊顾忌吗?可是没看到啊
sort group MV
by group: replace MV_Deciles = group(10) if MV_D == .
sort group MV
by group: replace MB_Q = group(5) if MB_Q == .

这样之后不就都分好组了吗?
preserve
keep if group == "N"
keep MV_D MB_Q R
duplicates drop _all, force
save new.dta
restore
然后按照m:1 将 new.dta, merge进来不可以吗

12
xingxf 发表于 2013-2-1 01:11:58
luckykong 发表于 2013-1-31 23:49
看了一会,不明白为什么不用 gen里面的group命令,是有特殊顾忌吗?可是没看到啊
sort group MV
by group ...
您试试就知道了,您的答案和我的要求不是一个意思

13
xingxf 发表于 2013-2-1 08:26:20
luckykong 发表于 2013-1-31 23:49
看了一会,不明白为什么不用 gen里面的group命令,是有特殊顾忌吗?可是没看到啊
sort group MV
by group ...
不是让重新分组,而是让每分组的按照已经分好组的情况标记。
请看上面一帖“举个别的例子吧,好比是现在有一群人排队,已经按身高分了十组并在每组中按体重分了5组,这样就分了50组。现在还有别的人要加入队伍,要求就不再折腾已经分好组的人了,别的人按自己的身高体重找已经分的组,加进去就行了。”

14
monstersivle 发表于 2013-2-1 09:14:07
xingxf 发表于 2013-1-31 22:18
这个程序没问题,我是按这个程序出的十分位和五分位。这个程序的合理性你可以通过tab MV_Deciles M2B_Qui ...
好,醍醐灌顶般的例子,肯定地回答了前贴的疑问。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

15
monstersivle 发表于 2013-2-1 23:19:02
仍无解?提一个dirty的思路吧(估计跑起来也不慢):

先:
楼主跟帖已描述清任务:
根据R变量已有值的组N的分年mv_dec和mb_quin分位标记符, 给其它组(如A、Q)的R变量复制

再:
思路:
1、只保留组N的观测值, 另存数据库N.dta。
keep if group=="N"
之后,只保留:年变量、分位标记符、R变量,去掉重复观测值,导出重命名数据集(比如:R.dta)
keep year mv_dec mb_quin R
duplicates drop
save R, replace
2、按着sungmoo版主的办法,即cumul, equal + ceil()取上界整数,分别得到它组分位标记符(十分位、五分位),分别用组名另存为数据集(比如:A.dta, Q.dta)
实现的话可:
qui levelsof group if group!="N", local(group)
foreach i of local group {...}
里面导出的时候可直接:save `i', replace具体(为检验,重思路):
qui levelsof group if group!="N",local(group)
foreach i of local group{
        bys year: cumul mv if group==`i', equal gen(dec)
        replace mv_dec=ceil(dec*10) if group==`i'
        bys year mv_dec: cumul mb if group==`i' , equal gen(quin)
        replace mb_quin=ceil(quin*5) if group==`i'
        drop dec quin
        save `i',replace
}
3、循环merge, A.dta跟R.dta, Q.dta跟R.dta merge, (merge有选项是直接用using的变量值覆盖掉main数据集里的,即update)
foreach i of local group{
        use `i',clear
        merge m:1 year mv_dec mb_quin using R, update
        save `i',replace
}
4、A.dta, Q.dta append到 N.dta,
foreach i of local group{
        use `i',clear
        append using N
        save final,replace
}
注:因需用到本地宏local macro,需整体一并执行:
以下程序经测,可行,很快跑完,请检验(怎么检验啊?)
use example,clear
keep if group=="N"
save N,replace
keep year MV_Deciles MB_Quintiles R
duplicates drop
save R,replace
use example,clear
qui levelsof group if group!="N",local(group)
foreach i of local group{
        bysort year: cumul MV if group=="`i'", equal gen(dec)
        replace MV_Deciles=ceil(dec*10) if group=="`i'"
        bysort year MV_Deciles: cumul MB if group=="`i'" , equal gen(quin)
        replace MB_Quintiles=ceil(quin*5) if group=="`i'"
        drop dec quin
        save "`i'",replace
}
foreach i of local group{
        use "`i'",clear
        merge m:1 year MV_Deciles MB_Quintiles using R, update
        save "`i'",replace
}
foreach i of local group{
        use "`i'",clear
        append using N
        save final,replace
}
sort group year MV_Deciles MB_Quintiles R
br
此法太麻烦(merge不用其它组一个一个倒腾,输出个R的nonmissing数据集,直接回来按着year MV_Deciles MB_Quintiles 定位做R的update就好了),参:楼下解(根据luckykong解法改制)
检查了此贴方法,组N的分位标记与源不一致:
use example,clear
bysort year: cumul MV if group=="N", equal gen(dec)
replace dec=ceil(dec*10) if group=="N"
bysort year dec: cumul MB if group=="N" , equal gen(quin)
replace quin=ceil(quin*5) if group=="N"
sort group year MV_Deciles MB_Quintiles
br if group=="N"
2013-2-1 22-56-25.jpg
是这么个分组方法么???哪里错了???




不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

16
monstersivle 发表于 2013-2-2 05:07:57
luckykong 发表于 2013-1-31 23:49
看了一会,不明白为什么不用 gen里面的group命令,是有特殊顾忌吗?可是没看到啊
sort group MV
by group ...
这个在gen下的group()函数是做什么的?没找到help。
只见过egen下的group(varlist)(多)变量值分组。
难道这个group(#),就是按着by中变量值从大到小排序,平均分配观测值个数给各组(组定义依据的varlist分别是:1st. group year MV; 2nd. group year MV_Deciles MB)
高啊!
那精确解是这个咯:
use example,clear
bysort group year MV: replace MV_Deciles = group(10) if MV_Deciles==.
bysort group year MV_Deciles MB: replace MB_Quintiles=group(5) if MB_Quintiles==.
save work,replace
keep if group == "N"
keep year MV_Deciles MB_Quintiles R
duplicates drop
save R.dta,replace
use work,clear
merge m:1 year MV_Deciles MB_Quintiles using R,update nogenerate
sort group year MV_Deciles MB_Quintiles R
br
好,刚按此法核对了一下组N的分位数分组情况,结果不对啊, (还仅是十分位的):use example,clear
sort group year MV
bys group year MV: gen dec = group(10)
sort group year MV_Deciles MB_Quintiles dec
br if group=="N"
见图:
2013-2-1 22-45-59.jpg


不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

17
xingxf 发表于 2013-2-2 10:41:45
monstersivle 发表于 2013-2-2 05:07
这个在gen下的group()函数是做什么的?没找到help。
只见过egen下的group(varlist)(多)变量值分组。
...
他那个Group方法是不行的,实际上他没明白这个问题的意思。

18
xingxf 发表于 2013-2-2 10:43:29
monstersivle 发表于 2013-2-1 23:19
仍无解?提一个dirty的思路吧(估计跑起来也不慢):

先:
主要的问题是没有找相似组的思路。

19
xingxf 发表于 2013-2-3 00:30:28
sungmoo 发表于 2013-2-2 15:39
*由下可知,楼主的数据并不是panel data
xtset ID year
当时得到N组的分类,是用的如下命令:
bys year: cumul(MV), gen (cumMV) equal
gen MV_Deciles=ceil(10*cumMV)
bys year MV_Deciles: cumul(MB), gen (cumMB) equal
gen M2B_Quintiles=ceil(5*cumMB)
但是您说的这个问题怎么出的,我还真得仔细查查。

20
monstersivle 发表于 2013-2-3 01:14:40
sungmoo 发表于 2013-2-2 15:39
*由下可知,楼主的数据并不是panel data
xtset ID year
是啊,我也怀疑原分组是否是像楼主说的按照cumul, equal + ceil()做的。
xtset ID year的结果是
repeated time values within panel
r(451);
依据您的解法,跑完,结果也与原数据不一致:
sort group year p q r
order group year MV_ MB_ p q R r
br if group=="N"
2013-2-2 17-58-11.jpg 2013-2-2 18-01-46.jpg
另,求解释: gen下的group()函数(不是egen下的那个)



不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-22 06:48