Когда в Stata запрещено вызывать el (s, i, j) для действительных целых чисел в диапазоне i и j? - PullRequest
0 голосов
/ 02 мая 2018

Я использую matrix list, чтобы показать матрицу P, которая у меня есть в программе:

P[1,6]
    c1   c2   c3   c4   c5   c6
r1   0    0    0    0    0    0 

Я ожидаю, что функция el() вернет элемент i,j моей матрицы P, и я пытаюсь display это значение (т. Е. Вывести «0»), используя:

noi: di el(P,1,1)

Однако Stata 15.1 возвращается ко мне с:

  - noi: di el(P,1,1)
type mismatch

Почему это происходит?


EDIT:

Сводится к простой программе:

program define MyProgram
matrix P = J(1,6,0)
noi: matrix list P
noi: di el(P,1,1)
end

И полученный результат:

MyProgram

P[1,6]
c1  c2  c3  c4  c5  c6
r1   0   0   0   0   0   0
type mismatch
r(109);

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Таким образом, оказывается, что это поведение не является ошибкой: в Stata пространство имен для переменных, матриц и скаляров сталкивается (с именами переменных, имеющих приоритет).

Чтобы указать, что имя является матрицей в функции, ожидающей такого, избегая коллизий, можно сделать имя явно матрицей таким образом:

program define MyProgram
matrix P = J(1,6,0)
noi matrix list P
noi di el(matrix(P),1,1)
end

И затем вывод, который получается, даже если переменные загружены в память, начиная с «P»:

. gen P = 0

. MyProgram

P[1,6]
c1  c2  c3  c4  c5  c6
r1   0   0   0   0   0   0
0
0 голосов
/ 02 мая 2018

Как я уже сказал в своем комментарии, вы не сказали нам, что это было частью ado файла. Иногда сообщения об ошибках, подобные сообщаемому вами, возникают из-за конфликтов между переменными с одинаковыми именами.

Сначала это ошибка:

. clear

. set obs 1
number of observations (_N) was 0, now 1

. 
. generate P = 0

. 
. program define MyProgram
  1. matrix P = J(1,6,0)
  2. noi matrix list P
  3. noi di el(P,1,1)
  4. end

. 
. MyProgram

P[1,6]
    c1  c2  c3  c4  c5  c6
r1   0   0   0   0   0   0
type mismatch
r(109);

Действительно, если вы избавитесь от переменной P, она будет работать, как и ожидалось:

. drop P

. 
. MyProgram

P[1,6]
    c1  c2  c3  c4  c5  c6
r1   0   0   0   0   0   0
0

Однако внешность может быть обманчива. Как указано в руководстве Stata :

"... Матрица может иметь то же имя, что и переменная в наборе данных, и если это так, Stata может показаться запутанной при оценке выражения (exp). Когда имена конфликтуют, Stata использует правило, которое всегда принимает интерпретацию переменных данных ... "

Таким образом, при оценке выражений необходимо переопределить это поведение, явно указав Stata, что он имеет дело с матрицей. Это можно сделать с помощью функции matrix().

В этом случае строка 3 в MyProgram должна измениться на:

noi: di el(matrix(P),1,1)
...