修改引导

问题描述:

我有兴趣开发一个修改后的引导程序,用取代的方式对一些长度为x的向量进行采样,但在停止采样之前必须满足许多条件。我试图计算一个种群增长率的lambda的置信区间,10000次迭代,但在一些个体的群体中,比如向量13,只有很少的个体长出群体。典型的自举会导致相当数量的情况,在这种情况下,这种向量的增长不会发生,因此模型会分崩离析。每个矢量由一定数量的1,2和3组成,其中1代表一个组中的一个,2代表一个组中的2个,以及3个死亡。以下是我迄今为止没有改变,很可能不是最好的方法时明智的,但我是新来的R.修改引导

st13 <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 
      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3) 
#runs 
n <- 10000 
stage <- st13 
stagestay <- vector() 
stagemoved <- vector() 
stagedead <- vector() 
for(i in 1:n){ 
     index <- sample(stage, replace=T) 
     stay <- ((length(index[index==1]))/(length(index))) 
     moved <- ((length(index[index==2]))/(length(index))) 
     stagestay <- rbind(stagestay,stay) 
     stagemoved <- rbind(stagemoved,moved) 
} 

目前,该样品 我的问题则是:以什么方式我可以修改样本函数以继续对这些数字进行采样,直到“索引”的长度至少与st13相同,并且直到“索引”中存在至少一个2的实例为止?

非常感谢, Kristopher密西西比州牛津 ,MS的亨尼格 硕士研究生 大学,38677

+0

的至少lenght我有点困惑。这是你想要修改的行:'index 1的向量? – 2011-04-01 15:55:26

更新: 从@lselzer答案提醒我,要求是样品的长度至少只要st13。我上面的代码只是继续采样,直到找到包含2的引导样本。 @lselzer的代码一次只生成一个新的索引,直到样本包含2。这是非常低效的,因为您可能必须多次拨打sample(),直到您获得2。在样本中返回2之前,我的代码可能会重复很长时间。我们可以做得更好吗?

一种方法是使用一次调用sample()来替换大样本。检查哪些是2 s,并查看第一个length(st13)条目中是否有2。如果有,则返回这些条目,如果不是,则找到大样本中的第一个2,并将所有条目返回到包含该条目的条目。如果没有2,请添加另一个大样本并重复。下面是一些代码:

#runs 
n <- 100 #00 
stage <- st13 
stagedead <- stagemoved <- stagestay <- Size <- vector() 
sampSize <- 100 * (len <- length(stage)) ## sample size to try 
for(i in seq_len(n)){ 
    ## take a large sample 
    samp <- sample(stage, size = sampSize, replace = TRUE) 
    ## check if there are any `2`s and which they are 
    ## and if no 2s expand the sample 
    while(length((twos <- which(samp == 2))) < 1) { 
     samp <- c(samp, sample(stage, size = sampSize, replace = TRUE)) 
    } 
    ## now we have a sample containing at least one 2 
    ## so set index to the required set of elements 
    if((min.two <- min(twos)) <= len) { 
     index <- samp[seq_len(len)] 
    } else { 
     index <- samp[seq_len(min.two)] 
    } 
    stay <- length(index[index==1])/length(index) 
    moved <- length(index[index==2])/length(index) 
    stagestay[i] <- stay 
    stagemoved[i] <- moved 
    Size[i] <- length(index) 
} 

这里是一个真正的退化向量只有一个单一的2 46项:

R> st14 <- sample(c(rep(1, 45), 2)) 
R> st14 
[1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
[39] 1 1 1 1 1 1 1 1 

如果我使用上述循环就可以了,而不是st13,我得到以下为最小样本所需的大小来获得在每个100次的2

R> Size 
    [1] 65 46 46 46 75 46 46 57 46 106 46 46 46 66 46 46 46 46 
[19] 46 46 46 46 46 279 52 46 63 70 46 46 90 107 46 46 46 87 
[37] 130 46 46 46 46 46 46 60 46 167 46 46 46 71 77 46 46 84 
[55] 58 90 112 52 46 53 85 46 59 302 108 46 46 46 46 46 174 46 
[73] 165 103 46 110 46 80 46 166 46 46 46 65 46 46 46 286 71 46 
[91] 131 61 46 46 141 46 46 53 47 83 

因此,这将表明sampSize我选择(100 * length(stage))在这里有点矫枉过正,但是由于我们所用的所有操作符都是矢量化的,所以我们可能不会因为过长的初始样本大小而受到很大的惩罚,并且我们当然不会招致任何额外的sample()调用。


原文: 如果我理解正确的话,问题是sample()可能不会返回任何2 indicies可言。如果是这样,我们可以继续采样,直到它使用repeat控制流构造。

我已经相应地改变了你的代码,并对它进行了优化,因为你永远不会像在做循环一样增长对象。还有其他方法可以改进,但我现在坚持循环。下面的解释。

st13 <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 
      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3) 
#runs 
n <- 10000 
stage <- st13 
stagedead <- stagemoved <- stagestay <- vector() 
for(i in seq_len(n)){ 
    repeat { 
     index <- sample(stage, replace = TRUE) 
     if(any(index == 2)) { 
      break 
     } 
    } 
    stay <- length(index[index==1])/length(index) 
    moved <- length(index[index==2])/length(index) 
    stagestay[i] <- stay 
    stagemoved[i] <- moved 
} 

这是关系到你的Q上的主要变化:

repeat { 
     index <- sample(stage, replace = TRUE) 
     if(any(index == 2)) { 
      break 
     } 
    } 

这样做是重复包含在括号直到break代码被触发跳我们走出repeat循环。那么会发生什么情况是我们采用自举样本,然后检查是否有任何样本包含索引2。如果有任何2那么我们就会发生并继续进行循环迭代的剩余电流。如果样本不包含任何2 s,则不会触发中断,并且我们再次绕过另一个样本。这会发生,直到我们得到一个2的样本。

+1

为什么使用isTRUE? – 2011-04-01 16:22:16

+0

@lselzer的习惯 - 当然这里没有必要,但是我早些时候正在用'all.equal()'做一些事情,那么你需要在'isTRUE()'中包装,所以我认为手指继续自动驾驶。将删除,谢谢。 – 2011-04-01 16:24:31

对于初学者,sample有一个size参数,您可以使用它来匹配st13的长度。您的问题的第二部分可以通过使用while循环来解决。

st13 <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 
      1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3) 
    #runs 
    n <- 10000 
    stage <- st13 
    stagestay <- vector() 
    stagemoved <- vector() 
    stagedead <- vector() 
    for(i in 1:n){ 
      index <- sample(stage, length(stage), replace=T) 
      while(!any(index == 2)) { 
      index <- c(index, sample(stage, 1, replace = T)) 
      } 
      stay <- ((length(index[index==1]))/(length(index))) 
      moved <- ((length(index[index==2]))/(length(index))) 
      stagestay[i] <- stay 
      stagemoved[i] <- moved 
    } 

当我在写这个贴加文他的回答是与我相似,但我添加了大小参数,以确保指数具有ST13

+0

'大小'位是*不*必需的。 'sample'具有'For'样本','size'的默认值是从第一个参数推断出的项目数量,所以'sample(x)'会生成'x'(或'1 :x')'所以我们根本不需要设置'size',它是从'stage'的长度推断出来的。 – 2011-04-01 16:32:06

+0

@Gavin是的,但OP表示索引至少应该是'length(st13)',他想知道如何继续采样直到找到'2'。所以我推测这个指数可能比st13更大,但不会更小。现在我更仔细地阅读了你的代码,并且我发现它在每个重复循环中都会替换索引,所以'length(index)== length(st13)'每次都是。 – 2011-04-01 16:51:13

+0

这是正确的。指数可以大于长度(st13),并且在这些情况下,当两个不出现时,如需要报废样本并重新洗牌,直到我收到2会超出我计算的值。感谢帮助和评论。很有帮助。 – mycelial 2011-04-01 16:58:14