tsibble转换后无法使用autoplot?与ts对象的差异原因解析
问题描述
我有一个名为BEDATA_grouped的数据集,尝试转换为时间序列后用autoplot可视化,出现两种不同结果:
- 转换为tsibble对象时触发报错:
BEDATA_GROUPED %>% mutate(occurrence_yrmn = yearmonth(occurrence_yrmn)) %>% as_tsibble(index = occurrence_yrmn)
报错信息:
Error in `ggplot2::autoplot()`: ! Objects of type tbl_df/tbl/data.frame not supported by autoplot. Run `rlang::last_error()` to see where the error occurred.
- 转换为ts对象时,
autoplot可正常运行:
BEDATA_GROUPEDts <- ts(BEDATA_GROUPED[,2], frequency = 12, start = c(2014, 1))
第一种转换方式参考自fpp3官方文档,想了解两种方式产生差异的原因。
附数据集结构:
structure(list(occurrence_yrmn = c("2014-January", "2014-February", "2014-March", "2014-April", "2014-May", "2014-June", "2014-July", "2014-August", "2014-September", "2014-October", "2014-November", "2014-December", "2015-January", "2015-February", "2015-March", "2015-April", "2015-May", "2015-June", "2015-July", "2015-August", "2015-September", "2015-October", "2015-November", "2015-December", "2016-January", "2016-February", "2016-March", "2016-April", "2016-May", "2016-June", "2016-July", "2016-August", "2016-September", "2016-October", "2016-November", "2016-December", "2017-January", "2017-February", "2017-March", "2017-April", "2017-May", "2017-June", "2017-July", "2017-August", "2017-September", "2017-October", "2017-November", "2017-December", "2018-January", "2018-February", "2018-March", "2018-April", "2018-May", "2018-June", "2018-July", "2018-August", "2018-September", "2018-October", "2018-November", "2018-December", "2019-January", "2019-February", "2019-March", "2019-April", "2019-May", "2019-June", "2019-July", "2019-August", "2019-September", "2019-October", "2019-November", "2019-December", "2020-January", "2020-February", "2020-March", "2020-April", "2020-May", "2020-June", "2020-July", "2020-August", "2020-September", "2020-October", "2020-November", "2020-December", "2021-January", "2021-February", "2021-March", "2021-April", "2021-May", "2021-June", "2021-July", "2021-August", "2021-September", "2021-October", "2021-November", "2021-December"), MCI = c(586, 482, 567, 626, 625, 610, 576, 634, 636, 663, 657, 556, 513, 415, 510, 542, 549, 618, 623, 666, 641, 632, 593, 617, 541, 523, 504, 536, 498, 552, 522, 519, 496, 541, 602, 570, 571, 492, 560, 525, 507, 523, 593, 623, 578, 657, 683, 588, 664, 582, 619, 512, 630, 644, 563, 654, 635, 732, 639, 748, 719, 567, 607, 746, 739, 686, 805, 762, 696, 777, 755, 675, 704, 617, 732, 609, 464, 487, 565, 609, 513, 533, 505, 578, 526, 418, 428, 421, 502, 452, 509, 492, 478, 469, 457, 457)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -96L))
差异原因分析
对象类型与autoplot适配性差异
ts是R基础包的传统时间序列类型,autoplot(由forecast包提供扩展支持)原生适配这类对象,能自动识别时间序列结构并生成可视化。- 你用
as_tsibble转换后,报错显示对象仍是tbl_df/tbl/data.frame,说明转换未成功。核心问题是yearmonth函数无法直接解析"2014-January"这种字符串格式,导致时间列未被正确转为yearmonth类型,最终as_tsibble无法生成有效的tsibble对象,返回的还是普通数据框,而ggplot2::autoplot不支持直接可视化普通数据框。
转换逻辑本质不同
ts()函数直接提取数值列,通过frequency和start参数强制定义时间序列的频率和起始点,不依赖原数据的时间列格式,因此能快速生成合规的时间序列对象。as_tsibble需要格式正确的时间索引列,若时间列解析失败,整个转换就会失效,无法生成tsibble对象。
解决方法
要让tsibble转换后正常使用autoplot,需先正确解析时间列:
# 先将字符串格式的时间转为yearmonth类型 library(tidyverse) library(tsibble) library(fpp3) BEDATA_GROUPED <- BEDATA_GROUPED %>% mutate(occurrence_yrmn = yearmonth(parse_date_time(occurrence_yrmn, "Y-m"))) %>% as_tsibble(index = occurrence_yrmn) # 此时可正常用autoplot可视化 autoplot(BEDATA_GROUPED, MCI)
内容的提问来源于stack exchange,提问作者AtFirstYouTry
相关产品推荐
相关产品推荐

