给定一个月份的数据集,如何计算“平均”月份,考虑到月份是循环的?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
在这个虚拟示例中,平均值应该在一月或十二月。我看到有循环统计的包,但我不确定它们是否适合我的需求。
给定一个月份的数据集,如何计算“平均”月份,考虑到月份是循环的?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
在这个虚拟示例中,平均值应该在一月或十二月。我看到有循环统计的包,但我不确定它们是否适合我的需求。
我认为
months <- c(1,1,1,2,3,5,7,9,11,12,12,12)
library("CircStats")
conv <- 2*pi/12 ## months -> radians
(res1 <- circ.mean(conv*(months-1))/conv)
(res1 + 12) %% 12
这将给出11.65,即12月的部分时间(因为我们仍在0=一月,11=十二月的刻度上)
我认为这是正确的,但没有仔细检查过。
值得一提的是,CircStats::circ.mean
函数非常简单--如果这是你所需的全部内容,它可能不值得加载该软件包的开销:
function (x)
{
sinr <- sum(sin(x))
cosr <- sum(cos(x))
circmean <- atan2(sinr, cosr)
circmean
}
借鉴评论区@A.Webb的巧妙替代方案:
m <- mean(exp(conv*(months-1)*1i))
12+Arg(m)/conv%%12 ## 'direction', i.e. average month
Mod(m) ## 'intensity'
12+Arg(mean(exp(conv*(months-1)*1i)))/conv%%12
的等价表达式。 - A. WebbMod
而不是Arg
:Mod(mean(exp(conv*(months-1)*1i)))
。 - A. Webb