【问题标题】:Does Stata choke on matrices named "P"?Stata 是否会在名为“P”的矩阵上窒息?
【发布时间】:2014-09-05 19:59:04
【问题描述】:

所以定义一个名为“Z”的矩阵,并显示它的第一个元素效果很好:

. matrix Z = J(1,3,0)
. matrix list Z

Z[1,3]
    c1  c2  c3
r1   0   0   0

. di el(Z,1,1)
0

另一方面,简单地将名称更改为“P”会破坏el()的功能:

. matrix P = J(1,3,0)
. matrix list P

P[1,3]
    c1  c2  c3
r1   0   0   0

. di el(P,1,1)
type mismatch

为什么?

更新 1:

在发现上述行为时(在调试会话期间),我从命令行和 ado 文件复制,然后在使用 cleardrop program _allmatrix drop _all 清除 Stata 后复制。但是,在重新启动 Stata 后,我无法重现该行为。

更新 2:

至少我认为我使用了clear... 进一步调查表明,如果我在内存中有一个名称以“P”开头的变量,我可以在重新启动时重现该行为。例如(重新启动 Stata):

. matrix P = J(1,3,0)
. matrix list P
. di el(P,1,1)
0

. set obs 100
obs was 0, now 100
. gen Parsnips = uniform()
(100 real changes made)
. di el(P,1,1)
type mismatch
. rename Parsnips parsnips
. di el(P,1,1)
0

【问题讨论】:

    标签: matrix stata


    【解决方案1】:

    这对我来说很好用:

    matrix Z = J(1,3,0)
    matrix list Z
    
    di el(Z,1,1)
    
    matrix P = J(1,3,0)
    matrix list P
    
    di el(P,1,1)
    

    您是否遗漏了信息?

    【讨论】:

    • 很难说。我的猜测是您在el() 中使用了一个宏,并且该宏一旦(取消)引用会导致类似于di el(P,"1","1") 的结果。这会给出您报告的错误类型。
    • 我也这么认为,但我完全使用上面给出的示例语法复制了该行为。即将再次编辑我的帖子,并且可能开始初步了解答案。
    【解决方案2】:

    在我的第二次更新表明的这种情况下,Stata 确实与命名歧义发生冲突。根据我刚刚从他们的技术支持收到的反馈,使用di el(matrix(P),1,1) 明确引用P 作为矩阵解决了这个问题。

    【讨论】:

    • 这对我来说确实是新事物。我得到和你一样的结果。或者,您可以使用di P[1,1] 来显示元素。我已经用你的例子测试了它没有问题。
    • +1 哦,是的……它是 Stata,而不是 R 或 Python,所以我忘记订阅了(我通常认为 Stata 非常努力地使事情变得晦涩难懂/相对于其他语言更具挑战性:)。
    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多