简单的Stata计划

时间:2010-03-10 00:24:37

标签: statistics

我正在尝试编写一个简单的程序,以结合一组回归拟合的系数和标准误差估计。比如说,我运行5次回归,并将感兴趣的系数和标准误差存储到向量中(实际上是Stata矩阵对象)。然后,我需要做以下事情:

  1. 查找系数估算的平均值。
  2. 根据建议用于组合“多重插补”结果的公式组合标准误差估计。公式是this document第6页上“T”公式的平方根。
  3. 我已经编写了一次这样做的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的提示。

4 个答案:

答案 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将回归系数导出到临时数据文件中。