悉尼房价ARIMA预测可视化报错:filter无法处理forecast类对象
悉尼房价预测模型绘图报错解决
问题场景
正在构建悉尼房价预测模型(仅关注Date与sellPrice列),运行预测绘图代码时触发报错,无法生成未来5年房价预测折线图。
报错代码
Data_fit %>% forecast(h=5) %>% filter(.model=='search') %>% autoplot(data3group_ts)
注:data3group_ts为时间序列数据框
错误信息
Error in UseMethod("filter") : no applicable method for 'filter' applied to an object of class "forecast" In addition: Warning message: In mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA
完整脚本及中间输出
library(fpp3) # 加载数据 data <- read.csv("SydneyHousePrices.csv") # 检查空值 is.null(data) # 选择指定列 data2 <- data %>% select(Date, sellPrice) # 提取时序数据列 data2ts <- data2[,c('Date','sellPrice')] sum(is.na(data2ts)) # 转换Date列为日期格式 data2ts$Date <- as.Date(data2ts$Date) class(data2ts$Date) # 计算每日房价中位数 data3 <- data2ts %>% group_by(Date) %>% summarise(medPrice = median(sellPrice, na.rm = FALSE)) data3 # 生成年份列 data3$Year <- as.Date(cut(data3$Date, breaks = 'year')) # 按年份分组汇总 data3group <- data3 %>% group_by(Year) %>% summarise(sum(medPrice)) %>% select(Year, "medPrice" = "sum(medPrice)") # 绘制时序图 data3group %>% ggplot(aes(x = Year, y= medPrice)) + geom_line(color = "blue", size = 1) + scale_y_continuous(labels = comma)+ scale_x_date(date_labels = "%Y", breaks = "1 year")+ theme(axis.text.x = element_text(size = 10, angle = 90))+ labs(x= "Year", y= "Median House Prices")+ geom_point(color="blue", size = 3) # 转换为tsibble格式 data3group_ts <- data3group %>% mutate(Year = year(as.character(Year))) %>% as_tsibble(index = Year) # 绘制tsibble时序图 data3group_ts %>% autoplot(medPrice) + labs(title = "X", y= "Y") # 绘制时序图、ACF和PACF图 data3group_ts %>% gg_tsdisplay(difference(medPrice), plot_type = 'partial') # 使用auto.arima筛选模型(指定无均值无漂移) auto.arima(auto.arima(data3group_ts, allowmean=FALSE, allowdrift=FALSE, trace=TRUE), allowmean=FALSE, allowdrift=FALSE, trace=TRUE) ######### 模型筛选输出; ARIMA(2,1,2) : 744.7771 ARIMA(0,1,0) : 737.1418 ARIMA(1,1,0) : 736.0715 ARIMA(0,1,1) : 735.3772 ARIMA(1,1,1) : 738.17 ARIMA(0,1,2) : 738.1905 ARIMA(1,1,2) : 741.2703 Best model: ARIMA(0,1,1) ########## # 拟合多个ARIMA模型 Data_fit <- data3group_ts %>% model(arima011 = ARIMA(medPrice ~ pdq (0,1,1)), stepwise = ARIMA(medPrice), search = ARIMA (medPrice, stepwise = FALSE)) # 查看模型统计指标 glance(Data_fit) %>% arrange(AICc) %>% select(.model:BIC) ############### 模型指标输出; # A tibble: 3 × 6 .model sigma2 log_lik AIC AICc BIC <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 arima011 2.97e15 -365. 735. 735. 737. 2 stepwise 2.97e15 -365. 735. 735. 737. 3 search 2.97e15 -365. 735. 735. 737. ################## # 绘制模型残差图 Data_fit %>% select(search) %>% gg_tsresiduals() # 残差白噪声检验 augment(Data_fit) %>% filter(.model=='search') %>% features(.innov, ljung_box, lag = 10, dof = 3) ############# 残差检验输出; # A tibble: 1 × 3 .model lb_stat lb_pvalue <chr> <dbl> <dbl> 1 search 3.73 0.811 ###################### # 预测绘图(报错代码) Data_fit %>% forecast(h=5) %>% filter(.model=='search') %>% autoplot(data3group_ts) # 返回上述错误信息
问题原因与解决方法
报错核心是forecast()返回的对象属于forecast类,无法直接使用dplyr::filter()处理。在fpp3的工作流中,需遵循其专属数据对象的处理逻辑。
修正后的代码方案
方案1:先选择目标模型再生成预测(推荐)
Data_fit %>% select(search) %>% # 先筛选出目标模型 forecast(h=5) %>% autoplot(data3group_ts)
方案2:转换格式后再筛选模型
若需在预测后筛选模型,需先将预测对象转换为tibble,处理后再转回fable格式:
Data_fit %>% forecast(h=5) %>% as_tibble() %>% # 转换为标准数据框 filter(.model=='search') %>% as_fable(index = Year, response = medPrice) %>% # 转回fable格式以支持绘图 autoplot(data3group_ts)
额外说明
fpp3包基于tsibble构建,模型、预测对象都有专属处理方法,建议遵循流程:数据转tsibble→拟合模型→选择模型→生成预测→绘图。- 你的残差检验结果
lb_pvalue=0.811说明模型残差为白噪声,search模型拟合效果合格,修正代码后即可正常生成预测折线图。
内容的提问来源于stack exchange,提问作者Ezgi
相关产品推荐
相关产品推荐

