使用ARIMA预测泰铢兑美元汇率遇报错:'ts'对象需至少一个观测值
问题解决:ARIMA预测泰铢兑美元汇率时触发
'ts' object must have one or more observations错误 错误根源
- 时间序列参数格式错误:使用
ts()创建序列时,frequency=12代表月度频率,但你传入的start=c(2010,01,01)和end=c(2021,12,31)是年-月-日格式,R无法正确识别月度时间戳,导致生成的a.dfts序列存在观测数异常。 - 差分后序列无效:原始序列格式错误导致
diff(log(a.dfts))生成的loga序列观测数不足(甚至为空),后续拟合ARIMA模型后,预测时因无有效观测触发报错。
修复步骤
1. 修正时间序列创建逻辑
将ts()的start和end改为c(年, 月)格式,同时先清理原始数据中的缺失值:
library(priceR) library(forecast) # 导入数据 a <- historical_exchange_rates("THB", to = "USD", start_date = "2010-01-01", end_date = "2021-12-31") # 清理缺失值 a_clean <- a[!is.na(a$one_THB_equivalent_to_x_USD), ] # 创建月度时间序列(注意start/end为年+月) a.dfts <- ts(a_clean$one_THB_equivalent_to_x_USD, frequency=12, start=c(2010, 1), end=c(2021, 12))
2. 检查差分后序列有效性
执行差分操作后,务必确认序列长度大于1:
loga <- diff(log(a.dfts)) # 查看差分后序列长度,需大于1 length(loga)
如果长度不足,说明原始日度数据需先聚合为月度数据(因为frequency=12对应月度,直接用日度数据会导致时间戳混乱):
library(dplyr) # 转换日期并提取年月 a$date <- as.Date(a$date) a$year_month <- format(a$date, "%Y-%m") # 聚合为月度平均汇率 a_monthly <- a %>% group_by(year_month) %>% summarise(avg_rate = mean(one_THB_equivalent_to_x_USD, na.rm=TRUE)) # 重新创建月度时间序列 a.dfts <- ts(a_monthly$avg_rate, frequency=12, start=c(2010, 1), end=c(2021, 12))
3. 重新拟合模型并预测
确保loga有足够观测值后,重新执行模型拟合与预测:
library(TSA) library(forecast) loga <- diff(log(a.dfts)) finala.arma <- arima(loga, order = c(0,0,2)) forca.ARIMA <- forecast(finala.arma, h=24, level=c(80,95)) # 绘制预测结果 plot(forca.ARIMA)
内容的提问来源于stack exchange,提问作者Napat Viseshsin
相关产品推荐
相关产品推荐

