R 中的包circular 可能会有所帮助。 von Mises 分布kappa 参数可以使用最小化方法(如下所示)或通过内置最大似然估计器mle.vonmises() 从您提供的角度计算。获得参数后,您可以使用 rvonmises 和样本数量和计算参数来生成样本。生成的样本似乎在 [0,2pi] 上,因此可以进行一些调整以确保正确表示平均值。
拟合距离可能是一个单独的分布,并且此答案未解决两者之间可能存在依赖关系的问题。
library(circular) # circular statistics and bessel functions
# converting the bearing to be on the interval [-pi,pi] which is conventional for von Mises
bearing <- c(19.07,71.88,17.23,202.39,173.67,357.04,5.82,5.82,95.53,5.82,94.13,157.67,19.07,202.39,173.67,128.15)
bearing_rad <- bearing*2*pi/360 - pi
# sample statistics
circ_mean <- mean.circular(bearing_rad) # mu of von Mises
circ_sd <- sd.circular(bearing_rad) # related to kappa of von Mises
circ_var <- var.circular(bearing_rad)
# function to return difference in variances between
diff_vars2 <- function(kappa){
# squaring to make the function convex
return((1 - A1(kappa) - circ_var)^2)
}
# solving for kappa by matching the variances
kappa_solution <- optim(par = 1,fn=diff_vars2,lower = 0,method="L-BFGS-B")
# sample from von mises distribution
sampled_vals <- rvonmises(n=100, mu=circ_mean, kappa=kappa_solution$par)
基于 cmets 添加内容
一致性测试的一个问题是您的样本量很小。两种似乎合适的方法是瑞利和柯伊伯检验,它们测试均匀性。有关这些的背景在NCSS Manual
两者都在circular中实现,但我不确定是否使用了修改后的瑞利。 bearings_rad 的结果表明 Rayleigh p-value = 0.2 和 Kuiper p-value
rayleigh.test(x=bearing_rad)
kuiper.test(x=bearing_rad)
您可以使用dvonmises 将拟合直方图添加到上图中。这将给出半径,可以使用标准极坐标转换将其转换为 x 和 y。使角度起作用可能有点棘手。如果您不希望背景出现玫瑰图,可以使用plot。
rose.diag(bearing_rad)
density_vals <- dvonmises(x=seq(0,2*pi,0.01)-circ_mean,mu = 0,kappa=kappa_solution$par)
x_from_polar <- density_vals*cos(seq(0,2*pi,0.01))
y_from_polar <- density_vals*sin(seq(0,2*pi,0.01))
lines(x=x_from_polar,y=y_from_polar,col='red')