在R中使用rollapply计算圆形变量移动窗口标准差遇异常结果求助
问题:rollapply计算圆形标准差结果异常的原因与解决方法
我在R中处理大型时间序列的圆形变量(方位角,单位360度),想用zoo包的rollapply计算移动窗口的圆形标准差。为验证结果,我创建了41个近似正北的观测数据,用circular包的sd.circular直接计算得到合理结果(标准差=0.2069542弧度);但用rollapply以窗口宽度41调用sd.circular时,得到的结果却完全不同(标准差=2.551602弧度),就算改用sd.circular的源码实现也得到相同错误结果。请问哪里操作有误?如何正确用rollapply实现圆形标准差的移动窗口计算?
示例代码
library(zoo) library(circular) angle<-c(1:10,330:360) angle<-as.data.frame(angle) angle$angle<-circular(angle$angle,type="angles",units="degrees",rotation="clock") sd.circular(angle$angle) rollapply(angle$angle,width=41,FUN=sd.circular,align="center")
问题原因
rollapply默认会把窗口内的circular对象转换成普通数值向量,丢失了circular类的关键属性(比如角度单位、旋转方向等)。sd.circular函数依赖这些属性来判断数据是圆形的,当传入普通数值时,它会错误地用线性标准差的逻辑计算,结果自然和预期偏差极大。
解决方法
自定义一个包装函数,在函数内部把窗口内的数值重新转换为circular类型,确保sd.circular能识别这是圆形数据。
修正后的代码
library(zoo) library(circular) # 创建测试数据 angle <- c(1:10, 330:360) angle_df <- as.data.frame(angle) angle_df$angle <- circular(angle_df$angle, type = "angles", units = "degrees", rotation = "clock") # 直接计算验证基准结果 sd.circular(angle_df$angle) # 自定义函数:将窗口数值转回circular类型后计算标准差 roll_sd_circular <- function(x) { x_circ <- circular(x, type = "angles", units = "degrees", rotation = "clock") sd.circular(x_circ) } # 使用自定义函数执行移动窗口计算 rollapply(angle_df$angle, width = 41, FUN = roll_sd_circular, align = "center")
运行上述代码后,rollapply返回的结果会和直接调用sd.circular的结果一致,均为0.2069542弧度,符合预期。
内容的提问来源于stack exchange,提问作者Calcifer
相关产品推荐
相关产品推荐

