楼主: xueyuan456
51568 88

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

  • 0关注
  • 2粉丝

本科生

9%

还不是VIP/贵宾

-

威望
0
论坛币
20969 个
通用积分
94.0215
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
630 点
帖子
33
精华
0
在线时间
114 小时
注册时间
2005-10-6
最后登录
2024-1-28

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有个问题希望帮忙解决一下,我现在有一个数据库,里面有公司代码(code),年度(year), 资产(assets),所属行业(industry),然后有个哑变量(w)。

我希望针对所有哑变量w=1的公司,寻找w=0,且同年度,同行业,资产(assets)在正负30%范围内的匹配公司, 一对一配对。

那么我是应该采用Local macros的循环语句呢还是用psmatch2呢?还是两个都可以?
如果用Local macros的循环语句,程序应该如何编写? 就是说在forvalues后面应该如何编写能达到针对每个w=1挑选w=0的公司并且要求该公司的行业等等与w=1的公司一致?

如果用Psmatch2, 我用了下面的语句,不知道正确与否,达人们能不能帮忙看看?可是不知道该如何在psmatch2里设置assets+-30%的条件? 是用caliper吗?该如何设置?


psmatch2 w, mahal(year industry)
sort _id
generate match=code[_n1]
generate matchyear=year[_n1]
generate treat=code if _n1 !=.

还有,如果不是选择一对一配对而是选一对多又该怎么做呢?

谢谢谢谢
我附了部分数据,
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:psmatch2 Match ATCH 循环语句 PSM 求助 分组 语句 配对

test.rar

17.51 KB

本附件包括:

  • test.dta

本帖被以下文库推荐

沙发
voodoo 发表于 2009-7-26 11:43:04 |只看作者 |坛友微信交流群
我已用论坛短信给你回复。若方法可行,请你将最后可用的程序贴出来。
巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

藤椅
jinghe414 发表于 2011-7-28 17:48:00 |只看作者 |坛友微信交流群
最后可行不?有程序不?我和楼主遇到一样的问题,急求

使用道具

板凳
无尘第二 发表于 2012-2-10 23:25:46 |只看作者 |坛友微信交流群
match1.rar (8.84 KB) 本附件包括:
  • match1.dta
我的问题几乎跟xueyuan456一样,请教一下voodoo:
数据为附件match1.dta,其中虚拟变量sp=1时的stkcd表示是研究对象即试验组。
要求为试验组(即SP=1的样本,共105个)在对照组(sp=0,共1228个)中寻找配对样本,配对规则是:
(1)同行业ind;
(2)同年度year;
(3)应计额daq一样;
(4)绩效roa在上下10%幅度匹配。 数据截图.jpg

使用道具

报纸
无尘第二 发表于 2012-2-19 11:34:51 |只看作者 |坛友微信交流群
/*下面的程序是对match1.dta中的所有观测值都寻找匹配样本(即sp=1的样本与sp=1的样本配对),而要求是针对其中sp=1的公司,寻找sp=0(即配对样本必须sp=0),且同ind,
同daq,roa在正负10%的范围内的配对样本。程序还须改进*/

use match1, clear
sort stkcd                 // 假定为long form数据,否则用reshape命令
save temp, replace
capture postclose match
postfile match group stkcd dmatch using matchsample1.dta, replace
local total = _N
local j = 0
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
        local lind = ind[`i']
        local ldaq = daq[`i']
        local lroa = roa[`i']
        quietly drop in `i'       // 删除自身
        quietly keep if ind == "`lind'"
        quietly keep if daq == `ldaq'
        gen roaratio = abs(roa / `lroa' - 1)
        quietly keep if roaratio <= 0.1                  // 将条件分成四句keep if ,有助于加快程序
        if _N < 1 {                // 若没有公司满足条件,则直接进入下一循环
                restore
                continue
        }
        sort roaratio
        local mstkcd = stkcd[1]                // 若有多个公司满足条件,则用roa最接近的公司
        local j = `j' + 1
        post match (`j') (`lstkcd') (0)
        post match (`j') (`mstkcd') (1)
        restore
}
postclose match
use matchsample1, clear
sort stkcd
merge stkcd using temp
keep if _merge == 3
drop _merge
sort group dmatch
set more off
list in 1/20
save lastsample1, replace

使用道具

地板
无尘第二 发表于 2012-2-22 23:36:35 |只看作者 |坛友微信交流群
荣誉版主sungmoo给出了程序,现贴出来,以飨读者:

*以波动百分比绝对值最小的观测值匹配(mat值相同的两个观测值是匹配组合:sp=0的roa与sp=1的roa相比,波动百分比绝对值最小):
use match1.dta, clear
bys ind year daq sp: g exp=_n if sp
bys ind year daq: egen s=max(exp)
replace s=. if exp<.
expandcl s,cl(stkcd) gen(g)
bys stkcd: g m=_n if s<.&exp==.
egen p=rowtotal(exp m)
keep if p>0
drop s g m
g t=roa if sp
bys ind year daq p: egen r=min(t)
g q=abs((roa-r)/r) if t==.
bys ind year daq p: egen u=min(q) if q<.
drop if q!=u&t==.
egen mat=group(ind year daq p)
drop t r q u exp p
sort mat sp
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
h3327156 + 1 + 1 + 1 感谢您提供sungmoo大大这样棒的程序 值得学.

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

使用道具

7
sungmoo 发表于 2012-2-23 08:03:43 |只看作者 |坛友微信交流群
*稍微调整一下(结果不变。补充:若mat值只出现一次,则原数据无匹配可能;若mat值重复两次以上,则原数据有多个匹配值;sp=0的观测值可以被多次匹配)
use match1.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
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
已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
sucheng199099 + 3 精彩帖子
Sunknownay + 100 + 15 + 1 + 1 + 1 热心帮助其他会员
无尘第二 + 1 + 1 + 1 对论坛有贡献

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

使用道具

8
无尘第二 发表于 2012-2-24 23:47:12 |只看作者 |坛友微信交流群
谢谢sungmoo!
最后的obs是209个,我查了一下,有两个原因:(1)stkcd200020和20的数据完全一样,是数据本身的问题,不需理会;(2)有两个样本587,600452没有找到配对样本,应予删除。程序中能否增加命令,将未能找到配对样本的观察值删除呢?

使用道具

9
sungmoo 发表于 2012-2-25 14:31:42 |只看作者 |坛友微信交流群
;(2)有两个样本587,600452没有找到配对样本,应予删除。程序中能否增加命令,将未能找到配对样本的观察值删除呢?
前面的结果中直接删除mat值不打结(有唯一值)的观测值即可。

https://bbs.pinggu.org/thread-696047-1-1.html并帖。

使用道具

10
无尘第二 发表于 2012-3-12 16:56:09 |只看作者 |坛友微信交流群
sungmoo的程序简直是鬼斧神工,看似简洁明快,真要弄懂却花费了不少时间。由于水平实在太菜,这里再请教一下问题。请见谅。
现对数据稍作修改,把roa变成绝对值,其余不变(数据为附件的match2),要求为“针对其中sp=1的公司,寻找sp=0,且同ind,同daq,roa最接近的样本(配对样本不能重复)”。
sungmoo原先的程序通过expandcl命令重复了配对样本。如果配对样本不能重复,那么怎样为图中exp为1与2的样本配对呢?程序应当怎样修改?

match2截图.jpg (34.21 KB)

match2截图.jpg

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 10:28