在R中将失业率数据框转换为时间序列的问题求助
你遇到的问题很典型——直接用as.ts(unemployment)处理宽格式的年度+月度数据,会把每一年当成一个单独的时间点(频率=1),而每个月份变成这个时间点下的变量,自然画不出连续的月度时间序列图。下面是两种可行的解决方法,帮你把数据转换成正确的月度时间序列:
方法一:用tidyverse工具链(更直观易读)
这种方法适合习惯用dplyr/tidyr处理数据的用户,步骤清晰:
把宽格式转成长格式
先加载tidyverse包,然后将年份以外的12个月份列合并成两列(月份名称和对应失业率):library(tidyverse) # 转换为长格式 unemp_long <- unemployment %>% pivot_longer(cols = -Year, # 保留Year列,其他列转成键值对 names_to = "Month", # 月份列的列名存到Month列 values_to = "Unemployment") # 失业率数值存到Unemployment列生成连续的时间标识
用lubridate包把年份和月份组合成日期,方便后续验证时间顺序:library(lubridate) unemp_long <- unemp_long %>% mutate( # 把月份缩写(Jan/Feb...)转成数字1-12 Month_num = match(Month, month.abb), # 生成每个月的第一天作为日期 Date = ymd(paste(Year, Month_num, "01", sep = "-")) )创建月度时间序列对象
提取失业率数值,用ts()指定起始年份和月度频率(frequency=12):unemp_ts <- ts(unemp_long$Unemployment, start = c(1980, 1), # 起始点:1980年1月 frequency = 12) # 月度数据,频率为12绘制时间序列图
直接调用plot()就能得到连续的月度趋势图:plot(unemp_ts, main = "1980-2017 美国月度失业率", ylab = "失业率(%)", xlab = "年份")
方法二:Base R 原生方法(无需额外包)
如果不想加载第三方包,可以用base R的矩阵操作来处理:
提取月度数据向量
先去掉年份列,把剩下的月度数据转成矩阵,再转置后变成按时间顺序排列的向量(1980年1月→1980年2月→...→2017年12月):# 提取月度数据矩阵(去掉第一列年份) unemp_matrix <- as.matrix(unemployment[, -1]) # 转置矩阵后转成向量,保证时间顺序正确 unemp_vector <- as.vector(t(unemp_matrix))创建时间序列对象
同样用ts()指定起始点和频率:unemp_ts <- ts(unemp_vector, start = c(1980, 1), frequency = 12)绘图验证
plot(unemp_ts, main = "1980-2017 美国月度失业率", ylab = "失业率(%)")
为什么原来的方法不行?
当你直接对宽格式数据框用as.ts()时,R会把每一行(每一年)视为一个时间点,频率设为1,而12个月份列会被当成12个独立的时间序列变量。所以你看到的输出是Start = 1 End = 38 Frequency = 1,对应1980-2017的38个年份,每个年份有12个变量,这显然不是你想要的单变量月度时间序列。
现在你可以试试上面的方法,应该能得到符合预期的时间序列图表了。
内容的提问来源于stack exchange,提问作者player play

