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

关于数据框N长度子集函数执行存结果及depmixS4训练HMM的问题

我来一步步帮你解决这两个问题哈!

1. 对数据框的N长度子集运行函数,并将结果存储到列表里

这里分两种常见场景给你示例代码,你可以根据自己的需求选择:

场景1:不重叠的固定长度子集

比如把数据框按每N行切成一块,每块独立处理:

library(purrr)

# 模拟示例数据框
df <- data.frame(
  x = 1:10,
  y = rnorm(10)
)
N <- 3  # 你设定的子集长度

# 生成分组索引,拆分出不重叠的子集
group_ids <- ceiling(seq(nrow(df)) / N)
df_subsets <- split(df, group_ids)

# 对每个子集运行目标函数(这里以计算列均值为例),结果存入列表
result_list <- map(df_subsets, ~ colMeans(.x))

场景2:滑动窗口式的重叠子集

如果需要每次滑动1行取N长度的子集(比如时间序列的滑动分析):

# 生成所有滑动窗口的起始索引
start_positions <- seq(1, nrow(df) - N + 1, by = 1)

# 遍历每个起始位置,提取子集并运行函数
result_sliding <- map(start_positions, function(i) {
  current_subset <- df[i:(i + N - 1), ]
  # 替换成你自己的函数,比如计算最大值、自定义统计量等
  apply(current_subset, 2, max)
})
2. 用depmixS4处理非连续周末数据训练HMM

你的核心问题是:每周的周末数据是连续的,但周与周之间没有时间连续性,且每周观测数不一致。这时候关键是要让HMM识别哪些观测属于同一个连续序列(同一个周末),depmixS4的group参数正好能解决这个问题!

步骤1:给数据添加序列ID

首先得给每个周末分配唯一ID,让模型知道哪些行属于同一组连续观测。假设你的数据框叫weekend_data,有day列标记周六/周日:

# 模拟你的示例数据
weekend_data <- data.frame(
  id = 1:9,
  day = c(rep("Saturday", 3), rep("Sunday", 6)),
  time_of_day = rep("Evening", 9),
  val1 = c(16.2, 23.4, 29.4, 24.2, 24.2, 24.2, 24.2, 25.4, 26.0),
  val2 = c(235.84, 235.29, 232.79, 233.89, 233.66, 233.38, 232.99, 233.21, 233.00)
)

# 生成序列ID:当遇到周六且前一行是周日时,说明是新的周末,ID+1
weekend_data$seq_id <- 1
for (i in 2:nrow(weekend_data)) {
  if (weekend_data$day[i] == "Saturday" && weekend_data$day[i-1] == "Sunday") {
    weekend_data$seq_id[i] <- weekend_data$seq_id[i-1] + 1
  } else {
    weekend_data$seq_id[i] <- weekend_data$seq_id[i-1]
  }
}

如果你的数据有实际日期列(比如date),用周数分组更准确:weekend_data$seq_id <- lubridate::week(weekend_data$date),这样同一周的周末数据会自动归为一组。

步骤2:训练分组HMM

用group = seq_id告诉模型,每个seq_id对应的是一个独立的连续序列,模型会只在序列内部计算状态转移概率,不同序列之间不做连续假设:

library(depmixS4)

# 构建2状态HMM,这里用val1和val2作为观测变量(默认正态分布)
hmm_model <- depmix(
  list(val1 ~ 1, val2 ~ 1),  # 观测模型:每个变量用常数项建模
  data = weekend_data,
  nstates = 2,  # 可根据需求调整状态数
  group = seq_id  # 关键!指定分组变量
)

# 拟合模型
fit_hmm <- fit(hmm_model)

# 查看拟合结果
summary(fit_hmm)

如果你的观测变量不是正态分布(比如分类变量),可以在depmix里指定family参数,比如family = multinomial(),具体可参考depmixS4的官方文档调整。


内容的提问来源于stack exchange,提问作者John Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:11:19