You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于年份拆分时间序列为训练/测试集的R语言解决方案(支持Shiny)

问题分析与解决方案

原代码的核心问题是创建train和test时,没有根据Date列筛选对应时间段的数据行,只是给ts()函数指定了时间标签,但实际传入的是整个p$data向量,导致测试集包含了全部数据而非目标区间的内容。

修正后的基础代码

library(lubridate)
library(stats)

# 读取并预处理数据
p <- read.csv("steel.csv")
p$Date <- mdy(p$Date) # 用lubridate的mdy函数更简洁
p <- p[order(p$Date), ] # 确保数据按时间顺序排列

# 筛选训练集(2014-01 至 2019-06)和测试集(2019-07 至 2020-06)的数据行
train_data <- p[p$Date >= ymd("2014-01-01") & p$Date <= ymd("2019-06-30"), "data"]
test_data <- p[p$Date >= ymd("2019-07-01") & p$Date <= ymd("2020-06-30"), "data"]

# 转换为时间序列对象,确保时间区间与数据长度匹配
train <- ts(train_data, start = c(2014, 1), frequency = 12)
test <- ts(test_data, start = c(2019, 7), frequency = 12)

适配Shiny应用的版本

在Shiny中建议用响应式对象处理数据,确保数据更新时能自动重新计算:

library(shiny)
library(lubridate)
library(stats)

ui <- fluidPage(
  fileInput("file", "上传steel.csv文件"),
  verbatimTextOutput("train_info"),
  verbatimTextOutput("test_info")
)

server <- function(input, output) {
  # 响应式处理数据读取与预处理
  processed_data <- reactive({
    req(input$file)
    p <- read.csv(input$file$datapath)
    p$Date <- mdy(p$Date)
    p[order(p$Date), ]
  })
  
  # 响应式生成训练集时间序列
  train_ts <- reactive({
    p <- processed_data()
    train_rows <- p$Date >= ymd("2014-01-01") & p$Date <= ymd("2019-06-30")
    ts(p$data[train_rows], start = c(2014, 1), frequency = 12)
  })
  
  # 响应式生成测试集时间序列
  test_ts <- reactive({
    p <- processed_data()
    test_rows <- p$Date >= ymd("2019-07-01") & p$Date <= ymd("2020-06-30")
    ts(p$data[test_rows], start = c(2019, 7), frequency = 12)
  })
  
  # 输出训练集验证信息
  output$train_info <- renderPrint({
    cat("训练集时间序列详情:\n")
    print(train_ts())
    cat("\n时间范围:", start(train_ts()), "至", end(train_ts()))
  })
  
  # 输出测试集验证信息
  output$test_info <- renderPrint({
    cat("测试集时间序列详情:\n")
    print(test_ts())
    cat("\n时间范围:", start(test_ts()), "至", end(test_ts()))
  })
}

shinyApp(ui, server)

关键注意点

  • 用lubridate工具处理日期更直观,避免parse_date_time的参数适配问题
  • 必须先按Date排序,防止时间序列数据乱序
  • 先通过日期筛选拆分数据行,再转换为ts对象,保证时间标签和数据一一对应
  • Shiny中用响应式对象封装逻辑,能自动应对文件上传、数据更新等动态场景

内容的提问来源于stack exchange,提问作者Mohit Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:36:27