No need to adjust the Mata code. rangestat returns first the number of observations (as myreg1). Then as many variables as there are independent variables. So if you have 2, rangestat will store the coefficients in myreg2 myreg3. Finally, since a constant is added in the Mata code, it's coefficient is returned in myreg4. Here's an updated example:
Code:
* test data; use variable names in the thread
webuse grunfeld, clear
rename company permno
rename invest stockexcessret
rename mvalue mktrf
gen mktrf_lag1 = L.mktrf
save "test_data.dta", replace
* ------------ regressions over a window of 6 periods using -rangestat- --------
* define a linear regression in Mata using quadcross() - help mata cross(), example 2
mata:
mata clear
mata set matastrict on
real rowvector myreg(real matrix Xall)
{
real colvector y, b, Xy
real matrix X, XX
y = Xall[.,1] // dependent var is first column of Xall
X = Xall[.,2::cols(Xall)] // the remaining cols are the independent variables
X = X,J(rows(X),1,1) // add a constant
XX = quadcross(X, X) // linear regression, see help mata cross(), example 2
Xy = quadcross(X, y)
b = invsym(XX) * Xy
return(rows(X), b')
}
end
* regressions with a constant over a rolling window of 6 periods by permno
rangestat (myreg) stockexcessret mktrf mktrf_lag1, by(permno) interval(time -5 0) casewise
* the Mata function returns first the number of observations and then as many
* variables as there are independent variables (plus the constant) for the betas
rename (myreg1 myreg2 myreg3 myreg4) (nobs rs_mktrf rs_mktrfl1 rs_cons)
* reject results if the window is less than 6 or if the number of obs < 4
isid permno year
by permno: replace rs_mktrf = . if _n < 6 | nobs < 4
by permno: replace rs_cons = . if _n < 6 | nobs < 4
by permno: replace rs_mktrfl1 = . if _n < 6 | nobs < 4
save "rangestat_results.dta", replace
* ----------------- replicate using -rolling- ----------------------------------
use "test_data.dta", clear
levelsof permno, local(permno)
foreach s of local permno {
rolling _b, window(6) saving(betas_`s', replace) reject(e(N) < 4): ///
regress stockexcessret mktrf mktrf_lag1 if permno == `s'
}
clear
save "betas.dta", replace emptyok
foreach s of local permno {
append using "betas_`s'.dta"
}
rename end year
merge 1:1 permno year using "rangestat_results.dta"
isid permno year, sort
gen diff_mktrf = abs(_b_mktrf - float(rs_mktrf))
gen diff_mktrfl1 = abs(_b_mktrf_lag1 - float(rs_mktrfl1))
gen diff_cons = abs(_b_cons - float(rs_cons))
summ diff*

Comment