给定数月的数据集,如何计算平均数"一个月,考虑到这几个月是循环的?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
在这个虚拟的例子中,平均值应该是1月或12月。我看到有循环统计的软件包,但我不确定它们是否适合我的需求。
答案 0 :(得分:15)
我认为
months <- c(1,1,1,2,3,5,7,9,11,12,12,12)
library("CircStats")
conv <- 2*pi/12 ## months -> radians
现在将月份转换为弧度,计算循环均值,然后转换回月份。假设1月处于“0弧度”/ 12点......我在这里减去1 ...
(res1 <- circ.mean(conv*(months-1))/conv)
结果是-0.3457。你可能想要:
(res1 + 12) %% 12
给出11.65,即12月中途(因为我们仍然在0 = 1月,11 = 12月比例)
我认为这是对的,但没有仔细检查过。
对于它的价值,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'