我需要生成审查百分比不能为 0 或 1 的模拟数据。这就是我使用 while 循环的原因。问题是如果我将计数增加到 10,000(而不是 5),程序会非常慢。我必须用 400 种不同的场景重复这个,所以它非常慢。我试图找出可以将我的代码逐个矢量化的地方。我怎样才能避免while循环并且仍然能够保持条件?
另一种方法是保留 while 循环并生成符合我的条件的 10,000 个数据集的列表,然后将该函数应用于列表。这里我以汇总函数为例,但我的实际函数同时使用 X_after 和 delta(即 mle(X_after,delta))。如果我必须使用 while 循环,这是一个更好的选择吗?
我担心的另一个问题是内存问题。在进行如此大的模拟时如何避免耗尽内存?
mu=1 ; sigma=3 ; n=10 ; p=0.10
dset <- function (mu,sigma, n, p) {
Mean <- array()
Median <- array()
Pct_cens_array <- array()
count = 0
while(count < 5) {
lod <- quantile(rlnorm(100000, log(mu), log(sigma)), p = p)
X_before <- rlnorm(n, log(mu), log(sigma))
X_after <- ifelse(X_before <= lod, lod, X_before)
delta <- ifelse(X_before <= lod, 1, 0)
pct_cens <- sum(delta)/length(delta)
# print(pct_cens)
if (pct_cens == 0 | pct_cens == 1 ) next
else {
count <- count +1
if (pct_cens > 0 & pct_cens < 1) {
sumStats <- summary(X_after)
Median[count] <- sumStats[3]
Mean [count]<- sumStats[4]
Pct_cens_array [count] <- pct_cens
print(list(pct_cens=pct_cens,X_after=X_after, delta=delta, Median=Median,Mean=Mean,Pct_cens_array=Pct_cens_array))
}
}
}
return(data.frame(Pct_cens_array=Pct_cens_array, Mean=Mean, Median=Median))
}