楼主: mma
44299 44

[编程问题求助] 如何用stata编程,寻找配对样本   [推广有奖]

  • 0关注
  • 1粉丝

初中生

4%

还不是VIP/贵宾

-

威望
0
论坛币
17 个
通用积分
1.1865
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
65 点
帖子
8
精华
0
在线时间
8 小时
注册时间
2009-12-29
最后登录
2020-9-1

楼主
mma 发表于 2010-1-22 21:43:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
比如说,有四个条件,年度、上市地(沪市或深市)、行业以及总资产(正负30%以内)
如何用stata找出比较理想的配对样本
二维码

扫码加我 拉你入群

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

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

关键词:stata编程 Stata 配对样本 tata 如何用 样本 Stata 配对

本帖被以下文库推荐

沙发
jordan1963217 发表于 2010-2-10 11:40:17
1# mma
同问

藤椅
voodoo 发表于 2010-2-10 23:55:53
试试:

// 生成模拟数据,非平衡面板数据
clear
set more off
set obs 1000
gen stkcd = _n
gen industry = ceil(10*uniform())   // 10个行业
gen exchange = cond(uniform()<0.6, 0, 1) // 60%样本属于上交所SSE
label define lexch 0 "SSE" 1 "SZSE"
label value exchange lexch
gen asset = 100*exp(invnormal(uniform()))
gen control = 10*uniform()  // 控制变量,测试用
expand 5
drop if uniform() < 0.1  // 非平衡面板数据
bysort stkcd: gen year = 2010 - _n
sort stkcd year
by stkcd: replace asset = asset * (1 + 0.1*uniform()) if _n > 1
save sample, replace
// 主程序
use sample, clear
sort stkcd year                // 假定为long form数据,否则用reshape命令
save temp, replace
capture postclose match
postfile match group stkcd year dmatch using matchsample.dta, replace
local total = _N
local j = 0
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
        local lyear = year[`i']
        local lexchange = exchange[`i']
        local lindustry = industry[`i']
        local lasset = asset[`i']
        quietly drop in `i'       // 删除自身
        quietly keep if industry == `lindustry'
        quietly keep if year == `lyear'
        quietly keep if exchange == `lexchange'
        gen assetratio = abs(asset / `lasset' - 1)
        quietly keep if assetratio <= 0.3                  // 将条件分成四句keep if ,有助于加快程序
        if _N < 1 {                // 若没有公司满足条件,则直接进入下一循环
                restore
                continue
        }
        sort assetratio
        local mstkcd = stkcd[1]                // 若有多个公司满足条件,则用总资产数最接近的公司
        local j = `j' + 1
        post match (`j') (`lstkcd') (`lyear') (0)
        post match (`j') (`mstkcd') (`lyear') (1)
        restore
}
postclose match
use matchsample, clear
sort stkcd year
merge stkcd year using temp
keep if _merge == 3
drop _merge
sort group dmatch
label define ldmatch 0 "初始样本" 1 "配对样本"
label value dmatch ldmatch
list in 1/20
save lastsample, replace
已有 4 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
潇潇木枼 + 1 + 1 + 1 + 1 精彩帖子
crystal8832 + 36 + 2 + 2 + 2 精彩帖子
xuba + 1 + 1 + 1 精彩帖子
Sunknownay + 100 + 8 + 1 + 1 + 1 热心帮助其他会员

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

巫毒上传,必属佳品!
坛友下载,三思后行!

板凳
fentone 发表于 2010-2-19 20:33:52
clear
set more off
set obs 1000
gen stkcd = _n
gen industry = ceil(10*uniform())   // 10个行业
gen exchange = cond(uniform()<0.6, 0, 1) // 60%样本属于上交所SSE
label define lexch 0 "SSE" 1 "SZSE"
label value exchange lexch
gen asset = 100*exp(invnormal(uniform()))
gen control = 10*uniform()  // 控制变量,测试用
expand 5
drop if uniform() < 0.1  // 非平衡面板数据
bysort stkcd: gen year = 2010 - _n
sort stkcd year
by stkcd: replace asset = asset * (1 + 0.1*uniform()) if _n > 1
save sample, replace
// 主程序
use sample, clear
sort stkcd year                // 假定为long form数据,否则用reshape命令
save temp, replace
capture postclose match
postfile match group stkcd year dmatch using matchsample.dta, replace
local total = _N
local j = 0
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
        local lyear = year[`i']
        local lexchange = exchange[`i']
        local lindustry = industry[`i']
        local lasset = asset[`i']
        quietly drop in `i'       // 删除自身
        quietly keep if industry == `lindustry'
        quietly keep if year == `lyear'
        quietly keep if exchange == `lexchange'
        gen assetratio = abs(asset / `lasset' - 1)
        quietly keep if assetratio <= 0.3                  // 将条件分成四句keep if ,有助于加快程序
        if _N < 1 {                // 若没有公司满足条件,则直接进入下一循环
                restore
                continue
        }
        sort assetratio
        local mstkcd = stkcd[1]                // 若有多个公司满足条件,则用总资产数最接近的公司
        local j = `j' + 1
        post match (`j') (`lstkcd') (`lyear') (0)
        post match (`j') (`mstkcd') (`lyear') (1)
        restore
}
postclose match
use matchsample, clear
sort stkcd year
merge stkcd year using temp
keep if _merge == 3
drop _merge
sort group dmatch
label define ldmatch 0 "初始样本" 1 "配对样本"
label value dmatch ldmatch
list in 1/20
save lastsample, replace



划红色的地方有点不清楚,程序运行后,有错误.望高手解释

报纸
voodoo 发表于 2010-2-20 23:11:15
fentone 发表于 2010-2-19 20:33
划红色的地方有点不清楚,程序运行后,有错误.望高手解释
我运行程序没错啊。至于划红色的地方不清楚,请多利用Stata的在线帮助,如help postclose、help expand、help label等即可得到答案。
巫毒上传,必属佳品!
坛友下载,三思后行!

地板
mma 发表于 2010-2-25 10:27:12
5# voodoo
非常谢谢两位高手,太高深了,我试试

7
mma 发表于 2010-2-25 10:36:04
谢谢两位高手

8
mma 发表于 2010-3-12 16:20:05
我试过之后还是不行,继续求救,谢谢
就是最好的几个命令出问题
还有,
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
preserve这个命令前面一定要空几格么?多谢

9
voodoo 发表于 2010-3-12 23:50:14
mma 发表于 2010-3-12 16:20
我试过之后还是不行,继续求救,谢谢
就是最好的几个命令出问题
还有,
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
preserve这个命令前面一定要空几格么?多谢
试过之后还是不行?!应该是你数据的问题,请仔细检查。或者你帖部分数据上来,最好是.dta格式。
preserve前不用空几格(我是tab键),缩进只是让命令更容易阅读而已。
巫毒上传,必属佳品!
坛友下载,三思后行!

10
jzhyue 发表于 2011-5-8 15:22:37
voodoo 发表于 2010-2-10 23:55
试试:

// 生成模拟数据,非平衡面板数据
clear
set more off
set obs 1000
gen stkcd = _n
gen industry = ceil(10*uniform())   // 10个行业
gen exchange = cond(uniform() 1
save sample, replace
// 主程序
use sample, clear
sort stkcd year                // 假定为long form数据,否则用reshape命令
save temp, replace
capture postclose match
postfile match group stkcd year dmatch using matchsample.dta, replace
local total = _N
local j = 0
forval i = 1/`total' {
        preserve
        local lstkcd = stkcd[`i']
        local lyear = year[`i']
        local lexchange = exchange[`i']
        local lindustry = industry[`i']
        local lasset = asset[`i']
        quietly drop in `i'       // 删除自身
        quietly keep if industry == `lindustry'
        quietly keep if year == `lyear'
        quietly keep if exchange == `lexchange'
        gen assetratio = abs(asset / `lasset' - 1)
        quietly keep if assetratio
+++++++++++++++++++++++++
voodoo在回复中应用到一组命令:postfile post postclose等命令,它等同于我们可以同时操作多个文件,(事实上仅仅是将数据存入另外一个文档)。
不过我们还是不能同时访问它,比如读取某个数据或全部数据,(我们现在的做法是合并数据或将数据存入loca 或mat,(当然如果用mata就可以同时访问多个mat,也等同于同时访问了多个数据库))
如果stata如果有个可以这样的命令:访问命令,比如在内存中有master data,用这个访问命令可以用来读取另外一个using data的数据?
没有细查,不知是否有与post功能相反的命令?

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

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