我使用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
答案 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