R rnorm参数作为字符

时间:2018-11-20 17:07:35

标签: r statistics sampling

我想问问是否有人知道如何动态地向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循环仅循环遍历参数列表的名称,并为样本分配相应的数值。感谢您的输入!

最诚挚的问候,

编辑:我得到我可以在rmrm函数中使用列表名,但是这个问题的焦点实际上是以某种方式动态地分配它,即我可以使用更多参数扩展参数列表,而不必分配采样程序中的任何新内容。我已经使用message / pasteo / cat / ...进行了很多尝试,但是rnorm()函数似乎并不真正接受其中的任何一个...

3 个答案:

答案 0 :(得分:2)

您可以使用Vectorize对函数进行向量化,以便可以将向量用作其参数:

rnormV <- Vectorize(rnorm)

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

答案 1 :(得分:1)

有很多方法可以解决这个问题,但是首先,您需要检查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

答案 2 :(得分:1)

适用于

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