我正在尝试编写一个生成模拟数据的函数,但如果模拟数据不符合条件,我需要跳过它,如果它符合条件,那么我将应用函数摘要。
我想循环它,直到找到10个有效数据集,然后停止。 (我实际上必须这样做,直到它达到10000)。这是代码。除了它之外的代码排序不会停止。我想我可能把下一个和破坏功能放在了错误的地方。我希望有人能帮助我一起写这篇文章。
我可以采用的另一种方法是先生成所有有效数据,然后将函数find_MLE(summary)应用到最终列表中。
编辑:我在内心重复。我编辑代码使其可重现。代码仍然会生成数据并且不会中断。
这是一个可重复的版本
validData <- function(GM, GSD,sampleSize, p) {
count=0
for (i in 1:n) {
repeat {
lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p)
X_before <- rlnorm(sampleSize, log(GM), log(GSD))
Xs <- 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 {
sumStats <- summary(Xs)
Med <- sumStats[3]
Ave <- sumStats[4]
}
count<- count+1
if (count == 10) break
}}
return(c(pct_cens, Med, Ave))
}
validData(GM=1,GSD=2,sampleSize=10,p=0.1)
答案 0 :(得分:1)
感谢您的帮助。我能够在不使用break函数的情况下编写函数!我在这里发布了以防其他人可能会发现它有用。
dset <- function (GM, GSD, n, p) {
Mean <- array()
Median <- array()
count = 0
while(count < 10) {
lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p)
X_before <- rlnorm(n, log(GM), log(GSD))
Xs <- 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(Xs)
Median[count] <- sumStats[3]
Mean [count]<- sumStats[4]
print(list(pct_cens=pct_cens,Xs=Xs, delta=delta, Median=Median,Mean=Mean))
}
}
}
return(data.frame( Mean=Mean, Median=Median)) }
答案 1 :(得分:0)
由于您的代码不可复制,我无法完全测试和调试您的代码,但我认为这样看起来就像没有能够使用MLE函数复制一样。这大致是我如何设置它。但是在测试代码时,请查看文档/ Google中断,接下来,与R相关的/ while循环。
validData <- function(GM, GSD,Size, p) {
for (i in 1:20) {
count <- 1
repeat {
lod <- quantile(rlnorm(1000000, log(GM), log(GSD)), p = p)
X_before <- rlnorm(Size, log(GM), log(GSD))
Xs <- ifelse(X_before <= lod, lod, X_before)
delta <- ifelse(X_before <= lod, 1, 0)
pct_cens <- sum(delta)/length(delta)
if (pct_cens == 0 & pct_cens ==1)
function() #your foo goes here
else {
mles <- find_MLE(c(0,0), Xs, delta)
GM_est <- mles[1]
GSD_est <- mles[2]
AM_est <- exp(log(GM_est) + 1 )
SD_est<- sqrt((AM_est)^2*exp(log(GSD_est)^2))
D95th_est <- GM_est*(GSD_est^1.645)
} }
return(c(GM_est,GSD_est,AM_est,SD_est,D95th_est))
count<- count+1
if (count == 10) break
}}
答案 2 :(得分:0)
要基于条件跳至外部循环,只需使用break()
这是一个简单的示例,其中内部循环将尝试运行10次,但通常会遇到阻止它运行的条件
# OUTER LOOP
for(i in 1:2) {
print(paste("Outer loop iteration", i))
# INNER LOOP (will run max 10 times)
for(j in 1:10) {
print(paste("Inner loop iteration", j))
if (runif(1) > 0.4) { # Randomly break the inner loop
print(paste("Breaking inner loop", j))
break()
}
}
}
如果要在出现错误(而不是根据条件)时跳到外部循环 ,请参见here