打ち切り率を0または1にできないシミュレーションデータを生成する必要があります。そのため、whileループを使用します。問題は、カウントを(5ではなく)10,000に増やすと、プログラムが非常に遅くなることです。400の異なるシナリオでこれを繰り返さなければならないので、非常に遅くなります。コードを1つずつベクトル化できる場所を見つけようとしています。whileループを回避し、状態を維持するにはどうすればよいですか?
もう1つのアプローチは、whileループを維持し、基準を満たす10,000個のデータセットのリストを生成してから、その関数をリストに適用することです。ここでは例としてsummary関数を使用していますが、実際の関数はX_afterとdeltaの両方を使用しています(つまり、mle(X_after、delta))。whileループを使用する必要がある場合、これはより良いオプションですか?
私が抱えているもう1つの懸念は、メモリの問題です。このような大規模なシミュレーションを実行しているときにメモリを使い果たすのを防ぐにはどうすればよいですか?
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))
}