什么时候在Stata中为el(s,i,j)调用有效的范围内整数i和j是非法的?

时间:2018-05-02 17:32:41

标签: stata

我使用matrix list来显示我在程序中的矩阵P

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

我希望el()函数返回我的矩阵i,j的{​​{1}}元素,我正在尝试P这个值(即打印“0”)使用:

display

然而,Stata 15.1回复了我:

noi: di el(P,1,1)

为什么会这样?

修改

简化为一个简单的程序:

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

结果输出:

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

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你没有告诉我们这是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 manual所述:

  

“...矩阵可能与数据集中的变量具有相同的名称,如果是,则在评估表达式(exp)时,Stata可能会显得混乱。   当名称冲突时,Stata使用的规则是它始终采用数据变量解释......“

因此,在评估表达式时,必须通过明确告知Stata它正在处理矩阵来覆盖此行为。这可以使用matrix()函数来完成。

在这种情况下,MyProgram中的第3行应更改为:

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

答案 1 :(得分:1)

事实证明这种行为不是一个错误:在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