我创建了以下示例代码来绘制"脉冲响应函数"在[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
问题:如何解决问题?我有一些其他函数通过对象传递值,但由于任何原因,它不起作用。
谢谢。
答案 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
会导致错误。会发生什么是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")
答案 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")
对我来说,这产生了以下情节: