You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在zoo中为滚动窗口应用自定义R函数时遇错求助

问题:滚动窗口调用beta系数函数时出现类型错误

我正在开展一项研究项目,想要复现一篇文献中的市场效率测度方法。由于处理的数据集较大,我决定在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", "data.frame",即 tibble 数据框、tibble、普通数据框

解决方案

错误核心原因是rollapplyr处理数据框时,会将窗口子数据框传递给beta_hats,但ar()函数无法直接处理数据框输入,需传入向量;同时当ar()选择的滞后阶数为0时,$ar返回NULL会导致后续计算报错。可通过以下两步修改:

  1. 修改beta_hats函数,先将输入转为向量,同时处理滞后阶数为0的情况:
beta_hats = function(j) {
  # 转换输入为向量
  j_vec = as.vector(j)
  ar_fit = ar(j_vec, aic = TRUE)
  step1 = ar_fit$asy.var.coef
  step2 = ar_fit$ar
  
  # 处理滞后阶数为0的情况,可根据研究需求调整默认值
  if (is.null(step2)) {
    return(0)
  }
  
  step3 = chol(step1)
  step4 = t(step3)
  step5 = solve(step4)
  step6 = step5 %*% step2
  step7 = abs(step6)
  step8 = sum(step7)
  return(step8)
}
  1. 调用rollapplyr时指定by.column = TRUE,确保窗口传递列向量:
y = repro
t = 250
library(zoo)
z = rollapplyr(y, t, beta_hats, by.column = TRUE)

修改后代码即可正常运行,生成滚动窗口的时变beta系数测度结果。


内容的提问来源于stack exchange,提问作者Stakerauo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:06:41