修改引导
我有兴趣开发一个修改后的引导程序,用取代的方式对一些长度为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
更新: 从@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
的样本。
为什么使用isTRUE? – 2011-04-01 16:22:16
@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
'大小'位是*不*必需的。 'sample'具有'For'样本','size'的默认值是从第一个参数推断出的项目数量,所以'sample(x)'会生成'x'(或'1 :x')'所以我们根本不需要设置'size',它是从'stage'的长度推断出来的。 – 2011-04-01 16:32:06
@Gavin是的,但OP表示索引至少应该是'length(st13)',他想知道如何继续采样直到找到'2'。所以我推测这个指数可能比st13更大,但不会更小。现在我更仔细地阅读了你的代码,并且我发现它在每个重复循环中都会替换索引,所以'length(index)== length(st13)'每次都是。 – 2011-04-01 16:51:13
这是正确的。指数可以大于长度(st13),并且在这些情况下,当两个不出现时,如需要报废样本并重新洗牌,直到我收到2会超出我计算的值。感谢帮助和评论。很有帮助。 – mycelial 2011-04-01 16:58:14
的至少lenght我有点困惑。这是你想要修改的行:'index 1的向量? – 2011-04-01 15:55:26