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