Ошибка умножения матрицы с использованием пакета gmm

#r #generalized-method-of-moments

#r #обобщенный метод моментов

Вопрос:

Я пытаюсь следовать примеру, приведенному в разделе 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
  

Мои данные можно найти здесь. В наборе данных у меня есть цены, логарифмические цены, логарифмические возвраты и нелогарифмические возвраты. Когда я запускаю код для данных в столбцах price и return , например, x1 <- returns.return[2:6966] , проблемы нет. Сообщение об ошибке появляется, когда я запускаю код, используя данные из столбца log или log.return . Я не уверен, изменяет ли логарифмическое преобразование класс данных каким-либо образом, чтобы привести к ошибке. Приветствуется любая помощь.

Ответ №1:

Ошибка исходит не от самой gmm (), а от ar.ols(), которая используется для предварительного отбеливания матрицы моментов перед вычислением ковариационной матрицы HAC. Ошибка исчезнет, если мы установим для параметра prewhite значение 0 (см. vcovHAC из пакета sandwich для получения дополнительной информации). Например, следующее не приводит к ошибке:

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

Однако сообщение об ошибке скрывает числовую проблему при попытке минимизировать целевую функцию. Во-первых, NA генерируются, когда первый коэффициент равен 2 или если третий равен 0, и 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. Функция выглядит не слишком хорошо, поскольку стандартные ошибки коэффициентов выглядят довольно высокими.