全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
3355 5
2009-07-04
众位大侠,

关于公司金融的数据分析.
假设要针对某数据库里的每一家公司(以股票代码CODE识别)先找到所有与之同行业同年份的所有公司, 再对这些与原始公司同年同行业的公司进行y=a+bx1+cx2+u 的回归, 求回归后的估计值, 再算该估计值与原始公司y的差值.

目前看起来好象有两种方法达到以上结果(下面说的都是包含原始公司自身的方法):

(1)
gen reg_obs = .
gen yhat = .
gen res = .
local N = _N
forv i = 1/`N' {
local industry = industry[`i']
local year = year[`i']
capture {
regress  y x1 x2  if  industry == `industry' & year == `year'
replace reg_obs = e(N) in `i'
predict p in `i', xb
replace yhat=p in `i'
predict r in `i', residuals
replace res = r in `i'
drop r p
}
}

(2)
sort year industry
by year industry:reg y x1 x2
predict yhat, p
predict res,res


照理说这两种方法应该是相同的, 可是我用两种方法做出来的每个公司的yhat, res却不相同,

还有第二种方法回归时是包含了该原始公司还是不包含?


请教究竟问题出在哪里?
多谢多谢

SORRY, yhat相同的事情是自己想糊涂了, 那部分已删
二维码

扫码加我 拉你入群

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

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

全部回复
2009-7-4 11:25:40
why should yhat be the same? they should be different for every company.
二维码

扫码加我 拉你入群

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

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

2009-7-4 18:16:20
这两种方法不一样吧。
第二种方法predict时最所有变量只使用最后一次by year industry: 回归时的参数——而这恐怕不是你想要的。
而第一种方法用循环尽管达到了目的,但同时却做了许多“无用功”——本来只需year*industry这么多次回归,而你却回归了N次,显然N>>year*industry;而且在reg中还有if条件判断,效率肯定很低。


建议用statsby ...,然后merge ...,最后gen ...方法,试试吧。
二维码

扫码加我 拉你入群

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

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

2009-7-4 21:58:49
天哪, 好想叫救命, VOODOO, 我用你说的STATSBY先针对YEAR 和INDUSTRY共同做回归, 然后和原来的数据库MERGE, 然后再gen res=y-(_stat_1*x1+_stat_2*x2)

这种方法求出来的res与我首贴里的第一种第二种方法算出来的res又都不相同, 也就是说,现在三种算法对每个公司算出来的是三个不同的res, 晕~
二维码

扫码加我 拉你入群

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

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

2009-7-4 22:51:56
经如下模拟数据试验,方法1和我建议的方法结果相同啊,除非你方法#3程序有误或数据有什么问题。
// 生成模拟数据
set obs 10
gen industry = _n
expand 20
sort industry
gen stkcd = _n
expand 5
sort industry stkcd
by industry stkcd: gen year = _n
gen x1 = uniform()
gen x2 = uniform()
gen y = 2*x1 + x2 + invnormal(uniform())
save sample

// method #1
use sample, clear
gen reg_obs = .
gen yhat = .
gen res = .
local N = _N
forv i = 1/`N' {
        local industry = industry[`i']
        local year = year[`i']
        capture {
                regress  y x1 x2  if  industry == `industry' & year == `year'
                replace reg_obs = e(N) in `i'
                predict p in `i', xb
                replace yhat=p in `i'
                predict r in `i', residuals
                replace res = r in `i'
                drop r p
        }
}
sort industry stkcd year
list in 1
list in 100
list in 200


// method #3
use sample, clear
statsby _b, by(industry year): reg y x1 x2
sort industry year
save b
use sample
sort industry year
merge industry year using b
gen res = y - _b_x1*x1 - _b_x2*x2 - _b_cons
sort industry stkcd year
list in 1
list in 100
list in 200

// res are the same!
二维码

扫码加我 拉你入群

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

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

2009-7-4 23:36:50
哦, 发现是我在用第三种方法时忘记减常数项了.
对, 第一第三种方法结果一致.
万分感谢VOODOO的帮忙
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群