Stata 从9.0之后开始包括一个矩阵变成语言,这就mata。虽然之前的stata也包含一些基本的矩阵运算,但局限性太大。不过这个东西和Stata的数据组织方式就有些不同了。Stata的数据按照变量或者说是序列组织起来的,但mata则是按照矩阵组织起来,这与Matlab和R很像。现在的问题就是如何将Stata的数据输入mata进行运算,然后再将结果输出。
一般来讲,Stata的联机帮助很详细,也有很多例子。但是mata的联机帮助甚至手册都有些简陋,很多时候很多命令根本就没有例子。
首先如何将Stata的数据输入mata:st_view()和st_data。这两个命令的作用是一样的,但是从效果上还有细微差别。st_view()可以生成一个当前在内存中的Stata数据的矩阵,你可以对这些矩阵进行任何运算,但是当Stata的数据改变以后,这个矩阵也会改变;而st_data()则不然,他会生成一个绝对独立的矩阵,不论你Stata的数据怎么改变,这个mata中的矩阵依然如故。比如st_view(X=.,.,.)会将当前数据中变成mata中的一个矩阵X,但是当你clear之后在进入mata,这个矩阵X的所有元素都变成“.”了。相反的,X=st_data(.,.,.)也将现在内存中的Stata数据变成一个矩阵,但是无论这个数据是否还在,都不影响这个矩阵的取值。据说之所以设计st_view()的原因是这样比较节省内存。不过这两个命令的共同之处是,如果变量是一个字符型的话,进入mata以后就变成“.”了。
st_view(x,。,“x”)
我们可以使用Mata对象x来检查x变量的内容。
调用st_view()有很多种方法。
st_view()对象按列号指向,而不是指向变量
我通过遇到奇怪行为发现的第一个重点是st_view()对象指向Stata数据集中的特定列,即使通过传递变量来调用它也是如此 。这意味着,创建了Mata对象x,它是Stata数据集中变量x的视图,如果Stata数据集中的变量x改变位置,则Mata st_view对象x将不再指向正确的变量。为了说明,尝试以下代码 :
mata:
mata clear
void test(){
st_view(x,。,“x”)
x
stata(“drop y”)
x
}
end
clear
set obs 5
gen y = 1
gen x = 2
mata:test()
代码生成一个Stata数据集,其中包含两个变量y(包含1个)和x(包含2个)。Mata程序test()首先创建Mata对象x,它指向Stata数据集变量x。 然后我们从Mata程序中调用Stata命令drop y。然后我们再次打印Mata对象x。运行代码,我们得到输出:
。mata:test()
1
+ ----- +
1 | 2 |
2 | 2 |
3 | 2 |
4 | 2 |
5 | 2 |
+ ----- +
1
+ ----- +
1 | 。|
2 | 。|
3 | 。|
4 | 。|
5 | 。|
+ ----- +
我们看到第一次输出x给我们x变量,它包含2s。但是我们第二次调用print x时,会得到一列缺失值。 事实证明它指向特定的列,而不是特定的变量。
这种行为有什么影响?如果我们使用st_view()并调用它以指向特定变量,我们应该知道如果重新排序Stata数据集的变量,我们的st_view()对象可能不再指向正确的变量。这意味着每次我们在Mata程序中对Stata数据集进行更改时,我们都应该重新定义我们想要使用的任何Mata st_view()对象。
这有什么影响? 必须在 “更改数据集”之后重新创建st_view()对象 。