使用predict()函数时出错
我是否应该将使用predict()函数时出错,r,predict,R,Predict,我是否应该将ar.ols的输出转换为predict可以接受的某种类型 y=rnorm(100, 0,1) z=rnorm(100, 0,1) yz=cbind(y,z) > output = ar.ols(yz, aic = F, order.max = 2, demean = F, intercept = T) > predict(output, n.ahead = 2, se.fit = F) x=as.data.frame(yz) # x is a data fram
ar.ols
的输出转换为predict
可以接受的某种类型
y=rnorm(100, 0,1)
z=rnorm(100, 0,1)
yz=cbind(y,z)
> output = ar.ols(yz, aic = F, order.max = 2, demean = F, intercept = T)
> predict(output, n.ahead = 2, se.fit = F)
x=as.data.frame(yz) # x is a data frame, and otherwise same as yz.
> output = ar.ols(x, aic = F, order.max = 2, demean = F, intercept = T)
> predict(output, n.ahead = 2, se.fit = F)
Error in array(STATS, dims[perm]) : 'dims' cannot be of length 0
谢谢 因此错误来自
predict.ar
。如果运行?predict
,您将看到它是一个通用函数,它“调用依赖于第一个参数的类的特定方法”
所以
及
告诉您我们正在寻找第一种方法
下一个尝试是在该方法中查找错误消息。前面的操作告诉我们,predict.ar
是不可见的函数,因此我们需要将getAnywhere
和capture.output
与一些正则表达式函数结合起来,以查找错误消息,但遗憾的是,这不起作用
grep("array", capture.output(getAnywhere("predict.ar")))
## integer(0)
这意味着错误来自于predict.ar
中运行的其他函数
(正如@hadley提到的)我们需要使用traceback()
来识别导致它的内部函数
predict(output, n.ahead = 2, se.fit = F)
# Error in array(STATS, dims[perm]) : 'dims' cannot be of length 0
traceback()
# 6: array(STATS, dims[perm])
# 5: aperm(array(STATS, dims[perm]), order(perm))
# 4: sweep(newdata, 2L, object$x.mean, check.margin = FALSE)
# 3: rbind(sweep(newdata, 2L, object$x.mean, check.margin = FALSE),
# matrix(rep.int(0, nser), n.ahead, nser, byrow = TRUE))
# 2: predict.ar(output, n.ahead = 2, se.fit = F)
# 1: predict(output, n.ahead = 2, se.fit = F)
这很好地向我们展示了函数调用的工作流程:
调用predict
->识别对象的类别,并调用相应的方法predict.ar
->rbind
预分配矩阵(大小ncol(x)
*n.ahead
),使用sweep
->对数据进行平均居中(使用sweep
),在最后一次操作返回错误时,转置一些数组
并创建一个新的数组
因此,基本上所有的sweep
函数都是从yz
中减去yz
的平均值(平均值居中-这可以通过运行scale(yz,scale=FALSE)
来完成,所以不确定他们为什么首先使用sweep
。可能是针对dmean=FALSE
特殊情况吗?)。在您的例子中,您指定了dmean=FALSE
,因此它会从两列中删除零(这是非常不必要的操作,在这种情况下可能应该避免)。比较
唯一的问题是,sweep
对数组进行操作,因此它尝试将数据转换为数组,同时通过从yz
传递dim
属性来指定正确的维度,并创建一个数组
以进行进一步的操作,例如
dims <- dim(yz)
perm <- c(2L, seq_along(dims)[-2L])
array(colMeans(yz), dims[perm])
唯一的问题是predict.ar
函数在x
属性到达sweep
之前将class
属性从过程中的某个位置剥离,因此这就是矩阵
和数据.frame
之间的差异所在
class(x) <- NULL
dim(x)
## NULL
class(x)
## [1] "list"
这将返回您以前看到的错误
x <- as.data.frame(yz)
STATS <- colMeans(x)
class(x) <- NULL
dims <- dim(x)
perm <- c(2L, seq_along(dims)[-2L])
array(STATS, dims[perm])
# Error in array(STATS, dims[perm]) : 'dims' cannot be of length 0
x有一个可复制的例子,搜索这个问题会有趣得多…@RStudent:谢谢。我明白你的意思,问题是因为x是一个数据帧。将x替换为as.matrix(x),问题就消失了。我想知道predict.ar是如何重建提供给ar.ols
的数据的。代码对我来说似乎有点奇怪,但我的一般建议是,既然ar.ols
的文档中说应该传递一个时间序列,那么您可能应该传递一个时间序列对象。@joran:谢谢!如何将矩阵或数据帧转换为时间序列对象?请参见?ts
。我不希望数据帧与时间序列函数配合得很好。矩阵或时间序列对象是解决问题的方法。我认为使用traceback()
可以更快地找到错误的根源,而不必使用如此复杂的技巧。@hadley,谢谢,补充道。
dims <- dim(yz)
perm <- c(2L, seq_along(dims)[-2L])
array(colMeans(yz), dims[perm])
dim(x)
## [1] 100 2
class(x) <- NULL
dim(x)
## NULL
class(x)
## [1] "list"
class(yz) <- NULL
dim(yz)
## [1] 100 2
class(yz)
## [1] "matrix"
STATS <- colMeans(yz)
class(yz) <- NULL
dims <- dim(yz)
perm <- c(2L, seq_along(dims)[-2L])
array(STATS, dims[perm])
x <- as.data.frame(yz)
STATS <- colMeans(x)
class(x) <- NULL
dims <- dim(x)
perm <- c(2L, seq_along(dims)[-2L])
array(STATS, dims[perm])
# Error in array(STATS, dims[perm]) : 'dims' cannot be of length 0