给定一个月的数据集,我如何计算“平均”月份,同时考虑到月份是循环的?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
在这个虚拟的例子中,平均值应该是1月或12月。我看到有循环统计的软件包,但我不确定它们是否适合我的需求。
给定一个月的数据集,我如何计算“平均”月份,同时考虑到月份是循环的?
months = c(1,1,1,2,3,5,7,9,11,12,12,12)
mean(months)
## [1] 6.333333
在这个虚拟的例子中,平均值应该是1月或12月。我看到有循环统计的软件包,但我不确定它们是否适合我的需求。
我认为
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'
我认为
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'