我正在慢慢构建以下R例程。但我遇到了一些计算问题,我保证如何绕过。
K <- 2 # number of subarrays
N <- 100
Hstar <- 10
perms <- 10000
K1 <- c(1:8)
K2 <- c(9:10)
probs <- c(0.45, 0.45, rep(0.10/8, 8))
specs <- 1:N
pop <- array(dim = c(c(perms, N), K))
haps <- as.character(1:Hstar)
for(j in 1:perms){
for(i in 1:K){
if(i == 1){
pop[j, specs, i] <- sample(haps, size = N, replace = TRUE, prob = probs)
}
else{
pop[j ,, 1] <- sample(haps[K1], size = N, replace = TRUE, prob = probs[K1])
pop[j ,, 2] <- sample(haps[K2], size = N, replace = TRUE, prob = probs[K2])
}
}
}
我想知道是否有办法将我的'haps'变量中的字符标签随机分配给多个子数组(在上面的示例中为K = 2),而不必同时指定K1和K2。
我在考虑使用像
这样的东西split(sample(sample(haps, size = N, replace = TRUE, prob = probs), sample(1:K, size = N, replace = TRUE)
在else()语句中代替pop [j ,, 1]和pop [j ,, 2]。这样,根据每个子数组中出现的标签,我不必在我的else语句中对'haps'和'probs'进行子集化。
我的计划是将我的代码放在一个名为“HAC.sim”的函数中,以便我可以做到
HAC.sim(K, N, Hstar, probs, perms = 10000)
但是在当前的实现中,用户必须进入函数的内部代码才能添加另一个pop [j ,, i]如果他们想要包含2个以上的子数组,这不是很有效,特别是如果有的话是10个或更多的子阵列。
split()是否能够完成我需要的功能?我试过这个方法,但是,我得到错误“pop [j,specs,i]中的错误:矩阵上的下标数量不正确。”当我替换
pop[j ,, 1] <- sample(haps[K1], size = N, replace = TRUE, prob = probs[K1])
pop[j ,, 2] <- sample(haps[K2], size = N, replace = TRUE, prob = probs[K2])
上面的split()代码。
非常感谢任何帮助。如果不清楚,请告诉我。