使用 gmm 包的矩阵乘法错误
Matrix multiplication error using gmm package
我正在尝试按照 this paper 第 3.2 节中给出的关于 gmm
R
包的使用的示例。所以我想估计一个稳定分布的参数。我正在使用以下代码
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。在数据集中,我有价格、对数价格、对数 returns 和非对数 returns。当我 运行 price
和 return
列中的数据代码时,例如x1 <- returns.return[2:6966]
,没有问题。当我 运行 代码使用 log
或 log.return
列中的数据时,会出现错误消息。我不确定对数变换是否以某种方式改变数据 class 导致错误。感谢您的帮助。
错误不是来自 gmm() 本身,而是来自 ar.ols() 用于在计算 HAC 协方差矩阵之前对矩矩阵进行预白化。如果我们将 prewhite 选项设置为 0,错误就会消失(有关更多信息,请参阅 sandwich 包中的 vcovHAC)。例如,以下不会产生错误:
res1 <- gmm(g1, x1, t0, optfct = "nlminb",
lower = c(0, -1, 0, -Inf),
upper = c(2, 1, Inf, Inf), prewhite=0)
但是,在尝试最小化 objective 函数时,错误消息隐藏了一个数值问题。首先,当第一个系数等于 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)
如果您对鞅差异序列假设没问题,您可以改为继续:
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)
您还剩下调整 optim 或 nlminb 的问题。该函数看起来不太好,因为系数的标准误差看起来很高。
我正在尝试按照 this paper 第 3.2 节中给出的关于 gmm
R
包的使用的示例。所以我想估计一个稳定分布的参数。我正在使用以下代码
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。在数据集中,我有价格、对数价格、对数 returns 和非对数 returns。当我 运行 price
和 return
列中的数据代码时,例如x1 <- returns.return[2:6966]
,没有问题。当我 运行 代码使用 log
或 log.return
列中的数据时,会出现错误消息。我不确定对数变换是否以某种方式改变数据 class 导致错误。感谢您的帮助。
错误不是来自 gmm() 本身,而是来自 ar.ols() 用于在计算 HAC 协方差矩阵之前对矩矩阵进行预白化。如果我们将 prewhite 选项设置为 0,错误就会消失(有关更多信息,请参阅 sandwich 包中的 vcovHAC)。例如,以下不会产生错误:
res1 <- gmm(g1, x1, t0, optfct = "nlminb",
lower = c(0, -1, 0, -Inf),
upper = c(2, 1, Inf, Inf), prewhite=0)
但是,在尝试最小化 objective 函数时,错误消息隐藏了一个数值问题。首先,当第一个系数等于 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)
如果您对鞅差异序列假设没问题,您可以改为继续:
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)
您还剩下调整 optim 或 nlminb 的问题。该函数看起来不太好,因为系数的标准误差看起来很高。