首页 / 资讯中心 / 文章详情

R语言ARIMA时间序列预测实战:从数据清洗到业务交付

R语言ARIMA时间序列预测实战:从数据清洗到业务交付 ★ FEATURED ARTICLE
1. 这不是“调个包就出图”的ARIMA——为什么你用R跑出来的预测总在抖“R语言 数据处理 ARIMA预测”——光看这八个字我猜你大概率正卡在三个地方数据读进来全是NA、auto.arima()报错说“non-stationary”或者模型跑出来了但画出来的预测线像心电图一样上下乱跳。这不是你手生是ARIMA这个模型本身就在和你较劲它不接受脏数据不原谅趋势没剔干净更不惯着你直接把原始销量序列扔进去就点运行。我在某电商公司做销售预测支持时带过三轮实习生每一轮都得从“为什么diff()要差两次而不是一次”讲起也帮某高校实验室重做过一套气象温度预测流程发现他们沿用了五年前的脚本连seasonal TRUE都没开结果把年周期性硬生生当成了随机噪声。R语言在这里不是万能胶而是手术刀——你得知道切哪、切多深、切完怎么缝合。它真正解决的是时间序列中趋势、季节性和随机扰动三股力量如何被拆解、量化、再重组为可推演的未来路径。适合谁刚学完《统计学基础》想落地的同学、业务部门需要自主做短期销量/流量预判的运营人、以及被Excel趋势线骗过三次以上、终于决定认真搞懂“为什么预测值后面总跟着一串越来越宽的阴影带”的务实派。接下来所有内容不讲公式推导只讲你在R控制台里敲下每一行命令时背后到底发生了什么。2. 核心设计逻辑为什么必须分五步走少一步模型就“瘸腿”2.1 五步闭环从原始数据到可信预测缺一不可ARIMA建模在R中绝不是library(forecast); auto.arima(x)两行代码的事。真实项目里我坚持执行一个铁律数据清洗 → 平稳性诊断 → 差分处理 → 模型识别与拟合 → 残差检验与预测。这五步不是线性流水线而是环环相扣的验证闭环。比如第二步“平稳性诊断”很多人只跑一个ADF检验p值0.05就以为万事大吉但实际中我见过太多案例ADF通过了KPSS却失败或者ADF和KPSS都通过了画出ACF图却发现滞后12阶仍有显著相关——这说明季节性没被识别出来。这时候如果跳过第三步“差分处理”直接建模auto.arima()可能给你选个(1,0,1)模型但真实数据需要的是(1,1,1)(0,1,1)[12]这种带季节性差分的结构。五步闭环的本质是用多重证据链交叉验证数据状态。R的forecast包之所以强大正在于它把每一步的诊断工具都封装成可视觉化的函数比如ggtsdisplay()一键输出时序图、ACF/PACF图、残差直方图让你一眼看出问题在哪。而新手常犯的致命错误就是把auto.arima()当成黑箱以为参数自动选好就等于模型可靠——其实它只是在给定搜索空间内找AIC最小的组合但AIC最小不等于业务上最合理。比如某次我们预测某款手机月销量auto.arima()推荐(2,1,2)但业务方明确知道促销活动带来的是脉冲式影响模型必须能捕捉这种非平稳冲击最后我们手动指定(1,1,1)并加入外生变量xreg预测误差反而下降37%。2.2 为什么R是首选不是因为语法简单而是生态不可替代有人问“Python的statsmodels也能做ARIMA为什么非要用R”答案藏在三个不可替代的生态层诊断可视化深度、领域专用包成熟度、业务解释友好性。先说诊断可视化——R的tsdisplay()函数输出的四宫格图原始序列ACFPACF残差比Python里手动拼四个子图快十倍且默认添加显著性虚线、自动标注滞后阶数。更关键的是fable包里的augment()函数能把模型拟合值、残差、置信区间一次性塞回原始tibble后续用ggplot2画图时一行geom_ribbon(aes(ymin .conf_lo, ymax .conf_hi))就能画出专业级置信带而Python里你得手动计算分位数再merge。再说领域专用包feasts包专攻时间序列特征工程sweep包让模型结果和原始数据无缝联动modeltime包则把ARIMA、Prophet、LSTM全统一到同一套fit()/predict()接口下方便AB测试。最后是业务解释友好性——R Markdown能直接把summary(fit)的表格、checkresiduals(fit)的诊断图、autoplot(forecast(fit, h12))的预测图全部嵌入一份动态报告业务方点开HTML就能看到“模型为什么这么选”“误差有多大”“未来12个月预测值及波动范围”不需要他们装R环境或看代码。而Python的Jupyter Notebook导出PDF时图表常错位导出HTML又依赖前端库。所以R在这里不是“更简单”而是“更省沟通成本”。2.3 模型选择的底层逻辑ARIMA不是万能但它是理解时间序列的“母语”ARIMAAutoRegressive Integrated Moving Average这个名字本身就揭示了它的基因自回归AR抓趋势惯性移动平均MA抓随机冲击差分I让数据站稳脚跟。很多初学者以为ARIMA是“高级预测法”其实它是最基础的时间序列建模范式——就像学游泳先练漂浮ARIMA教你的不是怎么预测准而是怎么读懂数据在时间轴上的呼吸节奏。比如AR项系数φ₁0.8意味着上一期的值对本期有80%的“拖拽力”数据变化缓慢MA项θ₁-0.3说明上一期的预测误差会以30%的反向力度修正本期值。而I阶数d本质是在回答“数据需要被‘掰直’几次才能露出它本来的规律”d0是平稳序列d1是带线性趋势d2是带二次趋势比如用户增长早期的爆发曲线。我在某SaaS公司做DAU预测时发现原始日活序列d1后仍不平稳ACF衰减极慢于是尝试d2结果auto.arima()立刻选出(0,2,1)模型残差白噪声检验通过率从62%升至94%。这说明ARIMA的价值首先在于它强迫你直面数据的内在结构。当你能看懂arima()输出里“sigma^2 estimated as...”代表残差方差“log likelihood”反映拟合优度你就拿到了解读任何时间序列模型的钥匙。后续用LSTM或Prophet不过是换了一种“翻译”方式但底层要解决的问题——趋势、季节、噪声的分离与建模——从未改变。3. 核心细节拆解从读入数据到画出预测图每一步都在解决什么问题3.1 数据清洗为什么“删NA”是最危险的操作时间序列数据清洗第一反应往往是na.omit()。但这是个陷阱。比如某电商平台的小时级订单量数据凌晨2-5点因系统维护产生连续12个NAna.omit()直接砍掉这12小时导致时间戳断裂——ts()函数会报错“not regular”xts对象会丢失时间索引。正确做法是用业务逻辑填充而非机械删除。我处理这类数据的标准流程先用zoo::na.locf()前向填充假设维护结束后的首单量承接了维护前的趋势再用imputeTS::na_seadec()做季节性分解填充针对有明显日周期的场景。更关键的是识别NA的成因是传感器故障需标记为异常、网络延迟可用前后均值插补、还是业务停摆应保留为0并加注释列在R中我习惯新建一列data$na_flag - is.na(data$value)再用dplyr::case_when()按flag分组处理。例如data_clean - data %% mutate( na_flag is.na(value), value_filled case_when( na_flag hour(time) %in% 2:5 ~ na.locf(value, na.rm FALSE), # 维护时段前向填充 na_flag !hour(time) %in% 2:5 ~ na.interp(value), # 其他时段线性插补 TRUE ~ value ) ) %% filter(!is.na(value_filled)) # 此时才删除真正无法修复的NA这段代码背后是三个经验① 前向填充只用于已知业务中断场景避免用未来值污染过去②na.interp()比approx()更鲁棒能处理多个连续NA③ 最后filter()确保无残留NA因为arima()遇到NA会静默失败只返回警告。实测下来某次处理某物流公司的运输时效数据用此流程将预测MAPE从18.7%降至12.3%关键就在于凌晨时段的NA被合理填充没让模型误判为“运输能力突然归零”。3.2 平稳性诊断ADF/KPSS不是二选一而是双盲评审平稳性检验不是“考及格就行”而是像双盲临床试验——ADF和KPSS互为对照组。ADF原假设是“存在单位根非平稳”p0.05才拒绝原假设KPSS原假设是“平稳”p0.05反而说明非平稳。两者结论冲突怎么办我的判断树如下ADF结果KPSS结果解读操作p0.05平稳p0.05非平稳存在趋势性非平稳先diff()一次再重检p0.05非平稳p0.05平稳存在波动性非平稳异方差用BoxCox()变换方差p0.05 p0.05—强烈非平稳尝试diff(x, differences 2)或log(x)在R中我写了一个诊断函数check_stationarity()自动调用urca::ur.df()和tseries::kpss.test()并用ggplot2画出对比图。重点看KPSS的“tau”统计量——如果它远大于临界值如10%临界值0.347说明即使ADF通过数据也可能在长期趋势上不稳定。某次分析某城市共享单车日租借量ADF p0.012看似平稳但KPSS tau0.82 0.347ACF图显示滞后365阶仍有相关最终确认是年季节性未被处理改用seas()函数做X-13季节性调整后KPSS p0.12才进入建模阶段。这里的关键洞察是ADF擅长检测随机游走KPSS擅长检测趋势漂移两者结合才能覆盖时间序列非平稳的所有常见形态。3.3 差分处理差分不是“越多越好”而是“恰到好处”差分阶数d的选择常被简化为“直到ADF通过”。但过度差分代价巨大d2会让模型对噪声极度敏感预测区间爆炸式变宽。我的经验法则是d取最小值且必须通过KPSS检验。具体操作分三步① 对原始序列x做diff(x)存为x_d1② 对x_d1跑KPSS若p0.1则d1③ 若p≤0.1再做diff(x_d1)得x_d2跑KPSSp0.1则d2。注意diff()默认differences1但季节性差分要用diff(x, lag frequency(x))比如月度数据lag12。在R中我习惯用tsibble::index_by()配合dplyr::mutate()批量处理多序列data_ts - data %% as_tsibble(index date) %% mutate( x_d1 difference(value), x_d2 difference(x_d1) ) %% pivot_longer(cols starts_with(x_d), names_to diff_type, values_to value_diff)这样能并排比较d0,1,2的效果。某次处理某银行信用卡月均消费额原始序列KPSS p0.002diff()后p0.08diff(diff())后p0.21——看似d2更好但画出x_d2的ACF发现滞后1阶相关性高达0.92说明过度差分引入了虚假自相关最终选定d1并用auto.arima()的stepwiseFALSE, approximationFALSE参数强制全搜索找到最优(1,1,1)模型。这个案例教会我差分的目标不是让统计检验“好看”而是让残差尽可能接近白噪声。3.4 模型识别与拟合auto.arima()的隐藏开关与人工干预时机forecast::auto.arima()的默认参数stationaryFALSE, seasonalTRUE, icaic适合大多数场景但有三个关键开关必须根据业务调整①max.p/max.q/max.P/max.Q限制搜索空间避免过拟合②lambda指定Box-Cox变换当数据含零或负值时必设③xreg加入外生变量比如促销天数、节假日标志。我处理某快消品销量预测时发现auto.arima()总选高阶模型p3,q2但业务方强调“促销效应只持续3天”于是手动设max.p1, max.q1模型降为(1,1,1)AIC仅上升0.7但预测稳定性提升40%。另一个关键是lambda当销量数据含大量零值如新品上市初期auto.arima()默认lambdaNULL会报错此时必须用BoxCox.lambda(x, methodguerrero)估算最优λ再传入auto.arima(x, lambda...)。至于xreg我习惯用model.matrix(~ factor(month) is_holiday, data)生成哑变量矩阵比手动cbind()更防错。实操中auto.arima()的traceTRUE参数能打印每步搜索的AIC帮你理解它为何选这个参数——比如看到“(0,1,1) AIC1203.2”后突然跳到“(1,1,1) AIC1198.5”就知道AR项带来了实质改进。3.5 残差检验与预测置信区间的宽度暴露了你对不确定性的认知深度ARIMA预测图里那两条渐宽的虚线不是装饰而是模型对你“无知程度”的诚实告白。残差检验的核心是验证residuals(fit)是否满足白噪声三条件① 均值为零mean(resid) ≈ 0② 方差恒定plot(resid)无明显波动趋势③ 无自相关Box.test(resid, typeLjung-Box)p0.05。在R中checkresiduals(fit)一键完成三者并用Q-Q图检验正态性。但业务上更关键的是残差的业务含义比如某次预测某APP日活残差在周末持续为负说明模型系统性低估了休闲流量这时要检查是否漏了weekend_flag外生变量若残差在每月5号突增可能是财务结算日带来的登录高峰需加入day_of_month变量。预测阶段forecast(fit, h12, levelc(80,95))生成多层置信区间h12不是随便定的——它必须匹配业务决策周期。比如供应链补货看季度h1313周市场活动预算看月度h66个月。我坚持用autoplot()而非plot()因为前者自动对齐时间轴且geom_point()可叠加真实值做回测。某次用forecast()预测后发现第3个月预测值与真实值偏差超2σ立刻用accuracy()计算MAE/MSE确认是模型在该时段失效而非偶然误差——这比单纯看RMSE更有行动指导性。4. 实操全流程从CSV文件到交付预测报告手把手复现4.1 环境准备与数据加载用tsibble统一时间序列管理第一步永远是环境初始化。我固定使用以下包组合tidyverse数据处理、tsibble时间序列tibble、feasts特征工程、fable建模、modeltime生产部署。安装命令install.packages(c(tidyverse, tsibble, feasts, fable, modeltime)) library(tidyverse) library(tsibble) library(feasts) library(fable) library(modeltime)数据加载的关键在于用as_tsibble()而非read.csv()直接转ts。比如某销售数据CSV含date字符型和sales数值型两列# 错误示范read.csv()后手动转ts易丢时间属性 # data_raw - read.csv(sales.csv) # ts_data - ts(data_raw$sales, start c(2020,1), frequency 12) # 正确示范as_tsibble()自动解析日期保留完整时间索引 data_raw - read_csv(sales.csv) %% mutate(date ymd(date)) %% # 确保日期格式统一 as_tsibble(index date) %% # 转为tsibbledate成为索引 fill_gaps() # 自动补全缺失日期如周末无数据填NAfill_gaps()是神来之笔——它让时间序列真正“连续”避免arima()因日期断层报错。接着用index_by()按月聚合若原始是日度data_monthly - data_raw %% index_by(year_month ~ yearmonth(.)) %% summarise(sales sum(sales, na.rm TRUE))此时data_monthly是标准月度tsibbleyear_month为索引可直接喂给fable建模。这一步省去了传统ts()函数里手动算start和frequency的麻烦且yearmonth()自动处理闰年、大小月比as.yearmon()更鲁棒。4.2 探索性分析用feasts挖出数据的“时间指纹”加载完数据不做任何建模先跑data_monthly %% features(.value, feat_static())它会输出12个时间序列静态特征seasonal_strength季节性强度、trend_strength趋势强度、spikiness尖峰度、stl_e_aSTL分解残差方差占比等。这些数字是建模的“路标”。比如seasonal_strength0.85说明季节性极强必须开seasonalTRUEtrend_strength0.12说明趋势微弱d0可能就够spikiness0.4提示存在异常值需用tsoutliers::tso()检测。我习惯用ggplot2画热力图data_monthly %% features(.value, feat_static()) %% pivot_longer(-index, names_to feature, values_to value) %% ggplot(aes(x feature, y index, fill value)) geom_tile() scale_fill_viridis_c(option plasma) theme_minimal()这张图能快速定位若seasonal_strength在不同产品间差异巨大说明不能用统一模型需分群建模若stl_e_a 0.6说明噪声主导ARIMA可能不是最佳选择。某次分析某连锁超市20个品类的月销发现生鲜类spikiness0.62而日化类仅0.18最终为生鲜单独建立带异常值检测的ARIMA模型预测误差降低22%。4.3 建模与诊断fable工作流实现“所见即所得”fable包的核心优势是把建模过程变成dplyr式的管道操作。完整代码如下# 分割训练集/测试集留最后12个月做测试 train_data - data_monthly %% filter_index(. ~ -12) test_data - data_monthly %% filter_index(-12 ~ .) # 拟合ARIMA模型自动选参 fit_arima - train_data %% model( arima ARIMA(sales) ) # 查看模型摘要 fit_arima %% glance() # 残差诊断图 fit_arima %% check_residuals() # 预测未来12个月 forecast_arima - fit_arima %% forecast(h 12) # 可视化预测结果含真实值 bind_rows( train_data %% mutate(type train), test_data %% mutate(type test), forecast_arima %% mutate(type forecast) ) %% autoplot(.value, color type) geom_line(data test_data, aes(y sales), color red, size 1) labs(title ARIMA Sales Forecast, y Sales (Units))这段代码的精妙之处在于①filter_index()按时间切分比head()/tail()更精准②model()函数返回的fable对象可直接用glance()看AIC/BIC用tidy()提取系数③forecast()输出仍是tsibble能用bind_rows()无缝合并训练/测试/预测数据autoplot()自动处理时间轴对齐。某次为某教育平台做课程报名量预测用此流程5分钟内完成从数据加载到预测图输出且glance()显示arima模型AIC1023.4比手动指定的(1,1,1)模型AIC1031.2更优证实了自动选参的有效性。4.4 模型评估与优化用yardstick量化预测价值预测不是“画出来就行”必须用业务指标验证。yardstick包提供metrics()函数支持MAE、RMSE、MAPE等12种指标。关键是要在测试集上计算而非训练集# 将预测结果与测试集真实值对齐 eval_data - forecast_arima %% left_join(test_data, by index) %% rename(actual sales) # 计算多指标 eval_data %% metrics( truth actual, estimate .mean ) %% bind_rows( eval_data %% metrics( truth actual, estimate .lo.95 ) %% mutate(.metric paste0(.metric, _lo95)), eval_data %% metrics( truth actual, estimate .hi.95 ) %% mutate(.metric paste0(.metric, _hi95)) )输出表格包含rmse、mae、mape等其中mape平均绝对百分比误差最易被业务方理解。若mape8.2%意味着平均预测偏差8.2%。优化方向很明确若mape在测试集后半段飙升说明模型对新趋势适应慢需缩短训练窗口若rmse远大于mae说明存在极端误差要检查异常值处理。某次某硬件厂商的库存周转率预测mape15.3%排查发现是新产品上市导致分布偏移于是加入product_launch_flag作为xregmape降至9.1%。这证明指标不是终点而是诊断的起点。4.5 报告交付用quarto生成可交互的业务报告最终交付物不是R脚本而是业务方能直接使用的报告。我用quartoR Markdown升级版生成HTML报告核心是嵌入交互式图表--- title: Monthly Sales Forecast Report format: html editor: visual --- {r setup, includeFALSE} library(tidyverse) library(tsibble) library(fable) library(modeltime) knitr::opts_chunk$set(echo FALSE, warning FALSE, message FALSE)Forecast Visualization# 加载数据、建模、预测代码同上 autoplot(forecast_arima) autolayer(test_data, sales, color red) labs(title 12-Month Sales Forecast with 95% Confidence Interval)Model PerformanceMetricValueMAEr round(mae_value, 2)RMSEr round(rmse_value, 2)MAPEr round(mape_value, 2)%提示点击图表可放大、下载PNG鼠标悬停查看具体日期和预测值。quarto的优势在于① 自动生成响应式HTML手机端也能看② 图表默认交互缩放、下载、悬停③ 支持LaTeX公式可插入$ARIMA(p,d,q)$解释模型④ 一键发布到Quarto Gallery或公司内网。某次交付给某零售集团的报告业务总监直接在手机上滑动查看未来6个月预测指着“8月预测值下降12%”问原因我当场打开forecast_arima %% tidy()指出是暑期促销结束效应全程无需打开RStudio——这才是技术服务于业务的终极形态。 ## 5. 常见问题与避坑指南那些文档里不会写的实战血泪 ### 5.1 “Error in is.ts(x) : object is not a time series”——时间索引丢失的隐形杀手 这个错误90%源于as_tsibble()后没用fill_gaps()。比如某次处理某社交APP的小时级活跃数据原始CSV里缺失了凌晨3-4点的数据因服务器维护as_tsibble(index datetime)后datetime列是POSIXct但fill_gaps()没执行导致model()函数内部调用is.ts()时发现时间戳不连续直接报错。解决方案只有三步① fill_gaps()补全所有时间点② 用replace_na()填充缺失值replace_na(list(value 0))③ 再filter(!is.na(value))删除真正无法填充的异常点。记住**tsibble的“时间连续性”是建模前提不是可选项**。 ### 5.2 “non-stationary time series”——你以为的平稳其实是假象 某次分析某新能源车企的月度充电量ADF检验p0.003KPSS p0.08看似d1即可。但画出diff()后的ACF图发现滞后12阶仍有显著峰ρ₁₂0.41说明年季节性未被消除。错误做法是再diff()一次d2正确做法是用seas()做X-13季节性调整 r library(seasonal) data_adj - data_monthly %% mutate(sales_adj seas(sales, x11 )$series$seasonallyAdjusted)seas()会自动检测季节性并调整比手动diff(x, lag12)更精准。调整后KPSS p0.15ACF所有滞后阶均在置信带内这才进入建模。教训是ADF/KPSS只能告诉你“是否平稳”但不能告诉你“为什么不平稳”——ACF/PACF图才是真正的诊断医生。5.3 预测值全是直线——模型“学废了”的典型症状forecast()输出的.mean列全是同一数值说明模型退化为“用历史均值预测”。根本原因是训练数据过短或方差过小。比如某新上线功能的日留存率只有30天数据且留存率在35%-37%间窄幅波动auto.arima()判定为白噪声过程直接返回均值。解决方案① 扩大数据窗口至少2年月度数据② 用BoxCox()变换扩大方差③ 改用带外生变量的ARIMA(sales ~ promo_days)。某次某游戏公司预测付费率30天数据导致预测直线加入event_flag版本更新日后模型立刻捕获到更新后付费率跃升15%的模式。5.4 置信区间越来越宽——不是模型坏了是你在问它“太远”的问题ARIMA的预测不确定性随步长指数增长这是数学本质不是bug。forecast(fit, h24)的95%置信带必然比h6宽得多。业务上应对策略是① 明确预测目的——若只为季度补货h13足够不必看h36② 用levelc(80)降低置信度收窄区间③ 对长期预测改用组合模型如ARIMAProphetmodeltime包的ensemble()函数可自动加权。某次某建材公司预测年度水泥需求h12时置信带宽±8%h24时达±22%最终采用ensemble(arima ARIMA(demand), prophet PROPHET(demand))h24置信带收窄至±14%且方向性判断更准。5.5 “Warning: missing values encountered”——沉默的警告最危险auto.arima()遇到NA时会静默删除对应观测值并继续运行但glance()里的nobs有效样本数会变小导致AIC计算基准偏移。比如原始100个点含5个NAnobs95但你没注意到误以为模型基于100点训练。解决方案① 建模前用sum(is.na(data$sales))显式检查② 用na.action na.warn强制报错③ 在model()中加refit FALSE避免静默处理。我在某医疗设备公司做设备故障率预测时因忽略此警告用95点训练的模型去预测100点导致回测时前5点无预测值业务方质疑“模型漏预测”实为数据清洗疏漏。注意所有forecast包函数默认na.action na.omit这是最大隐患。务必在model()前加options(na.action na.warn)全局设置或在arima()中显式指定na.action na.fail。6. 实战心得三年踩过的坑浓缩成四条铁律我在某数据分析咨询公司带团队做时间序列项目三年经手过电商、金融、制造、教育四大行业的预测需求总结出四条血泪铁律没有一条来自教科书第一数据质量永远比模型复杂度重要十倍。曾有个客户坚持要用LSTM我坚持先做ARIMA结果发现其销售数据里30%的“促销日”标签填错了日期修正后ARIMA MAPE从21%降到13%LSTM只降到12.8%。模型再高级也救不了错误的业务定义。第二预测不是“猜下一个数”而是“描述未来可能性的分布”。业务方总问“8月销量到底是多少”正确回答是“最可能120万有80%概率在105-135万之间若发生极端天气可能跌破90万”。forecast()输出的.mean、.lo.80、.hi.80、.lo.95、.hi.95每个数字都在讲一个概率故事。我坚持在报告里用geom_ribbon()画出双层置信带并标注“80%概率在此区间”业务方接受度远高于单一数字。第三模型必须能被业务方“反向验证”。每次交付前我会挑3个预测点手动用arima.sim()模拟1000次看真实值落在预测区间的频率是否接近理论值如95%区间应覆盖94-96%的真实点。若覆盖率仅85%说明模型过于自信需调宽置信带或加鲁棒性处理。某次某物流公司预测运单量覆盖率仅78%查出是节假日外生变量未标准化修正后升至94%。第四没有“永远最优”的模型只有“当前场景最合适”的模型。ARIMA在月度、季度数据上稳定但对小时级高频数据prophet的灵活性更优对含大量零值的稀疏数据ZIGP零膨胀高斯过程比ARIMA更准。我的做法是用
阅读完成 · 觉得有帮助?
咨询建站