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

悉尼房价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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:30:58