R语言 用zoo实现自定义函数在滚动窗口中的应用

qhhrdooz  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在做一个研究项目,我想重新创建一个我在一篇文章中读到的市场效率指标。由于我正在处理一个大数据集,我决定在R中自动化这个过程。首先,我定义了一个函数,它返回指标中使用的标准化beta系数,这里显示了一个可重复的例子:

beta_hats = function(j) {
  step1 = ar(j, aic = TRUE)$asy.var.coef
  step2 = ar(j, aic = TRUE)$ar
  step3 = chol(step1)
  step4 = t(step3)
  step5 = solve(step4)
  step6 = step5 %*% step2
  step7 = abs(step6)
  step8 = sum(step7)
    return(step8)
}

repro = data.frame(rnorm(3000, 0.0003563425, 0.0216025))
beta_hats(repro)

> beta_hats(repro)
[1] 1.587869

这将为整个数据集生成所需的结果,但是,我希望我的度量是随时间变化的,所以我尝试在滚动窗口上重复该函数。

y = repro
t = 250
library(zoo)
z = rollapplyr(y, t, function(y) beta_hats(y))

Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), :
'data' must be of a vector type, was 'NULL'

此时功能不再工作。有人能帮我解决这个问题吗?

其他信息:

  • 如果不将data.frame()规范添加到可重现的示例中,则会在整个数据集的函数中产生相同的错误
  • 由于可重现的示例是完全随机的,因此如果您决定使用真实的市场回报来重现误差,则函数可能会产生高得多的值
  • 数据集的class()返回“tbl_df”、“tbl”、“ Dataframe ”
ej83mcc0

ej83mcc01#

这是当您要执行NULL对象的cholesky分解时产生的错误:

chol(NULL)
Error in array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x),  : 
  'data' must be of a vector type, was 'NULL'

这表明问题出在数据中,而不是出在rollapply函数中。请尝试重新生成数据,然后再次对数据调用函数。系数估计值的渐近理论方差矩阵似乎为NULL。请注意,如果阶数〉0,则会给出系数估计值
例如:

set.seed(1)
repro = data.frame(a=rnorm(3000, 0.0003563425, 0.0216025))
ar(repro$a, aic =TRUE)$order
[1] 0

由于阶数为0,因此步骤1中该数据集的渐近理论方差为NULL

ar(repro$a, aic =TRUE)$asy.var.coef
 [1] NULL

因此,函数的第3步将抛出您遇到的错误。您需要在有效的数据集中运行函数。
另请注意,尽管函数可能不会在完整数据集中引发错误,但如果由于上述原因而使用子集,则函数最终可能会引发错误

相关问题