【问题标题】:How to call a vector of seeds in a loop, save the results next to eachother each time the loop runs?如何在循环中调用种子向量,每次循环运行时将结果保存在彼此旁边?
【发布时间】:2021-07-31 20:11:00
【问题描述】:

我有两个问题:

  1. 我正在做一个模拟,我编写了必要的函数,并且我正在使用以下代码在循环中生成我需要的内容:
sim_seeds<- as.vector(sample(1:30000, 5, replace = FALSE), mode = "numeric")
save(sim_seeds,file = "~/Desktop/untitled folder/sim_seeds.Rda")
load(file = "~/Desktop/untitled folder/sim_seeds.Rda")

for (i in 1:5) {

load(file = "~/Desktop/untitled folder/sim_seeds.Rda")

seeds=set.seed(sim_seeds[i])

#Generating data using functions had been wrote before

data<-generate_data(seed =seeds )

Y_1<- mean(data$Y)

#estimation

weights<-generate_weights(T1=S1~Year+growth, T2=R1~Age+Sex+HIV, data=data)
w<-weights$w
g<-g_est(data=data)
p1<-g$p1
Q<-Q_est(data=data,w , p1)
mu1_Q<-Q$mu1


#Results
results <- rbind(seeds,Y_1,mu1_Q)
results
}

我的问题是关于种子的!我想要做的是生成 5 个不同的数据集,但是每次“for”运行时我都需要一个单独的种子,所以我想创建一个种子向量,然后在每次循环运行时调用第 i 个值,但是当我想在循环中调用它时,它会给出一个 NULL 值!

  1. 其他问题是,我希望将最终结果保存并彼此相邻打印,以便我可以比较它们。所以说简单点,我在生成5个不同的数据集,所以我在“结果”中确定了5行元素!

有人知道吗?

【问题讨论】:

  • 我不认为你需要为每个循环迭代生成一个新的种子来获得不同的结果。脚本开头的 set.seed(123) 足以获得不同的结果(但每次重新运行脚本时结果相同)
  • @glagla 主管的命令!她说你不应该在每次运行循环时都为种子分配相似的数字。
  • 我认为当您在循环开始时使用相同的种子值执行 set.seed 时会出现问题。在这种情况下,它会重新初始化随机生成器并生成相同的数字。不要这样做:for (I in 1:5) {set.seed(1); generate_something},但是做 set.seed(1) 然后循环就好了

标签: r loops statistics simulation random-seed


【解决方案1】:

1.:在开始时设置一个种子就足以在每次循环迭代时获得不同的结果。编辑用下面的例子来说明它

2.:例如:

set.seed(123)
seeds = 1:5
results = c()
for (i in 1:5){
  set.seed(1) #this is wrong, produces the same set of values at each loop iteration
  # set.seed(seeds[i]) # works, but is unecessary, setting one seed at the beginning is ok
  # commenting the two lines above is fine, and will generate 5 different vectors of random numbers. 
  x = rnorm(5,0,1)
  results = rbind(results, x)
}
results

【讨论】:

  • 感谢 glagla,但我被要求不要为种子分配相似的编号,每次循环运行时,它必须是不同的编号。
  • @Aura:我编辑了帖子,可以看到不同选项的效果
  • 我试过你刚才的建议,每次种子的值都一样!我是 R 的新手,但我想能够创建 1 到 3000 之间的随机数与种子 = 1:5 不同?还是不行?
  • 是的,如果您运行 set.seed(1),它会保持相同的值。如果您注释它并取消注释以下行,它将不会生成相同的值。如果你评论这两行,它也应该做你想做的事。生成种子的方式在这里不是很重要
  • 通过评论你的意思是在 set.seed(123) 之前放一个 # 然后运行 ​​seed=1:5 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-01-03
  • 2021-08-22
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多