R语言中将时间序列列表lst1转换为适配dcc.garch的dataframe求助
R 时间序列列表转目标数据框方案
错误原因说明
你原有代码无法得到符合要求的数据框,核心问题有两点:
- 使用
byrow = TRUE拼接矩阵后,行对应100个序列、列对应10个年份,和你需要的「行对应年份、列对应单条序列」的结构完全相反 - 没有单独提取时间维度生成年份列
方案1:基础R实现(无需额外安装包)
# 提取所有序列共用的年份维度 year <- as.numeric(time(lst1[[1]])) # 按列拼接所有ts对象的数值,每列对应一条序列 ts_matrix <- do.call(cbind, lst1) # 生成目标数据框并修改列名 df <- data.frame(year = year, ts_matrix) colnames(df)[-1] <- paste0("ts", 1:length(lst1))
执行后得到的df第一列为年份,后续ts1到ts100列对应每条时间序列当年的取值,完全符合DCC-GARCH的拟合数据要求。
方案2:tidyverse 风格实现
library(purrr) library(dplyr) df <- lst1 %>% # 批量将所有ts对象转为数据框列,自动命名为ts1到ts100 map_dfc(~setNames(data.frame(as.numeric(.x)), paste0("ts", match(.x, lst1)))) %>% # 在最左侧插入年份列 mutate(year = as.numeric(time(lst1[[1]])), .before = 1)
额外注意事项
你当前生成
lst1的逻辑存在问题:每个ts对象的10个观测值完全相同,后续拟合DCC-GARCH时会因为序列方差为0报错。如果是测试代码用途,可修改序列生成逻辑:set.seed(1023172) # 生成100条长度为10的独立随机序列 t_mat <- matrix(rnorm(100*10, mean = 20, sd = 7), nrow = 10, ncol = 100) lst1 <- lapply(1:ncol(t_mat), function(i) ts(t_mat[,i], start = 2000, end = 2009))
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

