Функция для функции импульсного отклика

Я создал следующий пример кода, чтобы нарисовать "функцию импульсного ответа" в R с помощью пакета [vars][1].

library(vars)
data(Canada)
Canada <- data.frame(Canada)

irfplot = function(x, y) {
  VAR <- VAR(cbind(x,y), p = 2, type = "trend")
  irf_o <-irf(VAR, impulse = colnames(VAR$y)[1], response = colnames(VAR$y)[2], boot = TRUE, cumulative = FALSE, n.ahead = 20, ci = 0.90)
  plot(irf_o)
}

irfplot(Canada["rw"],Canada["U"])

Это должно работать до сих пор. Однако при попытке сделать script более гибким, записав функцию как

irfplot = function(x, y, lags, deter) {
      VAR <- VAR(cbind(x,y), p = lags, type = deter)
...

irfplot(Canada["rw"],Canada["U"], 2, "trend")

он возвращает:

Error in VAR(y = ysampled, p = lags, type = "trend") : 
  object 'lags' not found 

Вопрос: Как решить проблему? У меня есть некоторые другие функции, которые передают значения через объекты, но по какой-либо причине они не работают.

Спасибо.

Ответ 1

Вопрос

Проблема заключается в аргументе boot = TRUE функции irf(). Прежде всего отметим, что следующее работает просто отлично

irfplot <- function(x, y, lags, deter) {

  var_o   <- VAR(cbind(x, y), p = lags, type = deter)
  irf_o <- irf(var_o, 
               impulse = colnames(var_o$y)[1], 
               response = colnames(var_o$y)[2], boot = FALSE)
  plot(irf_o)
}
irfplot(Canada["rw"], Canada["U"], 3, "trend")

Изменение boot до TRUE вызывает ошибку. Случается, что lags и deter не будут правильно переданы функции, выполняющей загрузку. Хотя, я не думаю, что это технически ошибка, было бы полезно, если бы автор пакета изменил его.

Решение

Всякий раз, когда вы хотите передать некоторые аргументы функции в функции верхнего уровня для функции более низкого уровня, она меньше подвержена ошибкам (как вы видите в вашем примере) и обычно рекомендуется использовать аргумент ....

irfplot <- function(x, y, ...) {

  var_o   <- VAR(cbind(x, y), ...)
  irf_o <- irf(var_o, 
               impulse = colnames(var_o$y)[1], 
               response = colnames(var_o$y)[2], boot = TRUE)
  plot(irf_o)
}
irfplot(Canada["rw"], Canada["U"], 3, "trend")

Ответ 2

Я согласен с F. Privé, что вы должны сообщать об этом как об ошибке для автора. Однако в интересах быстрого решения проблемы быстро измените имена аргументов в соответствии с именами вызовов vars функций:

library(vars)
data(Canada)
Canada <- data.frame(Canada)

irfplot <- function(x, y, p, type) {
    VAR <- VAR(cbind(x,y), p=p, type=type)
    irf_o <-irf(VAR, impulse=colnames(VAR$y)[1], response=colnames(VAR$y)[2],
                boot=TRUE, cumulative=FALSE, n.ahead=20, ci=0.90)
    plot(irf_o)
}

irfplot(x=Canada["rw"], y=Canada["U"], p=2, type="trend")

Для меня это произвело следующий график:

irfplot