Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stata与R/Python中数据帧的线性代数_Python_R_Stata - Fatal编程技术网

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

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)

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

在Stata中,数据集类似于panda或R,包含不同类型的变量。但是,可以使用Mata函数在数据集的子集上直接使用线性代数。例如,在中,视图足以构造回归器的叉积:

: 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