gpt4 book ai didi

r - R中的载体结合

转载 作者:行者123 更新时间:2023-12-04 17:28:15 24 4
gpt4 key购买 nike

我想实现一个模拟程序,它需要以下结构:

它有一个for循环,程序会在每次迭代中生成一个向量。我需要将每个生成的向量附加到现有向量。

我不知道如何在 R 中执行此操作。感谢您的帮助。

最佳答案

这些答案有效,但它们都需要调用非确定性函数,如 sample()在循环。这不是循环不变的代码(每次都是随机的),但它仍然可以移出 for环形。诀窍是使用 n参数并预先生成您需要的所有随机数(如果您的问题允许这样做;有些可能不会,但很多会这样做)。现在您调用一个电话而不是 n电话,如果您的 n很大。这是一个简单的随机游走示例(但许多问题可以这样表述)。另外,完全披露:我今天没有喝咖啡,所以如果你看到错误请指出:-)

steps <- 30
n <- 100
directions <- c(-1, 1)

results <- vector('list', n)

for (i in seq_len(n)) {
walk <- numeric(steps)
for (s in seq_len(steps)) {
walk[s] <- sample(directions, 1)
}
results[[i]] <- sum(walk)
}

我们可以通过调用 sample() 来重写它。 :
all.steps <- sample(directions, n*steps, replace=TRUE)
dim(all.steps) <- c(n, steps)
walks <- apply(all.steps, 1, sum)

速度增加证明(n=10000):
> system.time({
+ for (i in seq_len(n)) {
+ walk <- numeric(steps)
+ for (s in seq_len(steps)) {
+ walk[s] <- sample(directions, 1)
+ }
+ results[[i]] <- sum(walk)
+ }})
user system elapsed
4.231 0.332 4.758

> system.time({
+ all.steps <- sample(directions, n*steps, replace=TRUE)
+ dim(all.steps) <- c(n, steps)
+ walks <- apply(all.steps, 1, sum)
+ })
user system elapsed
0.010 0.001 0.012

如果您的模拟每次模拟函数调用只需要一个随机变量,请使用 sapply() ,或者更好的是 multicore包的 mclapply() .革命分析的 foreach包在这里也可能有用。此外,JD Long 有一个很棒的演示文稿和帖子,内容是通过 Amazon 的 EMR here 在 Hadoop 上模拟 R 中的内容。 (我找不到视频,但我相信有人会知道)。

带回家点:
  • 预分配 numeric(n)vector('list', n)
  • 将不变代码推出 for循环。使用其n 巧妙地将随机函数从代码中推出。争论。
  • 努力争取sapply()lapply() ,或者更好mclapply .
  • 不要使用 x <- c(x, rnorm(100)) .每次你这样做,R-core 的成员都会杀死一只小狗。
  • 关于r - R中的载体结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595459/

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