时间序列自举法运行报错:unused argument (original)问题求解
解决R语言自举周期图时的报错问题及时间序列适配方案
报错原因
boot包要求统计函数必须接受两个参数:第一个是原始数据集,第二个是抽样的索引向量。你定义的periodogram_fun只有一个参数,无法接收boot函数自动传递的索引参数,因此触发unused argument (original)错误。
修复步骤及时间序列适配方案
由于你的数据是带季节性的时间序列,直接用普通非参数自举会破坏时序的自相关性和季节性结构,推荐使用boot包的tsboot函数(专门针对时间序列的自举工具),以下是完整流程:
1. 加载依赖包
library(boot) library(TSA)
2. 修正统计函数
针对时间序列自举,函数只需接收数据参数即可(tsboot会自动处理抽样逻辑):
periodogram_ts_fun <- function(data) { # 返回周期图的谱密度值 TSA::periodogram(data)$spec }
3. 执行季节性块自举
使用type = "seasonal"指定季节性块自举,block.length设为你的季节周期长度(365天,对应年度季节性):
# 执行1000次自举 boot_result <- tsboot(tsdata, periodogram_ts_fun, R = 1000, type = "seasonal", block.length = 365)
4. 计算p值
对每个频率的谱密度,p值为自举样本中谱密度大于原序列谱密度的比例:
# 获取原序列的周期图谱密度 original_spec <- TSA::periodogram(tsdata)$spec # 提取自举得到的所有谱密度结果(每行对应一次自举) boot_spec_matrix <- boot_result$t # 逐频率计算p值 p_values <- apply(boot_spec_matrix, 2, function(boot_vals) { mean(boot_vals > original_spec) })
关键说明
- 普通
boot函数适用于独立同分布数据,时间序列存在自相关/季节性,必须用块自举或季节性块自举才能保证估计的有效性。 - 如果你的数据是日内/周度季节性(比如日数据的7天周期),只需调整
block.length为对应周期长度即可。
内容的提问来源于stack exchange,提问作者Jefferson Santos
相关产品推荐
相关产品推荐

