我希望将自定义函数应用于矩阵的每个元素,同时还使用不同矩阵的元素作为函数的输入。
具体来说,我的函数从 von Mises 分布(圆形正态分布)生成随机样本,调用 Rfast 包的 rvonmises 函数。
我有一个矩阵(弧度),它记录了我希望用于随机生成集中趋势的角度(类似于平均值),另一个矩阵(kappa) strong>),它记录了我希望使用的 von Mises 的浓度参数(类似于标准偏差)。
我希望在调用中使用(例如)弧度矩阵的元素 [1, 1] 和 kappa 矩阵的元素 [1, 1] von Mises 随机发生器。所以,我对一个元素的要求是:
rvonmises(n = 1, m = radians[1, 1], k = kappa[1, 1])
但当然我希望这适用于矩阵的所有元素。 (rvonmises 函数不接受多个 m 或 k 值,因此例如我不能使用 rvonmises(4, m = c(1, 2, 3, 4), k = c(1, 1.2, 1.4, 1.6))
。)
总结:我基本上追求一种更有原则(更快!)的方法:
for(i in 1:nrow(radians)){
for(j in 1:ncol(radians)){
result[i, j] <- Rfast::rvonmises(1, radians[i, j], kappa[i, j])
}
}
基于this post,我尝试使用mapply:
library(Rfast)
set.seed(42)
# random radians to use as input
radians <- matrix(data = runif(12, 0, 2 * pi),
ncol = 4)
# random concentration parameters of the von Mises distribution
kappa <- matrix(data = rgamma(12, 70, 30),
ncol = 4)
# function to generate random von mises sample with angle x and
# concentration parameter k
my_function <- function(m, k){
Rfast::rvonmises(1, m, k)
}
# my attempt
out <- matrix(mapply(my_function, m = as.data.frame(radians), k = kappa),
ncol = 4, byrow = TRUE)
但是,我认为这行不通。例如,如果我通过以下方式对其进行测试(其中 test_radians 的集中趋势稳步增加,并且我对 kappa 使用较大的值,这会导致精确的估计):
test_radians <- matrix(data = seq(from = 1, to = 2 * pi, length.out = 12),
ncol = 4)
test_kappa <- matrix(data = rep(20, times = 12),
ncol = 4)
test <- matrix(mapply(my_function, m = as.data.frame(test_radians),
k = test_kappa),
ncol = 4, byrow = TRUE)
test[1, 1] 应该更小(平均而言),而 test[3, 4] 应该最大。 (我知道由于随机可变性,情况并非总是如此,但我已经尝试过多次重复。)
因此,矩阵之间的映射和匹配并没有像我预期的那样工作。
欢迎任何指导。
答案 0 :(得分:1)
您无法通过简单地调用“平均值”来计算圆形观察的平均值。这是错误的。正确的方法是计算角度的余弦和正弦的平均值,然后使用反正切。请参阅 pcakcges 以获取定向或循环数据。
其次,您给了我们一个想法,即返回一个由 von Mises 生成的数据组成的矩阵。但是,既然 brms 为您完成这项工作,那么此刻我会去那里。