Stata:为什么我的矩阵没有清除foreach循环

时间:2014-03-24 22:45:21

标签: for-loop regression stata

当我运行以下代码时,两个输出矩阵(diffInDiffOne& diffInDiffTwo)是相同的。我的猜测是,每次循环后系数都没有被替换,但我不知道为什么。我认为系数矩阵正在被覆盖,但我不知道如何。我尝试更改for循环顺序,但这令人惊讶地没有解决我的问题:

local treatments treat_one treat_two
matrix diffInDiffOne = J(1,9,.)
matrix diffInDiffTwo = J(1,9,.)

foreach treatment in `treatments' {
    reg science inSchool#`treatment'#male
    matrix coeffs=e(b) 
    if treat_one==`treatment'{
       matrix diffInDiffOne = diffInDiffOne\coeffs
    }
    if treat_two==`treatment'{
       matrix diffInDiffTwo = diffInDiffTwo\coeffs
    }

}

 matrix list diffInDiffOne
 matrix list diffInDiffTwo

当我列出矩阵它们都是相同的时,表明两个回归给出不同答案的事实。非常感谢您对此问题的任何帮助。感谢

1 个答案:

答案 0 :(得分:2)

此代码初看即可缩小为

reg science inSchool#treat_one#male
matrix li e(b) 
reg science inSchool#treat_two#male 
matrix li e(b) 

除了向矩阵添加九个缺失值的细节。

然而,那不是你的代码,那么是什么在咬你?我想更微妙的东西。

您应该对if命令非常小心。在if命令中评估的变量在第一次观察中进行评估。所以,第一次循环 条件是

if treat_one[1] == treat_one[1]

if treat_two[1] == treat_one[1] 

第二次,它是

if treat_one[1] == treat_two[1]

if treat_two[1] == treat_two[1] 

如果您的数据中确实treat_one[1] == treat_two[1]效果不会像您想象的那样。

如果要测试字符串是否相等,请执行

之类的操作
 if "`treatment'" == "treat_one" 

您可能会想到更像

的内容
foreach treatment in treat_one treat_two {
    reg science inSchool#`treatment'#male
    matrix `treatment' = e(b) 
    matrix list `treatment`
}

您似乎想要为相当简单的问题编写非常复杂的代码。前段时间,我建议用do文件而不是程序来思考。这可能是重新考虑的建议。