首页 > 解决方案 > R圆形包计算线性平均值而不是单位=“小时”的圆形平均值

问题描述

对于大量的物种数据集,我试图计算给定月份的循环平均值,例如对于从 3 月到 7 月开花的物种,我想知道平均开花月份(即 5 月)和方差也在平均值附近。

给定月份是循环的,因此从 12 月到 2 月开花的物种的平均值应该是 1 月,我使用循环统计来计算循环平均值,特别是 R 包循环。但是,当我尝试使用循环包计算循环平均值时,units = "hours"我得到的值显然是错误的,并且看起来更像线性平均值。

这是一个简化的示例:

library(circular)  #to install: install.packages("circular")

#generate example data, from Nov (i.e. 11) to March (i.e. 3)
df <- data.frame(X = c(rep(paste("species", 2), 5)),
                 Y = c(1:3, 11:12))

df$Y <- circular::circular(df$Y, units = "hours", template = "clock12") #convert to circular variable

circular::mean.circular(df$Y) #calculate circular mean

#should return mean of 1 (January) but instead returns:

#Circular Data: 
#Type = angles 
#Units = hours 
#Template = clock12 
#Modulo = asis 
#Zero = 1.570796 
#Rotation = clock 
#[1] 4.774558

当我按照这篇文章将月份值转换为弧度时,我得到了简化示例的正确平均值:

df$Yrad <- ((df$Y-1)*(2*pi/12)) #convert months to radians with 0 radians = January

circmean <- circular::mean.circular(circular(df2$Yrad, units = "radians"))

circmean <- ((circmean + 12) %% 12) + 1 #convert mean from radians back to months

#gives mean of 1 i.e. January!

但是对于更复杂的示例数据,我没有得到使用这种方法的正确方法——这给出了一个从 5 月(5)到 9 月(9)开花的物种的循环平均值为 4.14(即 4 月至 5 月),而我会预计循环平均值为 7(7 月):

library(tidyverse) #to install: install.packages("tidyverse")
library(circular)  #to install: install.packages("circular")

#generate example data
df2 <- data.frame(X = c(rep(paste("species", 1), 5), rep(paste("species", 2), 5), 
                       rep(paste("species", 3), 4), rep(paste("species", 4), 6)),
                 Y = c(5:9, 1:3, 11:12, 1:2, 11:12, 3, 5, 8, 9, 10, 12))

df2$Yrad <- ((df2$Y-1)*(2*pi/12)) #convert months to radians with 0 radians = January
df2$Yrad <- circular::circular(df2$Yrad, units = "radians") #convert Yrad to circular variable

#calculate circular mean for each species in column X
circmean <- df %>%
  dplyr::group_by(X) %>%
  dplyr::summarise(circ_mean = Yrad %>%
                     circular::mean.circular()) %>%
  ungroup()

circmean$circmeanmonth <- ((circmean$circ_mean + 12) %% 12) + 1 #convert mean from radians back to months

#returns below - circular mean looks correct for species 2 and maybe species 3?
#>X           circ_mean       circmeanmonth
#>species 1   3.141593e+00    4.141593
#>species 2   -2.379867e-16   1.000000
#>species 3   -2.617994e-01   12.738201
#>species 4   -1.986080e+00   11.013920

如果我不转换为弧度并使用units = "hours"圆形似乎只能从上面的示例中正确计算物种 1 的圆形平均值。如果我确实转换为弧度并使用,units = "radians"我会得到物种 2 和物种 3 的正确答案。物种 4 是一个更复杂的情况,在我的数据中很常见。如何在所有情况下获得正确的循环平均值?我应该尝试不同的包,还是我误解了循环均值的计算?

标签: r

解决方案


据我所知,“clock12”实际上并没有在 12 小时制上计算,即它不会从 12 换到 0(即使显示是这样)。mean(2*df$Y)确实按预期工作......注意?circular

模板:如何绘制数据

(即,不应该如何处理)。因此,我不认为(不幸的是)您实际上可以使用“clock12”来代替月份(即周期为 12 的循环数据)。

破解/更新/创建包的“月”模板/类型将是一个不错的项目......


推荐阅读