Формула Stata в R без установки Stata
Можно ли перевести формулу Stata в R без установки Stata на вашем компьютере?
У меня вопрос только выше, но позвольте мне дать вам некоторое представление о том, как он пришел ко мне: у меня есть следующая формула Stata
Mtilde=((M:/p):/d)'*M
(M
это матрица, p
а также d
являются векторами)
Я хочу преобразовать его в R. Я знаю, что есть Rstata
пакет, но требует установки Stata, который не доступен на ПК, на котором я работаю.
Вот что я сделал в R:
Mtilde <- ((M/p)/d) %>% t() %>% `%*%`(M)
но это, похоже, не работает, и я не могу придумать способ решить это...
1 ответ
Технически это Мата, а не Стата, код. 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