我正在尝试编写一个简单的程序,以结合一组回归拟合的系数和标准误差估计。比如说,我运行5次回归,并将感兴趣的系数和标准误差存储到向量中(实际上是Stata矩阵对象)。然后,我需要做以下事情:
我已经编写了一次这样做的Stata代码,但是我想把它写成一个函数(或“程序”,在Stata中说),它将矢量(或矩阵,如果可能的话)作为参数,将多个估计结合起来一次)回归系数估计和相应标准误差估计的向量(或矩阵),然后生成上面的1和2。这是我写的代码:
(breg是回归系数估计的1x5向量,sereg是相关标准误差估计的1x5向量)
mat ones = (1,1,1,1,1)
mat bregmean = (1/5)*(ones*breg’)
scalar bregmean_s = bregmean[1,1]
mat seregmean = (1/5)*(ones*sereg’)
mat seregbtv = (1/4)*(breg - bregmean#ones)* (breg - bregmean#ones)’
mat varregmi = (1/5)*(sereg*sereg’) + (1+(1/5))* seregbtv
scalar varregmi_s = varregmi[1,1]
scalar seregmi = sqrt(varregmi_s)
disp bregmean_s
disp seregmi
这为单个实例提供了正确的答案。任何指针都会很棒!
更新:我完成了用于组合系数/参数的kXm矩阵中的估计的代码(k是参数的数量,m是插补的数量)。可以找到代码here。
感谢特里斯坦和加比的指示。
更新:我完成了用于组合系数/参数的kXm矩阵的代码,其中k是系数/参数的数量,m是插补的数量。你可以找到它here。
感谢Tristan和Gabi的提示。
答案 0 :(得分:2)
Tristan是对的,您可以使用“args”将矩阵作为Stata程序中的参数调用。使用他的模板,这个hack应该在原始帖子中复制任何breg,sreg对向量的计算:
capture prog drop myMI
program myMI
args breg sereg
local params=colsof(`breg') // store the number of parameters here
mat ones=J(1,`params',1)
mat bregmean = (1/`params')*(ones*breg')
scalar bregmean_s = bregmean[1,1]
mat seregmean = (1/`params')*(ones*sereg')
mat seregbtv = (1/(`params'-1))*(breg - bregmean#ones)* (breg - bregmean#ones)'
mat varregmi = (1/`params')*(sereg*sereg') + (1+(1/`params'))* seregbtv
scalar varregmi_s = varregmi[1,1]
scalar seregmi = sqrt(varregmi_s)
disp bregmean_s
disp seregmi
end
你用
来调用它myMI breg sereg
答案 1 :(得分:0)
我假设您知道Stata 11中内置了多种插补,包括这些类型的组合规则。我没有使用它,但如果可能的话,它可能就是这样。
您可以使用args
命令轻松编写Stata程序来获取矩阵。请遵循以下模板:
capture program drop mi_combine
program define mi_combine
args coef se
matlist `coef'
matlist `se'
end
mat ones = (1,1,1)
mat twos = (2, 2, 2)
mi_combine ones twos
答案 2 :(得分:0)
那应该有所帮助。我是Stata的真正新手。我有v10,如果/当我得到v11,我将调查mi。我想使用Clarify的mi组合功能,但我使用的是Clarify不支持的模型;我不太确定mi会(例如,用户提供的删失分位数回归.ado)
自从我发布了q后,我想出了一些能够完成工作的东西:
capture program drop micombine
program define micombine
mat ones = (1,1,1,1,1)
mat bmean = (1/5)*(ones*`1'')
mat wtv = (1/5)*(`2'*`2'')
scalar wtv_s = wtv[1,1]
mat btv = (1/4)*(`1' - bmean#ones)* (`1' - bmean#ones)'
scalar btv_s = btv[1,1]
mat varregmi = wtv_s + (1+(1/5))*btv
scalar varregmi_s = varregmi[1,1]
scalar seregmi = sqrt(varregmi_s)
scalar bmean_s = bmean[1,1]
scalar dfmi = (5-1)*(1+(5*wtv_s)/(6*btv_s))^2
scalar moemi = seregmi*invttail(dfmi,.025)
di as text "b_mi = " as result bmean_s
di as text "se_mi = " as result seregmi
di as text "df_mi =" as result dfmi
di as text "95% moe_mi =" as result moemi
end
丑陋,只为一个系数估计而做。我希望能够为所有的系数做到这一点,尽管这不是必要的。
答案 3 :(得分:0)
如果计算复杂,我建议使用mata。
如果要在数据中进行计算,可以使用parmest
和/或postfile
将回归系数导出到临时数据文件中。