【问题标题】:Stata formula in R without Stata installation没有安装Stata的R中的Stata公式
【发布时间】:2019-06-08 23:24:24
【问题描述】:

是否可以在您的 PC 上不安装 Stata 的情况下将 Stata 公式翻译成 R?

我的问题就是上面提到的,但让我给你一些背景知识: 我有以下Stata公式

Mtilde=((M:/p):/d)'*M

M 是矩阵,pd 是向量)

我想将其转换为 R。我知道有 Rstata 包,但它需要安装 Stata,这在我正在工作的 PC 上不可用。

这就是我在 R 中所做的:

Mtilde <- ((M/p)/d) %>% t() %>% `%*%`(M)

但它似乎不起作用,我想不出办法解决它......

【问题讨论】:

  • 您能否举一个简单的例子——甚至可能是一个 2x2 矩阵——以及预期的结果?即使您必须手动计算,这也有助于找出正确的 R 代码。
  • @thelatemail 你是对的,我会尝试发布一个例子,但由于我会手动解决它,所以我需要一些时间......
  • @thelatemail,问题出在我的定义中:我将 p 和 d 定义为向量,但它们应该是公式才能正常工作的矩阵。我意识到通过手动解决它......无论如何,谢谢你并为无法提供一个有效的例子而道歉......
  • 很高兴听到。我通过信封计算发现代码错误的次数太多了!

标签: r stata translate


【解决方案1】:

这在技术上是 Mata 代码,而不是 Stata 代码。 Mata 是 Stata 的两种矩阵编程语言中较新的一种。您可以通过在 Stata 命令窗口中输入 mata 来调用它。

如果不了解更多关于 M 和 p 的信息,很难给出具体建议。您可以在线找到 pdf 文件形式的 Mata 手册。请参阅 op_colon 条目 here 和 c_conformability 条目 here

冒号运算符执行逐个元素的操作,因此 M :/ p 将 M 的每个元素除以 p 的相应元素(如果两者大小相同)。

如果它们的大小不同,则会发生类似的事情(比如除以相同的行或列向量),只要向量的尺寸合适,它就可以工作。

一个完成,你计算那个二次分割矩阵的转置,然后矩阵乘以原始M。

以下是一些 mata 示例:

. mata
------------------------------------------------- mata (type end to exit) ------------------------------------------------------------------
: M=(1,2\3,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

【讨论】:

  • 谢谢@Dimitriy,它实际上是你说的mata代码。问题是(就像你指出的那样)向量的维度很方便进行除法,但事实证明它们应该是公式才能正常工作的矩阵!感谢您的全面回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多