使用gmm软件包的矩阵乘法误差

时间:2019-03-20 05:04:37

标签: r generalized-method-of-moments

我正在尝试使用gmm R包来遵循this paper第3.2节中给出的示例。因此,我想估计一个稳定分布的参数。我正在使用以下代码

library(gmm)
library(stabledist)
library(StableEstim)

g1 <- function(theta, x){
  tau <- seq(1, 5, length.out = 10)
  pm <- 1
  x <- matrix(c(x), ncol = 1)
  x_comp <- x%*%matrix(tau, nrow = 1)
  x_comp <- matrix(complex(imaginary = x_comp), ncol = length(tau))
  emp_car <- exp(x_comp)
  the_car <- charStable(theta, tau, pm)
  gt <- t(t(emp_car) - the_car)
  gt <- cbind(Im(gt), Re(gt))
  return(gt)
}

x1 <- returns$log.return[2:6966]
t0 <- McCullochParametersEstim(x1)
res1 <- gmm(g1, x1, t0, optfct = "nlminb", 
            lower = c(0, -1, 0, -Inf), 
            upper = c(2, 1, Inf, Inf))

summary(res1)

请注意,McCullochParametersEstim()是基于分位数的参数估计方法,在此用于计算起始值。当我运行此代码时,我收到以下错误

Error in AA %*% t(X) : requires numeric/complex matrix/vector arguments
In addition: Warning message:
In ar.ols(x, aic = aic, order.max = order.max, na.action = na.action,  :
  model order:  1 singularities in the computation of the projection 
  matrix results are only valid up to model order 0

我的数据可以找到here。在数据集中,我有价格,对数价格,对数收益和非对数收益。当我对pricereturn列中的数据运行代码时,例如x1 <- returns.return[2:6966],没有问题。当我使用loglog.return列中的数据运行代码时,出现错误消息。我不确定对数转换是否会以某种方式更改数据类以导致错误。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

该错误并非来自gmm()本身,而是来自ar.ols(),后者用于在计算HAC协方差矩阵之前对矩矩矩阵进行预白化。如果将prewhite选项设置为0,该错误消失(有关更多信息,请参阅三明治包中的vcovHAC)。例如,以下不会产生错误:

res1 <- gmm(g1, x1, t0, optfct = "nlminb",
            lower = c(0, -1, 0, -Inf),
            upper = c(2, 1, Inf, Inf), prewhite=0)

但是,错误消息在试图最小化目标函数时隐藏了一个数字问题。首先,当第一个系数等于2或第三个系数等于0时产生NA,并且nlminb似乎至少对于第一个系数达到边界,这导致了奇异的协方差矩阵。

需要做一些工作才能正确调整optim或nlminb。请注意,在特定情况下可以加快处理速度,因为模型是最小距离(MDE),这意味着只要我们愿意将系数居中,加权矩阵就不会依赖于系数,建议这样做。然后可以使用具有固定权重矩阵的一步式GMM估算模型。有两种选择

力矩是弱相关的,因此需要一个HAC矩阵。按照您的代码,您可以执行以下操作:

gt0 <- g1(t0, x1)
gt0 <- scale(gt0, scale=FALSE)
class(gt0) <- "gmmFct"
V0 <- vcovHAC(gt0, sandwich=FALSE)
W0 <- solve(V0)
res1 <- gmm(g1, x1, t0, vcov="TrueFixed", weightsMatrix=W0)

如果您对the差序列的假设感到满意,可以改用这种方式进行:

q <- qr(gt0/sqrt(nrow(gt0)))
W1 <- matrix(NA, ncol(gt0),ncol(gt0))
W1[q$pivot, q$pivot] <- chol2inv(q$qr)
res2 <- gmm(g1, x1, t0, vcov="TrueFixed", weightsMatrix=W1)

您剩下的问题是优化优化或nlminb的问题。该函数的表现不太好,因为系数的标准误看起来很高。