在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会导致后续计算报错。可通过以下两步修改:
- 修改
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) }
- 调用
rollapplyr时指定by.column = TRUE,确保窗口传递列向量:
y = repro t = 250 library(zoo) z = rollapplyr(y, t, beta_hats, by.column = TRUE)
修改后代码即可正常运行,生成滚动窗口的时变beta系数测度结果。
内容的提问来源于stack exchange,提问作者Stakerauo
相关产品推荐
相关产品推荐

