R rnorm 参数作为字符

R rnorm Arguments as character

我想问问是否有人知道如何为 R 的采样函数动态分配参数的变通方法,即我想编写一个具有不同名称的列表,比如 "mean" 和 "sd" ,并且这两个子列表的元素都包含我想要的这些参数的相应数值。例如,我想这样做:

#Distribution of Interest
SamplingDistribution <- rnorm

#Parameters of Interest for Normal Distribution
Parameters <- list(mean    = c(1, -1), 
                   sd      =  c(1, 2)   
               )

#Not Working Example
SamplingDistribution (n = 1, 
                      for(i in 1:length(Parameters) ){
                      names(Parameters)[i] <- Parameters[i]
                      }
  )

所以理想情况下,我只是在开始时阐明感兴趣的采样分布,然后可以将我想要的任何参数(以任何顺序)放入参数列表中。然后 for 循环只是循环遍历参数列表的名称,并将相应的数值分配给样本。感谢您的投入!

此致,

编辑:我知道我可以只在 rnorm 函数中使用列表名,但这个问题的重点实际上是以某种方式动态分配它,即我可以用更多参数扩展参数列表但我没有分配任何新的采样程序。我已经尝试了很多 message/pasteo/cat/...,但是 rnorm() 函数似乎并没有真正接受这些...

有多种方法可以解决此问题,但首先您需要查看 apply 函数系列,helpful link here:

Parameters <- list(mean    = c(1, -1), 
                   sd      =  c(1, 2))

set.seed(1)

mapply(function(mn, sd) rnorm(1, mean = mn, sd = sd),
       Parameters[[1]],
       Parameters[[2]])

[1]  0.3735462 -0.6327134

第二次尝试:

这并不能完美地重现您正在寻找的内容,但我相信它已经很接近了。

library(purrr)

my_sampling <- function(dst, par_list){
  map(transpose(par_list), 
         function(params){
           do.call(dst, params)
         })
}

norm_params <- list(n       = c(2,1),
                    mean    = c(1, -1), 
                    sd      = c(1, 2))

pois_params <- list(n      = c(5, 6),
                    lambda = c(3, 4))

set.seed(1)

my_sampling(rnorm, norm_params)

[[1]]
[1] 0.3735462 1.1836433

[[2]]
[1] -2.671257

my_sampling(rpois, pois_params)

[[1]]
[1] 6 4 3 1 2

[[2]]
[1] 2 5 3 5 4 5

您可以使用 Vectorize 向量化一个函数,这样向量就可以用作它的参数:

rnormV <- Vectorize(rnorm)

rnormV(1, Parameters[[1]], Parameters[[2]])
# [1] -0.0530436 -0.2327272

映射有效

#Parameters of Interest for Normal Distribution
Parameters <- list(mean = c(1, -1), 
                   sd = c(1, 2)   
)
#Working Example
mapply(rnorm, n=1, mean=Parameters$mean, sd=Parameters$sd)
[1]  0.03164361 -1.12035840

更新

如果您不想明确命名参数或依赖任何外部包,您可以简单地做(参见一组参数的类似答案 here):

#Parameters of Interest for Normal Distribution
Parameters <- list(n = 1,
                   mean = c(10, -1), 
                   sd = c(1, 2))

do.call(Vectorize(rnorm),Parameters)

如果你总是有相同的 n 并且不希望它出现在你的参数列表中,那么你可以这样做:

#Parameters of Interest for Normal Distribution
Parameters <- list(mean = c(1, -1), 
                   sd = c(1, 2)   
)

do.call(Vectorize(rnorm),c(list(n=1),Parameters))

包裹在一个不错的函数中:

sampling <- function(fun, n, params{
  do.call(Vectorize(fun),c(list(n=n),params)
}

sampling(rnorm, 1, Parameters)