如何将 von mises 分布拟合到我的数据以生成随机样本

how to fit a von mises distribution to my data for generating random samples

我的数据由特定位置的 16 对距离和方位组成。 我正在尝试为这 16 对生成 1000 个重采样(即创建新的 X2 和 Y2 集)。所以最后我将有 1000、16 对距离和方位,从而产生新的 16 个空间点。

my data, using the bearing and the distance to generate X2 and Y2

到目前为止我所做的是从我已有的 16 个值中重新采样(重新洗牌),

`

f2 <- function(x) data.frame(bearing = sample(min(HRlog$beartoenc):max(HRlog$beartoenc), 16, replace = TRUE), 
                                distance = sample(min(HRlog$distoenc):max(HRlog$distoenc), 16, replace = TRUE))

    se1randcent <- as.data.frame(lapply(seq(1000), f2))

`

但我的顾问不同意。

有人告诉我应该根据 von mises 分布重新采样,即将分布拟合到我的数据,然后根据我得到的 K 值从该分布重新生成 16 对。 我真的不知道这是什么意思。谁能帮我解决一下?

我发布这个问题是因为我有严重的时间压力并且怀孕 9 个月所以我的怀孕大脑无法帮助我及时解决问题。

如有任何帮助,我们将不胜感激!!

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)

根据评论添加内容

均匀性检验的一个问题是样本量太小。两种似乎合适的方法是瑞利和柯伊伯检验,它们针对均匀性进行检验。 NCSS Manual

给出了这些背景

两者都在circular中实现了,但我不确定是否使用了修改后的Rayleigh。 bearings_rad 的结果表明 Rayleigh p 值 = 0.2 和 Kuiper p 值 < 0.05。

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')