Stata与R/Python中数据帧的线性代数
在R中(我认为在Python中是Panda),数据集大致对应于一个向量列表。在对数据集中的一组数值变量应用线性代数之前,首先需要将它们转换为矩阵(例如,请参见R lm中的代码)。这需要这些变量的深层拷贝,这需要时间和内存 在Stata中,数据集类似于panda或R,包含不同类型的变量。但是,可以使用Mata函数在数据集的子集上直接使用线性代数。例如,在中,视图足以构造回归器的叉积:Stata与R/Python中数据帧的线性代数,python,r,stata,Python,R,Stata,在R中(我认为在Python中是Panda),数据集大致对应于一个向量列表。在对数据集中的一组数值变量应用线性代数之前,首先需要将它们转换为矩阵(例如,请参见R lm中的代码)。这需要这些变量的深层拷贝,这需要时间和内存 在Stata中,数据集类似于panda或R,包含不同类型的变量。但是,可以使用Mata函数在数据集的子集上直接使用线性代数。例如,在中,视图足以构造回归器的叉积: : M = X = y = . : st_view(M, ., "mpg weight foreign", 0)
: 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/了解不够,无法提供权威性的答案,但这可能与您问题中的这句话有关:“数据集大致对应于一个向量列表”(如果以下错误,请纠正我) 程序编写者总是可以选择是将数据帧实现为“矩阵”还是“向量列表”。Stata做第一个,R/熊猫做第二个(见链接) 为了说明这一点,下表显示了每个备选方案如何在内存中排列数据(尽管比这要复杂一些)。1是内存中的第一个位置,2是第二个位置,依此类推。另外,请记住,如果项目是连续的,则访问速度更快 行存储(Stata): 列存储(R/Py): 这对以后的速度有很大影响,而且没有明确的赢家。例如,假设您有一个N*K数据帧 如果要计算一个变量的汇总统计信息,R/Py应该更快,因为它只需扫描N个观测值,而且它们属于同一类型,甚至更好 另一方面,如果你想取某些变量的平均值,或者取变量子集的倒数,那么Stata会更快,因为这些操作需要你将访问每行的多个项组合在一起(我认为BLAS/LAPACK就是这样工作的,每个人基本上都会调用它们进行矩阵操作) 每种方法都有其他优点。例如,在列存储(R/Py)中,一个变量的排序应该更快,但是Stata做得非常好的一些事情(比如那些
x[\u n-1]
操作)在R/Py上实现起来要困难得多
您可以在数据库文献中看到有关此主题的更大讨论。例如,Dan Abadie的这篇开创性论文做得很好:
(请注意,他提倡的一些列存储所独有的功能,如内联压缩,也可以通过在行存储中多做一些工作来实现;这就是Stata拥有的新的strL类型)您是否阅读了
帮助mf_st_查看
?在Mata中,关于视图和副本的区别、优点、缺点和注意事项都存在。如果Python和R程序员想看一下,那么该帮助文件的web链接就是。在这一点上,我真的不明白你的问题是什么。是关于你列出的三种软件/语言中使用哪种软件/语言?是关于st_data()
和st_view
之间的区别吗?还是什么?刚刚编辑过。现在清楚了吗?我想更好地理解为什么Stata可以做而不是其他语言。这取决于你如何存储数据。如果你小心的话,它们就不需要被复制了。我知道你不是故意要把你的例子当真的。为了准确起见,我要注意,inv(X)
不是Mata函数(Mata中还有其他逆变器),而是Stata矩阵函数。即使在Stata中,该示例也会失败,因为X
通常不是对称的。
x y z
1 2 3
4 5 6
7 8 9
x y z
1 4 7
2 5 8
3 6 9