楼主: xingxf
13188 28

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

  • 0关注
  • 50粉丝

已卖:3687份资源

副教授

12%

还不是VIP/贵宾

-

威望
0
论坛币
60582 个
通用积分
772.5645
学术水平
224 点
热心指数
251 点
信用等级
138 点
经验
20775 点
帖子
753
精华
0
在线时间
522 小时
注册时间
2011-3-12
最后登录
2025-4-1

楼主
xingxf 发表于 2013-1-30 01:14:37 |AI写论文
10000论坛币
有如下面板数据:
ID      group    year        MV             MB       MV_Deciles     MB_quintiles     R
1           N       2001       689            0.6            1                      1              886
1           N       2002       886            3               1                      2              333
...
6           N       2008       10369        9               10                    9              217
...
66         Q       2003       987            3.6             .                      .
...
88         A        2001       682           0.596          .                      .
...
99         A        2007       369            1.2             .                      .
...
目前只有group为N的数据每year依据MV数值大小分为10组(MV_Deciles),并在每MV分组中按MB大小分为5组(MB_quintiles)。其他group(Q、A等)均未分组,因此MV_Decile和MB_quintiles位置均显示为缺失值。现要求其它group的数据要按照MV和MB数值大小和已有group N的MV和MB近似程度进行分组标记,并将该组对应的RE值(每年每MV,MB分组都有一R值)填入本行R对应位置。例如:在以上示例中ID为88,group为A,year为2001这个观察值应标记为:MV_Deciles为1, MB_quintiles为1,R为886


示例文件如下:
example.rar (721.16 KB) 本附件包括:
  • example.dta

最佳答案

sungmoo 查看完整内容

/*重新总结一下楼主的原数据中的问题: (1)原数据并非panel data (2)原分组(N组)中,当year相同时,MV_、MB_并未按MV、MB的大小生成 (3)原分组(N组)中,当数组(year, MV_, MB_)相同时,R未必相同*/ *如果,当group="N"时,MV_=1组内的MV的最大值a小于MV_=2组内的MV的最小值b,而group!="N"时,MV存在介于a与b之间的值,这样的MV值归入哪组? ********** *针对楼主的原数据库,先做以下预处理(可产生p ...
关键词:相似度 Group Tile year 示例文件

回帖推荐

monstersivle 发表于21楼  查看完整内容

楼主的原数据中R与year MV_ MB_的匹配出奇地精确, 【会不会是先出的MV_ MB_ ,后通过某算法赋值给R变量的?】 检查办法: use example,clear keep if group=="N" gen nr=year*1000+MV_*10+MB_*1 tabout nr using x.xls, c(min R max R N R) sum replace 每组最小值=最大值,证明单一性 截取 用此方法检查sungmoo荣誉版主的解法:keep if group=="N" gen nr=year*1000+p*10+q*1 rename r rnew tabout nr using y. ...

monstersivle 发表于15楼  查看完整内容

仍无解?提一个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, ...

沙发
sungmoo 发表于 2013-1-30 01:14:38
/*重新总结一下楼主的原数据中的问题:

(1)原数据并非panel data

(2)原分组(N组)中,当year相同时,MV_、MB_并未按MV、MB的大小生成

(3)原分组(N组)中,当数组(year, MV_, MB_)相同时,R未必相同
*/

*如果,当group="N"时,MV_=1组内的MV的最大值a小于MV_=2组内的MV的最小值b,而group!="N"时,MV存在介于a与b之间的值,这样的MV值归入哪组?

**********

*针对楼主的原数据库,先做以下预处理(可产生panel data;且当year相同时,MV_按MV大小得出;当数组(year, MV_)相同时,MB_按MB大小得出):

duplicates drop ID year,force
drop MV_ MB_
bys year: cumul MV if group=="N",eq g(MV_)
replace MV_=ceil(10*MV_)
bys year MV_: cumul MB if group=="N",eq g(MB_)
replace MB_=ceil(5*MB_)


*以下忽略各原分组的上临界值(只采用下临界值),对非N组观测值分组(以p与q标识):

sort year MV MV_
egen t=tag(year MV_) if MV_>1
by year: g p=sum(t)+1
sort year MV_ MB MB_
egen s=tag(year MV_ MB_) if MB_>1
by year MV_: g q=sum(s)+1
drop t s


*若R严格代表组共值(即当数组(year, MV_, MB)相同时,R也相同),可接着:
bys year p q: egen r=min(R)


*本题其实并不是很复杂的问题,关键在于原始数据以及处理规则是否清晰。
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 2 + 2 + 2 热心帮助其他会员
monstersivle + 1 + 1 + 1 xtset+duplicates drop:经典操作

总评分: 经验 + 100  论坛币 + 10  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

藤椅
monstersivle 发表于 2013-1-30 23:59:20
请问:数据相似度那个R是怎么定义的,如何计算得到的,请提供算法、公式、函数,多谢
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

板凳
xingxf 发表于 2013-1-31 01:51:09
monstersivle 发表于 2013-1-30 23:59
请问:数据相似度那个R是怎么定义的,如何计算得到的,请提供算法、公式、函数,多谢
R不是什么计算得到的,对于已经分好的组,每一组有一个R值对应。数据相似度,就是说一个未分组的观察值,先看其MV值应该在哪个MV_Decile里面,确定好这个MV_Decile分组后,再看MB值与这个MV_Decile中的哪组MB分组相似,从而确定其MB_quintile分组。每个MV_Decile,MB_quintiles组合都有一个对应的R值,只要能确定分组,那R值自然也就确定了。

报纸
monstersivle 发表于 2013-1-31 02:29:12
xingxf 发表于 2013-1-31 01:51
R不是什么计算得到的,对于已经分好的组,每一组有一个R值对应。数据相似度,就是说一个未分组的观察值, ...
这个R的值稀奇古怪的(跟观测值的其它变量值都沾不上边),
不知道是怎么来的 (而且A组、Q组的R还要单独生成,有必要知道其算法),
上面给的解释还在琢磨,
楼主可以进一步用以下这个数据样本举例说明么?先表示感谢(这是跟聚类分析这个领域有关么?以前没有接触过,或者接触过基础的,但是不知道专业叫法):
IDgroupyearMVMBMV_DecilesMB_QuintilesR

83335

N

2001

477

6.558141

1

3

22.29092

83334

N

2001

700.89

0.052175

1

1

-1.27571

88393

N

2001

828

6.522094

1

3

22.29092

80859

N

2001

2527.84

16.8

1

4

43.50494

86366

N

2001

2706

4.918033

1

2

14.32766

85777

N

2001

3306

7.962617

1

3

22.29092

88483

N

2001

3442.775

0.315788

1

1

-1.27571

85254

N

2001

3630.5

10.66667

1

4

43.50494

59256

N

2001

3874.05

36

1

5

150.2128

84782

N

2001

4064

20

1

4

43.50494

79655

N

2001

4545.84

133.3714

1

5

150.2128

86750

N

2001

5759.05

9.031803

1

3

22.29092

84164

N

2001

5877.08

11.04

1

4

43.50494

81031

N

2001

6599.85

9.000001

1

3

22.29092

10753

N

2001

6662.72

27.77143

1

5

150.2128

87444

N

2001

6772.5

1.268291

1

1

-1.27571

79059

N

2001

6870.5

37.5

1

5

150.2128

77162

N

2001

6920.85

46.56

1

5

150.2128



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

地板
xingxf 发表于 2013-1-31 08:02:38
monstersivle 发表于 2013-1-31 02:29
这个R的值稀奇古怪的(跟观测值的其它变量值都沾不上边),
不知道是怎么来的 (而且A组、Q组的R还要单独 ...
这个不用管R是怎么来的,R是对于每一个MV_deciles和MB_quintiles分组,都有一个R值对应。比如你看第一行数据和第三行数据,这两个观察值的MV_Deciles均为是1,MB_Quintiles均为3,他们的R值就一样。我不知道解释清楚没有,这个R是每一个MV,MB分组的一个共有特性。找到合适的分组,也就找到了R值。

7
monstersivle 发表于 2013-1-31 08:32:09
xingxf 发表于 2013-1-31 08:02
这个不用管R是怎么来的,R是对于每一个MV_deciles和MB_quintiles分组,都有一个R值对应。比如你看第一行数 ...
好吧, 那就痛快点吧,我舍掉R好了:
以下是对照情况:
group -> year -> mv -> mv_decile -> mb -> mb_quintile每组每年生成MV的10个十分位(存入MV_dec)标记1-10,每组十分位(1-10中取一个)观测值下,
依据MB做五分位标记(存入MB_quin)
程序(生成quantiles用xtile命令, 要几个quantiles,就在选项nquantile()填几个,这里就分别是10和5):(我先删掉了已有的十分位和五分位,这样干净一点儿,且不知道之前它们是怎么做出来的)
use example,clear
drop MV_* MB_*
sort group year MV MB
gen MV_dec=0
gen MB_quin=0
qui levelsof group, local(group)
foreach g of local group {
        forv i=2001/2011{
                xtile dec=MV if group=="`g'" & year==`i', nq(10)
                forv j=1/10{
                        xtile quin=MB if group=="`g'" & year==`i' & dec==`j', nq(5)
                        replace MB_quin=quin if group=="`g'" & year==`i' & dec==`j'
                        drop quin
                }
                replace MV_dec=dec if group=="`g'" & year==`i'
                drop dec
        }
}
sort group year MV MB
sort group year MV_dec MB_quin
br
嵌套循环很慢,1分多钟才跑完,必有更快办法,还望集思广益刚查看了,出来的结果与源数据不一致(组N的R值不同)
wrong.jpg

因为组A,组Q的R变量都是missing,程序里没法加到什么条件里,难道你的意思是说,各组group各年生成完十分位和五分位以后,用组N的R值替换掉组A,组Q中跟组N同年同十分位标识mv_dec同五分位标识mb_quin的观测值的R值?


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

8
xingxf 发表于 2013-1-31 08:55:13
monstersivle 发表于 2013-1-31 08:32
好吧, 那就痛快点吧,我舍掉R好了:
以下是对照情况:
group -> year -> mv -> mv_decile -> mb -> mb ...
这个可能是我描述不清,你没理解。你第一句就drop掉了MV_Deciles和MB_quintiles了,这个是不允许的。我是要求其他Group的观察值必须按照目前Group N的分组情况,以MV和MB值相似Group N的情况进行分组,不能去掉原分组。所以为什么R总是困扰你,看来是我没让你明白意思。只要依据N组的分组,找到Q和A的分组,直接将N分组的R值替换进去就行了。
至于Group 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)
这是我在前面的帖子里的问题,这个程序的写法是sungmoo的建议,讨论过程你可以去那个帖子看看。

谢谢啦!

9
monstersivle 发表于 2013-1-31 09:30:32
xingxf 发表于 2013-1-31 08:55
这个可能是我描述不清,你没理解。你第一句就drop掉了MV_Deciles和MB_quintiles了,这个是不允许的。我是 ...
这程序结果有问题:
use example,clear
keep if group=="N"
bysort year: cumul MV, gen(cumMV) equal
gen MV_dec=ceil(10*cumMV)
f2.jpg
确定原数据是按着这个方法生成的十分位和五分位标记?
(即组N每年的MV_Deciles, MB_Quintiles)



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

10
xingxf 发表于 2013-1-31 22:18:51
monstersivle 发表于 2013-1-31 09:30
这程序结果有问题:
use example,clear
keep if group=="N"
这个程序没问题,我是按这个程序出的十分位和五分位。这个程序的合理性你可以通过tab MV_Deciles M2B_Quintiles 看看分布是否均匀,通过by year MV_Deciles: sum MV和by year MV_Deciles M2B_Quintiles: sum MB来检验各分组是不是严格按照大小分布的。

cumul这个函数是得出百分比分布情况,ceil这个是强制进位,这两个函数结合起来很科学。

至于您出的那个问题,我不清楚是怎么回事。而且这个问题和我一开始怎么得到的Group N的分组没关系,核心是按照N的情况,把group Q和A对号入座。举个别的例子吧,好比是现在有一群人排队,已经按身高分了十组并在每组中按体重分了5组,这样就分了50组。现在还有别的人要加入队伍,要求就不再折腾已经分好组的人了,别的人按自己的身高体重找已经分的组,加进去就行了。

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

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