圆形分布的中心(平均值)

时间:2017-02-05 01:03:48

标签: r average mean

我有一个按月出现次数的数据集,并希望计算分布中心/平均月份。如果可能的话,我也希望有信心间隔。

我已阅读了圆形和CircStats的手册,并查看了类似的问题herehere

我设法在某些情况下获得了看似合理的结果,但在其他情况下却没有,并且还没有弄清楚如何计算置信区间。

为了说明我的观点,这里有一些虚拟数据:

library(CircStats)

# The number of observations by month (Jan-Dec):
obsMonths1 <- c(12,15,1,2,3,1,1,4,1,2,7,1) 
obsMonths2 <- c(1,1,1,1,2,10,11,2,1,1,2,1)

# Convert data to radians:
obsRadians1 <- (obsMonths1/12*2)*pi
obsRadians2 <-(obsMonths2/12*2)*pi

# Calculate circular mean:
mean1 <- circ.mean(obsRadians1-1)#assume January is 0
mean2 <- circ.mean(obsRadians2-1)#assume January is 0

# Convert radians to months:
mean1*12/(2*pi)+12 
mean2*12/(2*pi)+12 

对于第一组观察,答案似乎是明智的,但对于第二组观察,应该是7月至8月。

2 个答案:

答案 0 :(得分:0)

看起来您的代码没有问题。您询问了#34;置信区间&#34;,但您似乎没有做过任何统计测试 bootstrapping 程序。如果没有这些结果,我不确定如何计算置信区间。如果您确定自己做得对,那么您可能需要在数学/统计特定的StackExchange社区中提出这个问题。

答案 1 :(得分:0)

tl; dr 我同意您的计算基本上是正确的;我认为这是您的直觉,这是错误的,正如我在下面用一些图片所示。

library(CircStats)
# The number of observations by month (Jan-Dec):
obsMonths1 <- c(12,15,1,2,3,1,1,4,1,2,7,1) 
obsMonths2 <- c(1,1,1,1,2,10,11,2,1,1,2,1)

我与弧度之间的转换略有不同;使用模(%%)运算符会自动将12转换为零。我加了11,使一月== 0,但一切保持正值...

to_rad <- function(x) (x+11 %% 12)/12*2*pi
## check results
stopifnot(to_rad(1)==0,to_rad(7)==pi,to_rad(4)==pi/2,to_rad(10)==3*pi/2)

然后转换回去:

from_rad <- function(x) (12/(2*pi)*x)+1
## check round-trip with an arbitrary number
stopifnot(isTRUE(all.equal(from_rad(to_rad(7.931)),7.931)))

转化:

(m1 <- from_rad(circ.mean(to_rad(obsMonths1))))  ## 1.77
(m2 <- from_rad(circ.mean(to_rad(obsMonths2))))  ## 0.93

引导代码:

bootquant <- function(x,n=1000,alpha=0.05) {
    bootsamp  <- replicate(n,
                           from_rad(circ.mean(to_rad(sample(x,replace=TRUE)))))
    qq <- quantile(bootsamp,c(alpha/2,1-alpha/2))
    names(qq) <- c("lwr","upr")
    return(qq)
}
(bq1 <- bootquant(obsMonths1))
##      lwr      upr 
## 1.076794 2.670130 
(bq2 <- bootquant(obsMonths2))
##      lwr      upr 
## 0.231873 1.414766 

我不确定我会相信这么小的数据集的引导程序;您可能还需要检查?circ.disp中的CircStats函数...

library(ggplot2)
dd <- data.frame(OM1=obsMonths1,OM2=obsMonths2)
ggplot(dd,aes(x=OM1,y=1))+stat_sum()+coord_polar()+
    scale_x_continuous(limits=c(0,12), breaks=c(0,3,6,9,12))+
    annotate(geom="point",y=1,x=m1,colour="red")+
    annotate(geom="segment",x=bq1[["lwr"]],xend=bq1[["upr"]],y=1,yend=1,colour="red")

ggplot(dd,aes(x=OM2,y=1))+stat_sum()+coord_polar()+
    scale_x_continuous(limits=c(0,12), breaks=c(0,3,6,9,12))+
    annotate(geom="point",y=1,x=m2,colour="red")+
    annotate(geom="segment",x=bq2[["lwr"]],xend=bq2[["upr"]],y=1,yend=1,colour="red")

enter image description here