Stata访问元素作为标量或宏的矩阵

时间:2015-12-16 15:27:16

标签: stata

我在Stata中生成一列随机数,尝试不同的种子,看看哪一个给出了最好的结果。我创建了250个随机数,并将它们粘贴到下面看到的foreach循环的代码中。省略号代表~240粒种子。

save "`datadir'ProviderCounty", replace

foreach x in 89583 31214 65326 61107 54662 91414 86171 14809 19625 . . . 74397 85273 {

    use "`datadir'ProviderCounty", replace
    display `x'
    set seed `x'
    generate rannum = uniform()
    . . . 
}

我想通过将它们从Excel中读取到这样的矩阵中来替换250行的长行,然后逐个遍历矩阵。

* Import seeds randomly generated in Excel
clear
import excel "`datadirIN'Random Number Seeds.xlsx", sheet("Sheet1") cellrange(A2:A252) firstrow
mkmat Seeds, matrix(matSeeds)
scalar mlen = rowsof(matSeeds)
clear

这将在以“save ...”开头的行之间进行。和foreach线。我不知道怎么做是迭代矩阵。我需要一行用一行代替foreach行,迭代遍历矩阵并将种子号放在宏“x”中。

1 个答案:

答案 0 :(得分:6)

我希望我是误解,但潜在的想法似乎是错误的。使用指定种子的唯一优点是确保详细结果的可重复性,因为使用相同程序和相同数据的其他人至少可以确保获得相同的结果(因此可以确切地检查您所做的事情) 。否则,如果结果敏感地依赖于特定种子,那么样本量太小,或者问题太脆弱,任何结果都不可信。你怎么报告这个?如果你压制你必须寻找合适的结果,那么这将被广泛认为是不可接受的。如果你宣传这个事实,你就会宣传那些在可疑和无用之间加盖印章的结果。我建议酌情与主管,导师或同事讨论你的想法。如果他们建议这样做,那么无论您在哪里展示结果,都需要解释为什么您认为这是一个好主意。

所有这一切,Stata矩阵都有行和列,因此给定一个列向量,其元素通常是 matname [ i , 1] 。订阅在Stata矩阵的任何文档中定义,例如: http://www.stata.com/help.cgi?matrix

所以你似乎暗示的循环可能是

mkmat Seeds, matrix(matSeeds)

forval i = 1/`= rowsof(matSeeds)' {
    ...
    set seed `= matSeeds[`i', 1]'  
    ... 
}

http://www.stata.com/help.cgi?macro记录了(在这种情况下)标量和矩阵元素的动态评估。

编辑:此处使用的语法记录在help macrohttp://www.stata.com/manuals14/pmacro.pdf。这是一个例子:

. mat foo  = J(1, 1, 42)

. set seed `=foo[1,1]'

. display c(seed)
X51535c3ec43f462544a474abacbdd93d386b

. mat foo  = J(1, 1, 666)

. set seed `=foo[1,1]'

. display c(seed)
X97b5c5aec43f462544a474abacbdd93d2d9c

这里的根本问题是set seed本身不会评估输入它的表达式。有各种解决方法,包括定义本地宏,然后键入宏引用。 Stata的工作方式是在set查看其参数之前评估宏。此处显示的语法通过动态评估来切断宏。

此处使用的案例是 expansion_optr 是等号=,后跟 exp ,即要评估的表达式。在这种情况下,表达式只是一个矩阵元素。