gpt4 book ai didi

r - 如何有效地生成模拟值的数据框?

转载 作者:行者123 更新时间:2023-12-01 12:42:18 25 4
gpt4 key购买 nike

我正在尝试根据现有分布参数生成模拟值的数据框。我的主数据框包含每个观察值的均值和标准差,如下所示:

example.data <- data.frame(country=c("a", "b", "c"), 
score_mean=c(0.5, 0.4, 0.6),
score_sd=c(0.1, 0.1, 0.2))

# country score_mean score_sd
# 1 a 0.5 0.1
# 2 b 0.4 0.1
# 3 c 0.6 0.2

我可以使用 sapply() 和自定义函数来使用 score_mean 和 score_sd 参数从正态分布中随机抽取:

score.simulate <- function(score.mean, score.sd) {
return(mean(rnorm(100, mean=score.mean, sd=score.sd)))
}

simulated.scores <- sapply(example.data$score_mean,
FUN=score.simulate,
score.sd=example.data$score_sd)

# [1] 0.4936432 0.3753853 0.6267956

这将生成一轮(或一列)模拟值。但是,我想生成很多列(例如 100 或 1,000)。我发现这样做的唯一方法是将我的 sapply() 函数包装在 lapply() 内的通用函数中,然后将结果列表转换为数据框在 plyr 中使用 ldply():

results.list <- lapply(1:5, FUN=function(x) sapply(example.data$score_mean, FUN=score.simulate, score.sd=example.data$score_sd))

library(plyr)
simulated.scores <- as.data.frame(t(ldply(results.list)))

# V1 V2 V3 V4 V5
# V1 0.5047807 0.4902808 0.4857900 0.5008957 0.4993375
# V2 0.3996402 0.4128029 0.3875678 0.4044486 0.3982045
# V3 0.6017469 0.6055446 0.6058766 0.5894703 0.5960403

这行得通,但是 (1) 它看起来真的很复杂,尤其是 as.data.frame(t(ldply(lapply(... FUN=function(x) sapply ...)))) 方法,(2) 当使用大量迭代或更大的数据时它真的很慢——我的实际数据集有 3,000 行,运行 1,000 次迭代需要 1-2 分钟。

有没有更有效的方法来创建像这样的模拟值数据框?

最佳答案

我能想到的最快方法是利用 rnorm 内置的矢量化。 meansd 参数都是矢量化的,但是您只能为绘制次数提供一个整数。如果您为 meansd 参数提供向量,R 将循环遍历它们,直到完成所需的绘制次数。因此,只需将 rnorm 的参数 n 设置为 mean 向量长度的倍数。乘数将是 data.frame 每一行的重复次数。在下面的函数中,这是 n

我想不出比单独使用 base::rnorm 更重要的方法。

工作示例


#example data
df <- data.frame(country=c("a", "b", "c"),
mean=c(1, 10, 100),
sd=c(1, 2, 10))

#function which returns a matrix, and takes column vectors as arguments for mean and sd
normv <- function( n , mean , sd ){
out <- rnorm( n*length(mean) , mean = mean , sd = sd )
return( matrix( out , , ncol = n , byrow = FALSE ) )
}

#reproducible result (note order of magnitude of rows and input sample data)
set.seed(1)
normv( 5 , df$mean , df$sd )
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0.3735462 2.595281 1.487429 0.6946116 0.3787594
#[2,] 10.3672866 10.659016 11.476649 13.0235623 5.5706002
#[3,] 91.6437139 91.795316 105.757814 103.8984324 111.2493092

关于r - 如何有效地生成模拟值的数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23256694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com