楼主: xueyuan456
3417 5

继续探讨匹配样本后进行回归的问题 [推广有奖]

  • 0关注
  • 2粉丝

本科生

10%

还不是VIP/贵宾

-

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

楼主
xueyuan456 发表于 2009-7-4 10:07:58 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
众位大侠,

关于公司金融的数据分析.
假设要针对某数据库里的每一家公司(以股票代码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相同的事情是自己想糊涂了, 那部分已删
二维码

扫码加我 拉你入群

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

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

关键词:Residuals Industry Residual predict replace 样本 探讨

回帖推荐

voodoo 发表于5楼  查看完整内容

经如下模拟数据试验,方法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 yha ...

voodoo 发表于3楼  查看完整内容

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

本帖被以下文库推荐

沙发
wanli 发表于 2009-7-4 11:25:40
why should yhat be the same? they should be different for every company.

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


建议用statsby ...,然后merge ...,最后gen ...方法,试试吧。
巫毒上传,必属佳品!
坛友下载,三思后行!

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

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

报纸
voodoo 发表于 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!
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
txje + 1 + 1 + 1 热心帮助其他会员

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

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

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

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

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