-
Notifications
You must be signed in to change notification settings - Fork 0
/
xtgrangert_p.ado
90 lines (71 loc) · 1.97 KB
/
xtgrangert_p.ado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
*! predict program for xtgrangert
*! 04.07.2022 by Jan Ditzen
cap program drop xtgrangert_p
program define xtgrangert_p
syntax anything [in] [if] [, xb RESiduals]
tempvar touse
marksample touse
/// check options
local cnt = wordcount("`residuals' `xb'")
if `cnt' > 1 {
display "{err}only one statistic may be specified"
exit 498
}
else if `cnt' == 0 {
local xb xb
disp "Option xb assumed."
}
qui {
/// time series options and variables
_xt
local idvar `r(ivar)'
local tvar `r(tvar)'
local depvar `e(depvar)'
local indepvars `e(indepvar)'
/// remove from touse variables before lag
by `idvar' (`tvar'), sort: replace `touse' = 0 if _n <= `e(p)'
mata m_xtgrangert_p("`depvar'","L(1/`e(p)').`depvar'","`indepvars'","`anything'","`idvar' `tvar'","`touse'",("`xb'":=="xb"))
}
end
capture mata mata drop m_xtgrangert_p()
mata:
function m_xtgrangert_p(string scalar depvarn , string scalar zn, string scalar indepvarn, string scalar residn, string scalar idtn,string scalar tousen, real scalar xb)
{
real matrix x, y, z, xi, yi, zi, idt, index, res, resi, mz
real scalar idx, i
depvarn
indepvarn
zn
residn
idtn
xb
/// load data
y = st_data(.,depvarn,tousen)
x = st_data(.,indepvarn,tousen)
z = st_data(.,zn,tousen)
z = J(rows(z),1,1),z
idt = st_data(.,idtn,tousen)
index = panelsetup(idt,1)
/// load beta coefficients
beta = st_matrix("e(b_HPJ)")
/// add variable for residuals
idx=st_addvar("double", residn)
st_view(res,.,residn,tousen)
/// loop over cross-sections
i = rows(index)
while (i>0) {
yi = panelsubmatrix(y,i,index)
xi = panelsubmatrix(x,i,index)
zi = panelsubmatrix(z,i,index)
panelsubview(resi,res,i,index)
mz = I(rows(yi)) - zi * invsym(quadcross(zi,zi)) * zi'
if (xb:==1) {
resi[.,.] = mz*(xi * beta')
}
else {
resi[.,.] = mz*(yi - xi * beta')
}
i--
}
}
end