脉冲响应函数的功能

时间:2017-10-13 19:21:34

标签: r function

我创建了以下示例代码来绘制"脉冲响应函数"在[vars][1]包的帮助下,在R中。

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"])

到目前为止应该有效。但是,通过将函数编写为

来尝试使脚本更加灵活
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 

问题:如何解决问题?我有一些其他函数通过对象传递值,但由于任何原因,它不起作用。

谢谢。

2 个答案:

答案 0 :(得分:2)

问题

问题是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会导致错误。会发生什么是lagsdeter显然没有正确传递给执行自举的函数。虽然,我不认为它在技术上是一个错误,如果包的作者改变了它肯定会有所帮助。

解决方案

每当你想将顶级函数中的一些函数参数传递给某个较低级别的函数时,它就不容易出错(正如你在你的例子中看到的那样),并且通常建议使用...参数。

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")

答案 1 :(得分:1)

我同意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