如何为1000组模拟数据实现变点检测后的分段均值计算?
解决变点检测的批量分段均值计算问题
1. 修复单组分段均值计算逻辑
你原来的循环代码存在索引错误,这里提供一个更可靠的单组计算函数:
calculate_segment_means <- function(data_vec, cps) { # 生成分段的起始与结束索引 segment_starts <- c(1, cps + 1) segment_ends <- c(cps, length(data_vec)) # 计算每个分段的均值 sapply(seq_along(segment_starts), function(idx) { mean(data_vec[segment_starts[idx]:segment_ends[idx]]) }) }
用你的示例数据测试验证:
set.seed(111) f <- rep(c(0, 5, 2, 8, 1, -2), c(100, 200, 200, 50, 200, 250)) x <- f + arima.sim(list(ar = c(.75, -.5), ma = c(.8, .7, .6, .5, .4, .3)), n = length(f), sd = 1) wc <- wcm.gsa(x) CP <- wc$cp # 输出分段均值 calculate_segment_means(x, CP)
2. 批量处理1000组数据
你已经通过sapply得到了1000组数据的变点列表m,现在用mapply配对每组数据和对应的变点,批量计算:
# 将数据框转为列表(每列对应一组数据) data_list <- as.list(y) # 批量计算所有组的分段均值,保留列表格式适配不同分段数 all_segment_means <- mapply(calculate_segment_means, data_vec = data_list, cps = m, SIMPLIFY = FALSE)
结果说明
all_segment_means是长度为1000的列表,每个元素对应一组数据的分段均值向量- 如果所有组的分段数一致,可通过
do.call(rbind, all_segment_means)将结果转为数据框;若分段数有差异,建议保留列表格式方便后续处理
内容的提问来源于stack exchange,提问作者Tare
相关产品推荐
相关产品推荐

