R中的"圆形"表示

gen*_*ser 11 average r time-series mean

给定一个月的数据集,我如何计算"平均"月份,同时考虑到月份是循环的?

months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
Run Code Online (Sandbox Code Playgroud)

在这个虚拟的例子中,平均值应该是1月或12月.我看到有循环统计的软件包,但我不确定它们是否适合我的需求.

Ben*_*ker 15

我认为

months <- c(1,1,1,2,3,5,7,9,11,12,12,12)
library("CircStats")
conv <- 2*pi/12 ## months -> radians
Run Code Online (Sandbox Code Playgroud)

现在将月份转换为弧度,计算循环均值,然后转换回月份.假设1月处于"0弧度"/ 12点钟,我在这里减去1 ...

(res1 <- circ.mean(conv*(months-1))/conv)
Run Code Online (Sandbox Code Playgroud)

结果是-0.3457.你可能想要:

(res1 + 12) %% 12
Run Code Online (Sandbox Code Playgroud)

给出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
}
Run Code Online (Sandbox Code Playgroud)

在评论中加入@ A.Webb的巧妙替代方案:

 m <- mean(exp(conv*(months-1)*1i))
 12+Arg(m)/conv%%12  ## 'direction', i.e. average month
 Mod(m)              ## 'intensity'
Run Code Online (Sandbox Code Playgroud)

  • `12+Arg(mean(exp(conv*(months-1)*1i)))/conv%%12`,等价 (2认同)
  • @Chris只是`Mod`而不是'Arg`:`Mod(mean(exp(conv*(months-1)*1i))) (2认同)