R语言ts函数月度时间序列统计异常问题求助
问题排查与解决方案
你当前的代码逻辑存在核心错误:ts()函数被直接用于转换每日数据,但frequency=12指定了序列为月度频率,这会让R把你的每日数据依次当成每个月的单个观测值(比如第1个值对应2014年1月、第2个值对应2014年2月……),完全没有执行月度汇总操作,所以结果自然和你预期的月度统计值不符。
解决步骤:先汇总月度数据,再转时间序列
需要先把每日的number按月份做统计(求和/均值等),得到月度层面的数据后,再转换为时间序列对象。
方法1:基础R实现
set.seed(1) df <- data.frame(date_rec = seq(as.Date("2014-01-01"),as.Date("2015-12-31"), by=1), number = sample(c(1:10),size = 730, replace=TRUE)) # 生成年份-月份的分组标识 df$year_month <- format(df$date_rec, "%Y-%m") # 按月份汇总求和 monthly_data <- aggregate(number ~ year_month, data = df, sum) # 转换为ts对象 start_year <- as.integer(substr(monthly_data$year_month[1], 1, 4)) start_month <- as.integer(substr(monthly_data$year_month[1], 6, 7)) df_ts <- ts(monthly_data$number, frequency = 12, start = c(start_year, start_month)) # 查看结果 df_ts
方法2:tidyverse工具链(更简洁)
library(tidyverse) library(lubridate) set.seed(1) df <- tibble(date_rec = seq(as.Date("2014-01-01"),as.Date("2015-12-31"), by=1), number = sample(c(1:10),size = 730, replace=TRUE)) # 按年、月分组求和 monthly_data <- df %>% mutate(year = year(date_rec), month = month(date_rec)) %>% group_by(year, month) %>% summarise(total_number = sum(number), .groups = "drop") # 转换为ts对象 df_ts <- ts(monthly_data$total_number, frequency = 12, start = c(2014, 1)) # 查看结果 df_ts
运行后你会看到2014年1月的统计值变为该月所有number的总和(比如用set.seed(1)时结果为172),完全符合你“远超100”的预期。
内容的提问来源于stack exchange,提问作者Joep_S
相关产品推荐
相关产品推荐

