我想问问是否有人知道如何动态地向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()函数似乎并不真正接受其中的任何一个...
答案 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)