gpt4 book ai didi

R 圆形包计算线性平均值而不是圆形平均值,单位 = "hours"

转载 作者:行者123 更新时间:2023-12-03 18:52:13 38 4
gpt4 key购买 nike

对于大量的物种数据集,我试图计算给定月份集的圆形平均值,例如对于从 3 月到 7 月开花的物种,我想知道开花的平均月份(即 5 月),以及围绕平均值的方差。
给定月份是循环的,因此 12 月到 2 月开花的物种的平均值应该是 1 月,我使用循环统计来计算循环平均值,特别是 R 包 circular 。但是,当我尝试使用循环包和 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
当我按照 this post 将我的月份值转换为弧度时,我得到了简化示例的正确平均值:
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

template: how the data should be plotted


(即,不是它应该如何处理)。所以我不认为(不幸的是)你实际上可以使用“clock12”来代替月份(即周期为 12 的循环数据)。
为包破解/更新/创建“月”模板/类型将是一个不错的项目......

关于R 圆形包计算线性平均值而不是圆形平均值,单位 = "hours",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66756497/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com