使用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