R语言zoo包rollapply函数滑动均值输出偏移及绘图对齐问题
解决zoo包rollapply滑动均值对齐问题
嘿,我来帮你搞定这个滑动均值对齐的问题!我猜你肯定是被rollapply的align参数搞懵了,别担心,咱们一步步来解决:
首先,先把你的数据转换成zoo对象——这很关键,因为rollapply是专门针对带时间索引的zoo/xts对象设计的,直接用data.frame列计算很容易忽略年份导致对齐错误:
# 先构造完整数据(假设你提供的Rain数据是完整的,这里补全占位符) rain_data <- structure(list(Year = 1961:2009, Rain = c(7.6656130268, 8.1981182796, 14.4514275121, 13.1530337942, 9.2569892473, 14.1592933948, 10.8212829069, 3.2401689708, 14.5850998, rep(NA, length(1961:2009)-8))), class = "data.frame") # 加载zoo包并转换成zoo对象,用Year作为时间索引 library(zoo) rain_zoo <- zoo(rain_data$Rain, order.by = rain_data$Year)
接下来,核心是搞清楚滑动窗口的对齐逻辑:你需要的是1969-2009的原始序列和对应的9年滑动均值,这里分两种常用的对齐方式给你演示:
方式1:窗口末尾对齐当前年份(最适合你的需求)
这种方式下,每个年份的均值是包括当前年份在内的前8年+当前年的9年平均,刚好1969的均值对应1961-1969的 rainfall 平均,完美匹配你的时间范围:
# 计算9年滑动均值,align="right"表示窗口末尾对齐当前索引 roll_mean_right <- rollapply(rain_zoo, width = 9, FUN = mean, align = "right", na.rm = TRUE) # 截取1969-2009的部分,确保原始序列和均值序列时间范围一致 rain_zoo_sub <- window(rain_zoo, start = 1969, end = 2009) roll_mean_right_sub <- window(roll_mean_right, start = 1969, end = 2009) # 绘图展示 plot(rain_zoo_sub, type = "l", col = "blue", ylab = "Rainfall", main = "1969-2009 Rainfall & 9-Year Rolling Mean") lines(roll_mean_right_sub, col = "red", lwd = 2) legend("topright", legend = c("Original Data", "9-Year Rolling Mean"), col = c("blue", "red"), lty = 1, lwd = c(1,2))
方式2:窗口中心对齐当前年份
如果你想要每个年份的均值是当前年份前后各4年+当前年的9年平均(比如1969的均值对应1965-1973的 rainfall 平均),可以用align="center",记得要截取对应范围:
# 计算中心对齐的滑动均值 roll_mean_center <- rollapply(rain_zoo, width = 9, FUN = mean, align = "center", na.rm = TRUE) # 截取1969-2009的部分(中心对齐下1961-1964的均值为NA,不影响你的目标范围) roll_mean_center_sub <- window(roll_mean_center, start = 1969, end = 2009) # 绘图展示 plot(rain_zoo_sub, type = "l", col = "blue", ylab = "Rainfall", main = "1969-2009 Rainfall & Centered 9-Year Rolling Mean") lines(roll_mean_center_sub, col = "red", lwd = 2) legend("topright", legend = c("Original Data", "Centered 9-Year Rolling Mean"), col = c("blue", "red"), lty = 1, lwd = c(1,2))
几个小提示帮你避坑
- 如果你之前对齐错误,大概率是没把数据转成zoo对象,直接用data.frame的列计算时,rollapply只会按行号处理,完全忽略年份索引,自然对不齐。
- 如果你的Rain数据里有缺失值,一定要加上
na.rm=TRUE,不然均值会直接返回NA(除非窗口里全是NA)。 - 想让滑动均值和原始序列长度完全一致?可以加
fill=NA参数,这样前8年的均值会填充为NA,之后从1969开始有有效值,不用额外截取:
roll_mean_right <- rollapply(rain_zoo, width = 9, FUN = mean, align = "right", na.rm = TRUE, fill = NA)
内容的提问来源于stack exchange,提问作者Lyndz
相关产品推荐
相关产品推荐

