我有一个按月出现次数的数据集,并希望计算分布中心/平均月份。如果可能的话,我也希望有信心间隔。
我已阅读了圆形和CircStats
的手册,并查看了类似的问题here和here。
我设法在某些情况下获得了看似合理的结果,但在其他情况下却没有,并且还没有弄清楚如何计算置信区间。
为了说明我的观点,这里有一些虚拟数据:
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月。
答案 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")