如何解决使用OLS在Mata中循环
我需要有关Mata循环的帮助。我必须使用循环为Mata中的OLS编写Beta系数代码。我不确定如何调用变量并创建代码。这是我到目前为止所拥有的。
foreach j of local X {
if { //for X'X
matrix XX = [mata:XX = cross(X,1,X,1)]
XX
}
else {
mata:Xy = cross(X,y,0)
Xy
}
我收到一条错误消息“语法无效”。
解决方法
我不确定您需要循环做什么。也许您可以提供更多有关此的信息。但是,以下示例可以帮助您在mata
中实现OLS。
从bcuse
加载示例数据:
ssc install bcuse
clear
bcuse bwght
mata
x = st_data(.,("male","parity","lfaminc","packs"))
cons = J(rows(x),1,1)
X = (x,cons)
y = st_data(.,("lbwght"))
beta_hat = (invsym(X'*X))*(X'*y)
e_hat = y - X * beta_hat
s2 = (1 / (rows(X) - cols(X))) * (e_hat' * e_hat)
B = J(cols(X),cols(X),0)
n = rows(X)
for (i=1; i<=n; i++) {
B =B+(e_hat[i,1]*X[i,.])'*(e_hat[i,.])
}
V_robust = (n/(n-cols(X)))*invsym(X'*X)*B*invsym(X'*X)
se_robust = sqrt(diagonal(V_robust))
V_ols = s2 * invsym(X'*X)
se_ols = sqrt(diagonal(V_ols))
beta_hat
se_robust
end
这不是使用mata
实现OLS的唯一方法。 See the Stata Blog for another example using quadcross
,我喜欢我的示例,因为它在代码中保留了更多的矩阵代数。