没有安装 Stata 的 R 中的 Stata 公式
Stata formula in R without Stata installation
是否可以在您的 PC 上没有安装 Stata 的情况下将 Stata 公式转换为 R?
我的问题就是上面的问题,但让我给你一些背景知识:
我有以下 Stata 公式
Mtilde=((M:/p):/d)'*M
(M
是矩阵,p
和d
是向量)
我想将其转换为 R。我知道有 Rstata
软件包,但它需要安装 Stata,而我正在工作的 PC 上没有。
这是我在 R 中所做的:
Mtilde <- ((M/p)/d) %>% t() %>% `%*%`(M)
但似乎没有用,我想不出解决它的方法...
从技术上讲,这是 Mata 代码,而不是 Stata 代码。 Mata 是 Stata 的两种矩阵编程语言中较新的一种。您可以通过在 Stata 命令 window.
中键入 mata
来调用它
在不了解更多关于M和p的情况下,很难给出具体的建议。您可以在线找到 pdf 文件形式的 Mata 手册。请参阅 op_colon 条目 here and the c_conformability entry here。
冒号运算符执行逐个元素的操作,因此如果 M :/ p 的每个元素大小相同,则将 M 的每个元素除以 p 的相应元素。
如果它们的大小不同,也会发生类似的事情(比如除以相同的行或列向量),只要向量的维度合适,它就可以工作。
大功告成,你计算那个二分矩阵的转置,矩阵乘以原来的M。
以下是一些 mata 示例:
. mata
------------------------------------------------- mata (type end to exit) ------------------------------------------------------------------
: M=(1,2,4)
: M
1 2
+---------+
1 | 1 2 |
2 | 3 4 |
+---------+
: p=(1,2)
: p
1 2
+---------+
1 | 1 2 |
+---------+
: M:/p
1 2
+---------+
1 | 1 1 |
2 | 3 2 |
+---------+
: M:/p'
1 2
+-------------+
1 | 1 2 |
2 | 1.5 2 |
+-------------+
: ((M:/p):/p)
1 2
+-----------+
1 | 1 .5 |
2 | 3 1 |
+-----------+
: ((M:/p):/p)'*M
1 2
+-------------+
1 | 10 14 |
2 | 3.5 5 |
+-------------+
: end
这是对应的R版本:
> M <- matrix(1:4,2,2,byrow=TRUE)
> M
[,1] [,2]
[1,] 1 2
[2,] 3 4
> p <- matrix((1:2), 1, 2)
> p
[,1] [,2]
[1,] 1 2
> t(p)
[,1]
[1,] 1
[2,] 2
> # the second argument needs to be 1 for row or 2 for column
> sweep(M, 2, p, FUN = '/')
[,1] [,2]
[1,] 1 1
[2,] 3 2
> sweep(M, 1, t(p), FUN = '/')
[,1] [,2]
[1,] 1.0 2
[2,] 1.5 2
> sweep(sweep(M, 2, p, FUN = '/'),2,p,FUN = '/')
[,1] [,2]
[1,] 1 0.5
[2,] 3 1.0
> t(sweep(sweep(M, 2, p, FUN = '/'),2,p,FUN = '/'))%*%M
[,1] [,2]
[1,] 10.0 14
[2,] 3.5 5
是否可以在您的 PC 上没有安装 Stata 的情况下将 Stata 公式转换为 R?
我的问题就是上面的问题,但让我给你一些背景知识: 我有以下 Stata 公式
Mtilde=((M:/p):/d)'*M
(M
是矩阵,p
和d
是向量)
我想将其转换为 R。我知道有 Rstata
软件包,但它需要安装 Stata,而我正在工作的 PC 上没有。
这是我在 R 中所做的:
Mtilde <- ((M/p)/d) %>% t() %>% `%*%`(M)
但似乎没有用,我想不出解决它的方法...
从技术上讲,这是 Mata 代码,而不是 Stata 代码。 Mata 是 Stata 的两种矩阵编程语言中较新的一种。您可以通过在 Stata 命令 window.
中键入mata
来调用它
在不了解更多关于M和p的情况下,很难给出具体的建议。您可以在线找到 pdf 文件形式的 Mata 手册。请参阅 op_colon 条目 here and the c_conformability entry here。
冒号运算符执行逐个元素的操作,因此如果 M :/ p 的每个元素大小相同,则将 M 的每个元素除以 p 的相应元素。
如果它们的大小不同,也会发生类似的事情(比如除以相同的行或列向量),只要向量的维度合适,它就可以工作。
大功告成,你计算那个二分矩阵的转置,矩阵乘以原来的M。
以下是一些 mata 示例:
. mata
------------------------------------------------- mata (type end to exit) ------------------------------------------------------------------
: M=(1,2,4)
: M
1 2
+---------+
1 | 1 2 |
2 | 3 4 |
+---------+
: p=(1,2)
: p
1 2
+---------+
1 | 1 2 |
+---------+
: M:/p
1 2
+---------+
1 | 1 1 |
2 | 3 2 |
+---------+
: M:/p'
1 2
+-------------+
1 | 1 2 |
2 | 1.5 2 |
+-------------+
: ((M:/p):/p)
1 2
+-----------+
1 | 1 .5 |
2 | 3 1 |
+-----------+
: ((M:/p):/p)'*M
1 2
+-------------+
1 | 10 14 |
2 | 3.5 5 |
+-------------+
: end
这是对应的R版本:
> M <- matrix(1:4,2,2,byrow=TRUE)
> M
[,1] [,2]
[1,] 1 2
[2,] 3 4
> p <- matrix((1:2), 1, 2)
> p
[,1] [,2]
[1,] 1 2
> t(p)
[,1]
[1,] 1
[2,] 2
> # the second argument needs to be 1 for row or 2 for column
> sweep(M, 2, p, FUN = '/')
[,1] [,2]
[1,] 1 1
[2,] 3 2
> sweep(M, 1, t(p), FUN = '/')
[,1] [,2]
[1,] 1.0 2
[2,] 1.5 2
> sweep(sweep(M, 2, p, FUN = '/'),2,p,FUN = '/')
[,1] [,2]
[1,] 1 0.5
[2,] 3 1.0
> t(sweep(sweep(M, 2, p, FUN = '/'),2,p,FUN = '/'))%*%M
[,1] [,2]
[1,] 10.0 14
[2,] 3.5 5