楼主: xueyuan456
54826 88

[数据管理求助] 求助:选分组配对用循环语句OR PSMATCH2?   [推广有奖]

31
sungmoo 发表于 2012-3-31 19:31:41
仍以match3数据为例,在上述规则下,不知程序如何改进?
见21楼修正。

32
qjq 发表于 2012-4-1 16:06:53
受用匪浅!非常感谢!

33
无尘第二 发表于 2012-4-9 19:55:06
*year与stkcd的各种组合应是唯一的(或者说,它们可以用来定义panel data)。若不是,可用duplicates drop来保证。
*从而只需在两处加上year以确定唯一性即可(另外可以再精减几步):

use match3.dta, clear
bys year ind daq sp (stkcd): g exp=_n if sp
bys year ind daq: egen s=max(exp)
drop if s==.
expandcl s if !sp,cl(year stkcd) gen(g)
bys year stkcd: replace exp=_n if !sp
bys year ind daq exp: egen r=sum(roa*sp)
g q=abs((roa-r)/r) if !sp

*(根据30楼的原则)若要sp=0的观测值最多匹配一次:在此处增加以下两步(否则直接删除以下两步即可)
bys year ind daq stkcd: egen t=min(q) if !sp
drop if t!=q&!sp

bys year ind daq exp: egen u=min(q) if !sp
drop if u!=q&!sp
egen mat=group(year ind daq exp)
drop exp-u
sort mat sp
发现小问题:跑完之后还有34个未成功配对的样本。
试输入下列命令:
bys mat:gen t=_N
codebook t

得到:
  type:  numeric (float)

                 range:  [1,2]                        units:  1
         unique values:  2                        missing .:  0/292

            tabulation:  Freq.  Value
                            34  1
                           258  2
换言之,只剩下258对成功配对的样本。
而修正前的程序删除sp=0的重复值,最后也是得到258对成功配对的样本。

34
sungmoo 发表于 2012-4-9 21:07:44
无尘第二 发表于 2012-4-9 19:55
发现小问题:跑完之后还有34个未成功配对的样本。
试输入下列命令:
bys mat:gen t=_N
关键要看一下:两种方法配对的结果具体有什么不同。

35
无尘第二 发表于 2012-4-10 21:06:55
indc7daq1 谢谢sungmoo!自己水平实在太臭,故而不断提些问题出来,希望不要浪费您太多时间。
试举一例:
配对规则见30楼qjq(请注意“(4)roa最接近(这里roa是指原值本身,不是绝对值)......”)。
use match3,clear
sort year ind daq sp stkcd
截取ind为C7,daq为1的数据如下,可以发现sp=1的试验组有3个样本600340,600890,600892,可供配对的对照组有17个样本(见图indc7daq1)。

根据21楼修正后的程序配对,600890和600340配对成功,600892未找到对照组。按“roa最接近”的原则,可以找到600753作为对照组(见图indc7daq1配对结果)。

indc7daq1配对结果.jpg (25.1 KB)

indc7daq1配对结果

indc7daq1配对结果

36
无尘第二 发表于 2012-4-10 21:14:32
indc7daq3配对结果 indc7daq3
再举一例:
use match3,clear
sort year ind daq sp stkcd
截取ind为C7,daq为3的数据如下,可以发现sp=1的试验组有2个样本600338和600435,可供配对的对照组有12个样本(见图indc7daq3)。

根据21楼修正后的程序配对,600338和901配对成功,600435未找到对照组。按“roa最接近”的原则,可以找到521作为对照组(见图indc7daq3配对结果)。

之所以提出这问题,主要是由于sp=1的样本太少。如果再有一些样本未成功配对,回归时就比较麻烦了。

37
无尘第二 发表于 2012-4-13 00:01:12

match4.rar (11.12 KB) 本附件包括:

  • match4.dta

谢谢sungmoo!

我再啰嗦一下:

数据为附件match4.dta,要求为试验组(即sp=1的样本,共106个)在对照组(sp=0,共1152个)中寻找配对样本,配对规则如下:

(1)同年度year

(2)同行业ind

(3)asset最接近,即对照组与试验组asset的差的绝对值最小。

(4)每个对照组观测值只能配对一次,不同年份之间也不能重复。比如,2004sp=1的样本2001的配对样本为2002,则在余下的配对过程中不能再出现配对样本2002,哪怕是不同年份。

我的问题:

运行根据sungmoo改编的如下程序,

year=2004ind=Csp=1stkcd=2001”的配对样本为“year=2004ind=Csp=0stkcd=2002”;“year=2007ind=Csp=1stkcd=2196”的配对样本为“year=2007ind=Csp=0stkcd=2002”,注意这里“sp=0stkcd2002”重复出现2次,不符合上述第(4)条规则。按规则,应该是在stkcd=2002以外的对照组中寻找与“year=2007ind=Csp=1stkcd=2196asset最接近的配对样本。该怎样修正程序呢?

use match4,clear

set more off

bys year ind sp (stkcd): g exp=_n if sp

bys year ind:egen s=max(exp)

drop if s==.

expandcl s if !sp,cl(year stkcd) gen(g)

bys year stkcd: replace exp=_n if !sp

bys year ind exp: egen r=sum(asset*sp)

g q=abs((asset-r)/r) if !sp

su exp

loc m=r(max)

forv i=1/`m'{

bys year ind sp (q exp stkcd): g exps=exp[`i'] if !sp

bys year ind sp (q exp stkcd): g stkcds=stkcd[`i'] if !sp

bys year ind sp (q exp stkcd): replace q=. if exp==exps&_n>`i'

bys year ind sp (q exp stkcd): replace q=. if stkcd==stkcds&_n>`i'

drop exps stkcds

}

drop if q==.&!sp

bys year ind exp: egen u=min(q) if !sp

drop if u!=q&!sp

egen mat=group(year ind exp)

drop exp-u

sort mat sp

38
xge2000 发表于 2012-4-13 07:06:04
goooooooooooood

39
sungmoo 发表于 2012-4-13 09:00:30
(1)同年度year。
(2)同行业ind。
(3)asset最接近,即对照组与试验组asset的差的绝对值最小。
(4)每个对照组观测值只能配对一次,不同年份之间也不能重复。
use match4.dta, clear
bys year ind sp (stkcd):g exp=_n if sp
bys year ind :egen s=max(exp)
drop if s==.
expandcl s if !sp,cl(year stkcd) gen(g)
bys year stkcd:replace exp=_n if !sp
bys year ind exp:egen r=sum(asset*sp)
g q=abs(asset-r) if !sp

sort q stkcd
count if q<.
loc m=r(N)
forv i=1/`m'{
loc v=stkcd[`i']
replace q=. if stkcd==`v'&_n>`i'&!sp
}
drop if q==.&!sp

bys year ind exp:egen u=min(q) if !sp
drop if u!=q&!sp
egen mat=group(year ind exp)
drop exp-u
sort mat sp
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 10 + 1 + 1 + 1 奖励积极上传好的资料

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

40
无尘第二 发表于 2012-4-13 22:59:09
sungmoo,run这个程序会陷入死循环了………………

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

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