我想使用Mata进行一些矩阵计算,例如,X transpose * V inverse * X.我已经有了X的转置,但需要计算V的倒数。我需要对其他矩阵进行类似的计算。其中一些矩阵很大,因此视图是最好的方法。我不清楚如何做到这一点。这是我的代码:
version 13
cd "data"
use V1,clear
mata:
real matrix V
st_view(V=.,.,.)
real matrix Vinv
Vinv=cholinv(V)
end
cd "data"
use XT,clear
mata:
real matrix XT
st_view(XT=,.,.)
end
cd "data"
use X,clear
mata:
real matrix X
st_view(X=,.,.)
real matrix XTVinv
real matrix A1
XTVinv=X*Vinv
A1=XTVinv*X
end
几个问题:
我看到的所有示例都将数据加载到内存中。我的矩阵在单独的Stata文件中,所以我需要单独加载它们,但这是在Mata内部还是外部完成的?
Vinv需要成为一个观点,但我不确定如何制作它。
我需要为X转置和X设置视图。各种矩阵的所有视图是否都会持续存在,以便我可以在最后执行乘法?
XTVinv和A1需要是视图,但我不知道如何设置它。
答案 0 :(得分:0)
Mata中的视图是数据视图,恰好表示Stata中当前数据集中的一个或多个观察值和一个或多个相同类型的变量(数字或字符串)。主要的一点是,Mata并不需要将数据集复制到Mata中,因为它已经在系统内部。
但它并没有相反的方式。视图不是一般可以用来保存任意矩阵的东西。白魔法只是让马塔看到Stata;在没有相应的内存需求的情况下,在Mata中保存大型矩阵并不是白魔法。
因此,据我所知,除非您首先将矩阵作为Stata数据集输入,否则您无法将矩阵视为视图。
但观点的优势主要是为了防止你持有两次相同的数据,一次是在Stata中,一次是在Mata中。对于纯矩阵运算,我怀疑只是在Mata中读取矩阵有任何损失。
这是印象派。你可以在Statalist上获得更好的答案,因为更多的Mata程序员,包括Stata自己的开发人员,都在这里。但是,您应该使用您的真实姓名。 (据我所知,这是威廉·莎士比亚。)
答案 1 :(得分:0)
这里的问题似乎是如何将数据输入到Mata以及如何创建视图。以下是从Mata手册和Stata帮助中获取的一些示例:
clear all
set more off
// Load example database (as usual)
sysuse auto
keep mpg weight displace
describe
// Create matrices in Mata from Stata
putmata y1=mpg X1=(weight displace)
// Enter Mata mode
mata
// Create views inside Mata from Stata
st_view(y2=., ., "mpg")
st_view(X2=., ., ("weight", "displace"))
// Display matrices and views created
y1
X1
y2
X2
// Create matrix inside Mata and display its transpose
S = (1, 2 \ 3, 4)
S'
// Display 2x2 matrix from the view X2
X2[1..2,1..2]
* Display its transpose
X2[1..2, 1..2]'
// Exit Mata mode
end
创建视图时,我们给st_view()
一个参数,指示保存数据的位置。在以下示例中,在进行函数调用之前定义了Z
:
: Z = .
: st_view(Z, ., .)
但是你可以把这两者结合成一个:
: st_view(Z=., ., .)
我提到这一点是因为在你的代码中,你定义了两次矩阵。在st_view()
电话之前一次,然后在内,意味着一些混乱。
st_data()
是另一种可能性,以及tomata
(由William Gould,SJ。用户编写。运行findit tomata
)。
如果数据来自不同的源文件,也许可以merge
它们,像往常一样在Stata中加载它,然后在Mata中使用它们。确切的策略将取决于您正在尝试实现的目标以及初始数据文件的结构。
另一方面,阅读Mata手册无可替代,特别是 [M0] Mata手册简介和 [M1] 介绍和建议。