【问题标题】:Sampling Nested For Loop采样嵌套 For 循环
【发布时间】:2021-02-25 02:39:56
【问题描述】:

我的循环知识非常少,但我目前编写了一个循环,它从三个向量(small.dens、med.dens 和 large.dens)中获取值,每个向量有 17 个值。我有循环设置来随机选择 2 个值,然后是 3,然后是 4... 一直到 17。使用这些值,它计算平均值和标准误差(使用 plotrix 包)。然后,它将这些计算的平均值和标准误差放入新的向量(small.density、small.stanerr、medium.density、medium.stanerr、large.density 和 large.stanerr)中。接下来,与循环分开,我将这些向量组合成一个数据框。

library(plotrix)

small.density = rep(NA,16)
small.stanerr = rep(NA,16)
medium.density = rep(NA,16)
medium.stanerr = rep(NA,16)
large.density = rep(NA,16)
large.stanerr = rep(NA,16)

for(i in 2:17){
  xx=sample(small.dens,i,replace=TRUE)
  small.density[[i]] = mean(xx)
  small.stanerr[[i]] = std.error(xx)
  yy = sample(med.dens, i, replace=TRUE)
  medium.density[[i]] = mean(yy)
  medium.stanerr[[i]] = std.error(yy)
  zz = sample(large.dens, i, replace=TRUE)
  large.density[[i]] = mean(zz)
  large.stanerr[[i]] = std.error(zz)
}

然后我想运行这个循环 100 次,如果有意义的话,最终取平均值。例如,我希望它选择 2,3,4...17 个值 100 次,每次取平均值和标准误差,然后取所有 100 次的平均值。这有意义吗?我会再做一个 for 循环,把它变成一个嵌套循环吗? 我该怎么做呢? 谢谢!

【问题讨论】:

  • 这些只是空白向量,其中存放了新的计算平均值和标准误差。采样的向量标题为 small.dens、med.dens 和 large.dens
  • 我明白了。那么std.error是什么?你的意思是sd? @jake3759
  • 这只是一个计算标准误差的函数。它在 plotrix 包中。抱歉没有澄清!才意识到我没有记下那个包名

标签: r loops nested sample


【解决方案1】:

还有其他方法可以实现您想要的,但是如果您不想更改代码,那么只需将其包装在这样的东西中

res <- do.call(rbind, lapply(1:100, function(x) {
  within(data.frame(
    n = x, 
    size = 2:17, 
    small.density = rep(NA,16), 
    small.stanerr = rep(NA,16), 
    medium.density = rep(NA,16), 
    medium.stanerr = rep(NA,16), 
    large.density = rep(NA,16), 
    large.stanerr = rep(NA,16)
  ), {
    for(i in 2:17){
      xx = sample(small.dens,i,replace=TRUE)
      small.density[[i - 1L]] = mean(xx)
      small.stanerr[[i - 1L]] = std.error(xx)
      yy = sample(med.dens, i, replace=TRUE)
      medium.density[[i - 1L]] = mean(yy)
      medium.stanerr[[i - 1L]] = std.error(yy)
      zz = sample(large.dens, i, replace=TRUE)
      large.density[[i - 1L]] = mean(zz)
      large.stanerr[[i - 1L]] = std.error(zz)
    }
    rm(xx, yy, zz, i)
  })
}))

res 看起来像这样

> head(res, 20)
   n size small.density small.stanerr medium.density medium.stanerr large.density large.stanerr
1  1    2   -0.04716195    0.35754422     13.1014925       4.374055    -42.089591      30.87786
2  1    3   -0.15893367    0.34557922     -0.2680632       6.206081     52.984076      36.85058
3  1    4    0.10013995    0.62374467     -0.1944930       5.784211   -112.684774      30.50707
4  1    5    0.40654132    0.40815013      1.6096970       5.026714     45.810098      46.58469
5  1    6    0.13310242    0.32104512     -6.9989844       4.232091    -22.312165      48.14705
6  1    7    0.21283027    0.53633472     -5.0702365       3.829677    -43.266482      41.74286
7  1    8    0.13870439    0.27161346      4.1629469       3.214053     -9.045643      48.49930
8  1    9    0.06495734    0.36738163      3.9742069       3.540913    -43.954345      38.23816
9  1   10   -0.01882762    0.37570468     -3.1764203       3.740403    -43.156792      38.47531
10 1   11   -0.02115580    0.26239465     -2.2026077       2.702412      7.343837      30.58314
11 1   12    0.09967753    0.27360125      3.9603382       3.214921    -13.461632      29.39910
12 1   13    0.53121414    0.27561862      4.3593802       1.872685    -38.572491      25.37029
13 1   14    0.21547909    0.36345292     -0.3377787       2.732968     17.305232      26.08317
14 1   15    0.33957964    0.23029520      0.4832063       2.886160      8.145410      18.23901
15 1   16    0.26871985    0.26846012     -6.7634873       3.436742     -4.011269      20.33814
16 1   17    0.24927792    0.20534048     -0.7481315       1.899348      9.993280      24.49623
17 2    2   -1.10840346    0.07123407     -3.4317644       6.966096    -30.384945     121.00972
18 2    3    1.73947551    0.35986535     -2.1415966       5.628115    -57.857871      10.47413
19 2    4    0.40033834    0.41963615     -4.2156733       1.206414     27.891021      13.84453
20 2    5   -0.08704736    0.52872770      0.3137693       2.974888     -3.100414      57.89126

如果您想计算每个size 的 100 个模拟值的平均值,那么只需

aggregate(. ~ size, res[-1L], mean)

给你

   size small.density small.stanerr medium.density medium.stanerr large.density large.stanerr
1     2    0.02872578     0.6341294      1.0938287       5.518797      3.141204      53.20675
2     3    0.16985732     0.5388110     -0.1627867       5.185643     -6.660756      49.83607
3     4    0.20543404     0.4815581      0.1385016       4.519419     -8.093673      46.64984
4     5    0.13019280     0.4546794      0.1299331       4.166335    -10.300542      41.40444
5     6    0.10675158     0.4307113      0.2191516       4.033863    -12.068151      38.95312
6     7    0.19326831     0.3834507      0.8784275       3.513812     -6.920378      36.17856
7     8    0.09020638     0.3580780      0.4388388       3.443349     -5.335405      30.49615
8     9    0.13956838     0.3558005      0.3740251       3.313501    -15.290834      31.64833
9    10    0.18368962     0.3397191      0.4600761       3.051425     -5.505220      29.46165
10   11    0.20653866     0.3116104      0.9913534       2.804659     -8.809398      28.79097
11   12    0.14653661     0.2988422      0.3337274       2.624418     -5.128882      26.78074
12   13    0.12255652     0.2864998      0.2085829       2.719396    -11.548064      27.08497
13   14    0.13102809     0.2830709      0.6448798       2.586491     -4.676053      25.21800
14   15    0.14536840     0.2749606      0.3415879       2.522826    -11.968496      24.44427
15   16    0.14871831     0.2571571      0.2218365       2.463486    -10.335511      23.64304
16   17    0.13664397     0.2461108      0.3387764       2.348594     -9.969407      22.84736

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2021-07-08
    • 2012-06-27
    • 2016-05-07
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多