Stata 中数据帧的线性代数与 R/Python

Linear algebra on dataframes in Stata vs R/Python

在 R 中(我认为 Panda 在 Python 中),数据集大致对应于向量列表。在对数据集中的一组数值变量应用线性代数之前,首先需要将它们转换为矩阵(例如参见 R lm 中的代码)。这需要对这些变量进行深拷贝,这需要时间和内存。

在 Stata 中,数据集类似于 panda 或 R,包含不同类型的变量。但是,可以使用 Mata 函数 _st_view. For instance in the function cross() documentation 直接在数据集的子集上使用线性代数,视图足以构造回归量的叉积:

: M = X = y = .
: st_view(M, ., "mpg weight foreign", 0)
: st_subview(y, M, ., 1)
: st_subview(X, M, ., (2\.))
:
: XX = cross(X,1 , X,1)
: Xy = cross(X,1 , y,0)
: b = invsym(XX)*Xy

这在速度和内存方面似乎是有利的。

为什么不能在 R/Python 中做同样的事情?这种差异是否对应于数据结构低级实现方面的重要区别?允许这样的功能是否有折衷?

我对 R / Pandas 了解不够,无法提供权威答案,但它可能与您问题中的这句话有关:"datasets roughly correspond to a list of vectors"(如果以下内容有误,请指正) .

程序编写者总是可以选择将数据框实现为 "matrix" 还是 "list of vectors"。 Stata 执行第一个,R/Pandas 执行第二个(参见 link)。

为了说明,下面的 table 显示了每个备选方案如何在内存中排列数据(尽管它比这更复杂一点)。 1 是内存中的第一个位置,2 是第二个,依此类推。另外,请记住,如果项目是连续的,访问速度会更快。

行存储(Stata):

x y z
1 2 3
4 5 6
7 8 9

列存储(R/Py):

x y z
1 4 7
2 5 8
3 6 9

这对以后的速度有很多影响,而且没有明显的赢家。例如,假设您有一个 N*K 数据框。

如果要计算一个变量的汇总统计量,R/Py应该更快,因为它只需要扫描N个观测值,而且它们是同一类型,这样更好。

另一方面,如果你想取某些变量的平均值,或者变量子集的倒数,那么 Stata 会更快,因为这些操作需要你将每行的多个项目组合在一起(我认为这就是 BLAS/LAPACK 的工作原理,每个人基本上都将其称为矩阵运算。

每个都有其他优点。例如,一个变量的排序在列存储中应该更快(R/Py),但是 Stata 做得很好的一些事情(比如那些 x[_n-1] 操作)在 [=43 上实现起来要困难得多=].

您可以在数据库文献中看到关于此主题的更大讨论。例如,Dan Abadie 的这篇开创性论文就做得很好:

http://db.csail.mit.edu/projects/cstore/abadi-sigmod08.pdf

(尽管请注意,他提倡的列式存储独有的某些功能(例如内联压缩)也可以通过行存储中的更多工作来实现;Stata 拥有的新 strL 类型就是这种情况)