草蜢718 发表于 2019-6-28 08:32 
谢谢黄老师,刚学stata不久,对这块还不是很熟悉。
是在AER上看到的一篇文章的程序,是想通过循环计算出相应的参数值。但我在stata中运行时,总提示在forvalues语句后提示 invalid syntax,不知道问题出在哪里,请黄老师和各位高手指点。
gen phiG=.
gen varzG=.
gen varzB=.
gen cov=.
gen varx=.
gen nG=.
gen nB=.
gen nTot=.
gen phiB=.
gen sigmasqx=.
gen sigmasqy=.
gen sigmasqzG=.
gen sigmasqzB=.
gen beta=.
gen lambdaG=.
gen lambdaB=.
local rownum = 0
local rowsboth = 5
local goodsample = "wbdqtotal>3.5"
local badsample = "wbdqtotal<3.5"
forvalues j = 1(1)`rowsboth' {
local rownum = `rownum' + 1
replace phiG = 1.1 - `j'*0.1 if _n==`rownum'
qui: corr lngdpwdilocallongdiff lndnlongdiff if `goodsample', cov
replace varzG = r(Var_1) if _n==`rownum'
replace nG = r(N) if _n==`rownum'
qui: corr lngdpwdilocallongdiff lndnlongdiff if `badsample', cov
replace varzB = r(Var_1) if _n==`rownum'
replace nB = r(N) if _n==`rownum'
qui: corr lngdpwdilocallongdiff lndnlongdiff, cov
replace varx = r(Var_2) if _n==`rownum'
replace cov = r(cov_12) if _n==`rownum'
replace nTot = r(N) if _n==`rownum'
replace sigmasqy = varzG * phiG if _n==`rownum'
replace phiB = sigmasqy / varzB if _n==`rownum'
replace beta = cov / sigmasqy if _n==`rownum'
replace sigmasqx = varx - cov if _n==`rownum'
replace sigmasqzB = varzB - sigmasqy if _n==`rownum'
replace sigmasqzG = varzG - sigmasqy if _n==`rownum'
replace lambdaB = sigmasqx*sigmasqy / ( sigmasqx*sigmasqy + sigmasqzB*(beta*beta*sigmasqy + sigmasqx) ) if _n==`rownum'
replace lambdaG = sigmasqx*sigmasqy / ( sigmasqx*sigmasqy + sigmasqzG*(beta*beta*sigmasqy + sigmasqx) ) if _n==`rownum'
}
local rownum = `rownum' + 1
replace phiB = phiB[2] if _n==`rownum'
local phiB = phiB[2]
qui: corr lngdpwdilocallongdiff lndnlongdiff if `badsample', cov
replace varzB = r(Var_1) if _n==`rownum'
replace nB = r(N) if _n==`rownum'
replace varx = r(Var_2) if _n==`rownum'
replace cov = r(cov_12) if _n==`rownum'
replace nTot = r(N) if _n==`rownum'
replace sigmasqy = varzB * phiB if _n==`rownum'
replace beta = cov / sigmasqy if _n==`rownum'
replace sigmasqx = varx - cov if _n==`rownum'
replace sigmasqzB = varzB - sigmasqy if _n==`rownum'
replace lambdaB = sigmasqx*sigmasqy / ( sigmasqx*sigmasqy + sigmasqzB*(beta*beta*sigmasqy + sigmasqx) ) if _n==`rownum'
keep phiG phiB beta lambdaG lambdaB sigmasqy sigmasqzB sigmasqzG sigmasqx
order phiG phiB beta lambdaG lambdaB sigmasqy sigmasqzB sigmasqzG sigmasqx