我得到了一个用 GAUSS 编写的 MLE 估计器,我试图将它重新编码为 R。我不使用,也从未使用过 GAUSS 本身(并且无法访问它)。在代码中,有一行让我有点困惑。
在经过验证的 GAUSS 代码中,“输入”(部分注释)下有一行说明:
invsig: scalar or m-by-m matrix with inverse of sigma
我正在努力让代码一块一块地工作,但我的第一个问题是相对简单的。
这是让我困惑的 GAUSS 片段:
...
local m, k, tobs, invsig
m = rows(y);k = rows(x); tobs = rows(dat)
invsig= eye(m)*invsig
...
我知道这是乘以“输入”invsig 的单位矩阵,但是在有效的模拟示例中(来自附加到代码的日志文件),可以使用 invsig 的标量值启动程序。 IE:将初始值设置为 invsig = 1
在 R 中,这是行不通的。这是尝试获取此信息的简单“测试”代码:
y.mat <- rep(rexp(3))
x.mat <- matrix(rexp(36), 12, 3)
myfct <- function(x,invsig){
m <- nrow(x)
invsig <- diag(m)%*%invsig
return(invsig)
}
t1 <- myfct(x.mat, 1) ##Non-conformable error
t2 <- myfct(x.mat, y.mat) ##Works
我理解我在 R 中遇到的不一致错误。问题是我在 GAUSS 和 R 之间的转换中是否遗漏了什么?在阅读在线帮助手册时,GAUSS 通过使用单个符号 (*/+-) 进行矩阵运算,并按元素进行操作,您添加一个“.”。每次操作前。所以对我来说,GAUSS 代码说要做矩阵乘法(R 中的
%*%
),这就是简单函数试图做的。任何意见或建议,不胜感激!
最佳答案
您的问题是您不能将 3x3 矩阵与 1x1 矩阵相乘。我会推荐类似的东西
myfct <- function(x,invsig){
if (is.matrix(invsig)) return(invsig)
m <- nrow(x)
return(diag(invsig, nrow = m))
}
编辑 在第一种情况下,我在乘以
diag(m)
时留下了,但是如果 invsig
已经是矩阵,则当然没有必要。