r - 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 是一个更复杂的情况,在我的数据中很常见。如何在所有情况下获得正确的循环平均值?我应该尝试不同的包,还是我误解了循环均值的计算?
解决方案
据我所知,“clock12”实际上并没有在 12 小时制上计算,即它不会从 12 换到 0(即使显示是这样)。mean(2*df$Y)
确实按预期工作......注意?circular
说
模板:如何绘制数据
(即,不应该如何处理)。因此,我不认为(不幸的是)您实际上可以使用“clock12”来代替月份(即周期为 12 的循环数据)。
破解/更新/创建包的“月”模板/类型将是一个不错的项目......
推荐阅读
- java - 运行项目后出现如下错误java.lang.NullPointerException
- flutter - 如何在飞镖控制台中采用水平线多用户输入?
- c# - 通过 API 使用全局资源
- nested - 使用嵌套包类型作为类型的私有部分声明
- python - 如何在python sqlite3中查询字符串中的子字符串
- python - 向 Tensorflow 中的密集层添加新单元
- php - 如何使用 sum 方法雄辩 laravel
- c# - 从 C# 写入的 BGScript GATT 特征不起作用
- python - python:如何绘制以下函数的折线图?
- reactjs - validateDOMNesting(...): 不能作为子级出现问题