Формула Stata в R без установки Stata - PullRequest
0 голосов
/ 15 января 2019

Можно ли перевести формулу Stata в R без установки Stata на вашем компьютере?

Мой вопрос только выше, но позвольте мне рассказать вам, как он дошел до меня: У меня есть следующая формула Stata

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

(M - матрица, p и d - векторы)

Я хочу преобразовать его в R. Я знаю, что есть пакет Rstata, но он требует установки Stata, которая недоступна на ПК, на котором я работаю.

Вот что я сделал в R:

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

но, похоже, это не работает, и я не могу придумать, как решить эту проблему ...

1 Ответ

0 голосов
/ 15 января 2019

Технически это Мата, а не Стата, код. Mata является более новым из двух языков матричного программирования Stata. Вы вызываете его, набрав mata в командном окне Stata.

Не зная больше о М и р, трудно дать конкретный совет. Вы можете найти руководства Mata онлайн в формате PDF. Смотрите запись op_colon здесь и запись c_conformability здесь .

Операторы двоеточия выполняют поэлементные операции, поэтому M: / p делит каждый элемент M на соответствующий элемент p, если они имеют одинаковый размер.

Если они не одинакового размера, происходит нечто подобное (скажем, деление на один и тот же вектор строки или столбца), которое работает, пока подходят размеры векторов.

После этого вы вычисляете транспонирование этой дважды разделенной матрицы и умножаете матрицу на исходную M.

Вот несколько примеров мата:

. 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
...