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)
我想问问是否有人知道如何为 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)