R:使用不同矩阵的元素作为函数输入对矩阵的每个元素应用函数

时间:2021-03-14 16:29:15

标签: r matrix mapply

我希望将自定义函数应用于矩阵的每个元素,同时还使用不同矩阵的元素作为函数的输入。

具体来说,我的函数从 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] 应该最大。 (我知道由于随机可变性,情况并非总是如此,但我已经尝试过多次重复。)

因此,矩阵之间的映射和匹配并没有像我预期的那样工作。

欢迎任何指导。

1 个答案:

答案 0 :(得分:1)

您无法通过简单地调用“平均值”来计算圆形观察的平均值。这是错误的。正确的方法是计算角度的余弦和正弦的平均值,然后使用反正切。请参阅 pcakcges 以获取定向或循环数据。

其次,您给了我们一个想法,即返回一个由 von Mises 生成的数据组成的矩阵。但是,既然 br​​ms 为您完成这项工作,那么此刻我会去那里。

相关问题