在R中,“circular”是什么意思?

13

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

months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333

在这个虚拟示例中,平均值应该在一月或十二月。我看到有循环统计的包,但我不确定它们是否适合我的需求。

1个回答

17

我认为

months <- c(1,1,1,2,3,5,7,9,11,12,12,12)
library("CircStats")

现在将月份转换为弧度,计算圆形平均值,然后再将其转换回月份。我在这里减去1,假设一月在“0弧度”/12点钟位置...
conv <- 2*pi/12 ## months -> radians
(res1 <- circ.mean(conv*(months-1))/conv)

结果是-0.3457。您可能需要:
(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'

2
12+Arg(mean(exp(conv*(months-1)*1i)))/conv%%12 的等价表达式。 - A. Webb
那是一个聪明的公式。我想知道那个方程是否可以用于确定双峰数据的平均值? - Chris
在有关这个主题的维基百科文章中写道:“如果所有角度相等,则结果半径为1。如果角度在圆上均匀分布,则结果半径将为0,因此不存在循环平均数。”我们该如何计算“半径”以将其用作平均值强度的指标?来源:https://en.wikipedia.org/wiki/Mean_of_circular_quantities - Chris
2
@Chris 只需使用 Mod 而不是 ArgMod(mean(exp(conv*(months-1)*1i))) - A. Webb
Http://www.inside-r.org/r-doc/base/Mod 包含了一些链接。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接