как пропустить и разорвать петлю в R - PullRequest
0 голосов
/ 24 марта 2012

Я пытаюсь написать функцию, которая генерирует смоделированные данные, но если смоделированные данные не удовлетворяют условию, мне нужно пропустить их, и если они удовлетворяют условию, я применю сводку функции.

Я хотел бы зациклить его, пока не найду 10 действительных наборов данных, а затем остановлюсь. (Я действительно должен сделать это, пока он не достигнет 10000). Вот код Код вроде работает, но не останавливается. Я думаю, что я, вероятно, поместил функцию next и break в неправильном месте. Я надеюсь, что кто-то может помочь мне написать это вместе.

Другой способ, которым я мог бы подойти к этому, - сначала сгенерировать все действительные данные, а затем применить функцию 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)            

Ответы [ 2 ]

1 голос
/ 25 марта 2012

Спасибо за вашу помощь.Я смог написать функцию без использования функции перерыва!Я разместил это здесь на случай, если другие люди могут найти это полезным.

    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)) }
0 голосов
/ 24 марта 2012

Поскольку ваш код не может быть воспроизведен, я не могу полностью протестировать и отладить ваш код, но я думаю, что он выглядит так, как если бы я не мог выполнять репликацию с помощью функции MLE. Это примерно как я бы настроил. Но ознакомьтесь с документацией / Google о разрыве, затем, о циклах / while, связанных с R, при тестировании вашего кода.

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

  }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...