Функция для функции импульсного отклика
Я создал следующий пример кода, чтобы нарисовать "функцию импульсного ответа" в 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]()