Ошибка умножения матрицы при использовании пакета gmm - PullRequest
1 голос
/ 20 марта 2019

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

2 голосов
/ 20 марта 2019

Ошибка не в самой функции 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)

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

...