如何使用不均匀和缺失数据创建按子集分组的滚动预测?

如何解决如何使用不均匀和缺失数据创建按子集分组的滚动预测?

我有一个数据集(160 万行,感兴趣的 4 列),由定向国家/地区 dyad-year 组织。每个非交换二元组(year1-stateA-stateB 并不总是等于 year1-stateB-stateA)都有一个输出值“var1”。

简化数据示例

library(forecast)
library(dplyr)

df=data.frame(year=c(1994,1995,1996,1997,1998,1964,1965,1967,1968,1969,1988,1987,1989),stateA=c(1,1,138,20,20),stateB=c(2,2,87,55,55),var1=c(0.101,0.132,0.136,0.148,-0.287,-0.112,0.088,0.101,0.121,0.387,NA,0.377,0.388)
)

> df
   year stateA stateB   var1
1  1994      1      2  0.101
2  1995      1      2  0.132
3  1996      1      2  0.136
4  1997      1      2  0.136
5  1998      1      2  0.148
6  1964    138     87 -0.287
7  1965    138     87 -0.112
8  1967    138     87  0.088
9  1968    138     87  0.101
10 1969    138     87  0.121
11 1988     20     55  0.387
12 1987     20     55     NA
13 1988     20     55  0.377
14 1989     20     55  0.388

我想要做的是将每组国家/地区二元组分解为时间序列,并使用 holt 模型使用过去 5 年的数据创建下一年的预测预测。

预期结果:我希望添加一个新变量,其中包含基于前几年的 yearX+1 的预测值到 yearX 的行。

并发症:并非每个国家/地区对每年都存在,并且在某些年份,尽管数据集中存在国家/地区对联,但没有数据。

到目前为止我所做的:

首先,请原谅我最近才开始在 R 中使用时间序列。

首先,我使用 dplr 按年份组织数据(因此它将按正确的时间序列顺序排列)然后按 stateA、stateB 分组

 rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA,stateB) %>% [...]

我之前所做的是 5 年滚动平均值,它不符合我的分析需求,所以看起来像这样:

rolldata <- df %>%
  dplyr::arrange(year) %>% 
  dplyr::group_by(stateA,stateB) %>% 
  dplyr::mutate(
    point_5a = zoo::rollmean(var1,k = 5,fill = NA,align='right'))

这里的问题是我需要为每一行创建一个时间序列对象以传递给 holt() 以输出预测值 (fvar)。

dat_ts <- ts(df$var1,start = c(STARTYEAR,1),end = c(ROWYEAR,frequency = 1)
holt_model <- holt(dat_ts,h = 5)
fvar[i] <-holt_model$x[1]

我希望我已经以易于理解的方式阐述了这个问题。非常感谢您的帮助,我随时准备澄清和回答任何可能对您有帮助的问题。

附言效率不是必须的,只有结果。

编辑:我认为我之前没有说清楚,但我的主要目标是为每一行而不是整个子集生成一个预测对象。在我的国家 1 和国家 2 的示例数据中:将根据 1994 年的时间序列对 1994 年进行预测;将在 1994-1995 年的基础上对 1995 年作出预测;基于 1994-1996 年的 1996 年预测。然后对 (138,87) 也是如此,每一行都有自己的预测。

解决方法

paste 将列一起用于使用 by 进行拆分/应用。 holt 警告因缺失而采取的行动。你可以插入它们,我不确定,但你想用它们做什么。

rolldata <- df[order(df$year),]

library(forecast)
res <- by(rolldata,Reduce(paste,rolldata[c("stateA","stateB")]),function(x) {
  STARTYEAR <- x$year[1]; ROWYEAR <- x$year[nrow(x)]
  x0 <- x$var1
  x_ts <- ts(x0,start = c(STARTYEAR,1),end = c(ROWYEAR,frequency = 1)
  holt_mod <- holt(x_ts,h=5)
  holt_mod$x[1]
})
# Warning message:
#   In ets(x,"AAN",alpha = alpha,beta = beta,phi = phi,damped = damped,:
#            Missing values encountered. Using longest contiguous portion of time series

as.list(res)
# $`1 2`
# [1] 0.101
# 
# $`138 87`
# [1] -0.287
# 
# $`20 55`
# [1] 0.387
,

您可以在数据帧本身中存储类 forecast 的对象并从中提取相关值。

library(dplyr)
library(purrr)
library(forecast)

df %>%
  arrange(year) %>% 
  group_by(stateA,stateB) %>%
  summarise(ts = list(ts(var1,start = c(min(year),end = c(max(year),frequency = 1)),holt = map(ts,holt,h = 5),all_value = map(holt,~.x$x),first_value = map_dbl(all_value,first)) %>%
    ungroup

#  stateA stateB ts       holt       all_value first_value
#   <dbl>  <dbl> <list>   <list>     <list>          <dbl>
#1      1      2 <ts [5]> <forecast> <ts [5]>        0.101
#2     20     55 <ts [3]> <forecast> <ts [2]>        0.387
#3    138     87 <ts [6]> <forecast> <ts [6]>       -0.287

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-