2012-04-12 3 views
2

일부 함수는 R에서 실행되기 때문에 완료하는 데 오랜 시간이 걸릴 수 있습니다 (10 분에서 4 시간까지). 특히, here에서 찾을 수있는 Rense Nieuwenhuis가 작성한 함수 (forward.lmer())를 사용하고 있습니다. 나는 R이 % 작동을 완료 할 수있는 방법이 있는지 알고 싶습니다. 특히 작업이 1 시간 이상 실행되었을 때 완료까지 얼마나 가까웠는지 알고 싶습니다.함수 실행 중 함수 완료 시간 측정

주어진 기능의 진행 상황을 알 수있는 일반적인 기능이 있습니까? 다음 기능은 완료하는 방법에 가까운에 대해 말해 것

percentComplete() 
forward.lmer(inputs) 

: 그래서 같은 기능이 있다면 내가 이상적으로 알고 싶습니다 무엇 은?

내가 시도 우선 library(time)를 사용하여 다음을 수행 하였다

time<-getTime() 
function(inputs) 
timeReport(time) 

을하지만 그냥 완료시 기능을 완료하는 데 걸린 시간을 알려줍니다. 실행 중일 때 함수가 어떻게 진행되고 있는지 (완료율)를 알 수있는 방법이 있습니까?

이 기능의 효율성을 높이고 싶지만 또 다른 질문입니다. 모두에게 감사드립니다!

+0

R은 (는) 실수를 의미합니까? –

+0

프로그래밍 언어에서와 같이 @BogdanMaier No - R. – Dason

+0

여기 코드가 도움이 될지 모르겠습니다. http://ryouready.wordpress.com/2009/03/16/r-monitor-function-progress-with-a-progress-bar/ –

답변

5

txtProgressBar을 사용하면 진행 과정을 추적 할 수 있습니다.

: 그것부터 시작되는 루프에서의 시간의 건강한 부분을 보낼 수처럼

나는 당신이,하지만 그냥 째려에서 어디로 가야 정확히 알고 참조하는 기능을 충분히 익숙하지 않다, 그것은 본다

# Iteratively updating the model with addition of one block of variable(s) 
# Also: extracting the loglikelihood of each estimated model 
for(j in 1:length(blocks)) 

사용한다면 : 당신이 찾고있는 무엇을 줄 수

pb <- txtProgressBar(style=3) 
for(j in 1:length(blocks)) 
    setTxtProgressBar(pb, j/length(blocks)) 
    ... 
} 
close(pb) 

. 일부 디스플레이는 특정 스타일 진행 막대를 사용하는 경우보다 효과적입니다. 내가 게시 한 코드를 사용하여 출력물이 재미있어 보이면 진행률 표시 줄을 만들 때 다른 스타일을 시도해 보면 더 많은 행운을 누릴 수 있습니다.

R이 일반 함수를 완료하는 데 걸리는 시간을 미리 알 수있는 방법이 없으므로 여기에 일반적인 대답이 없습니다. 다음은 각 루프의 진행 막대와 함께 게시 한 기능입니다.

forward.lmer <- function(
    start.model, blocks, 
    max.iter=1, sig.level=FALSE, 
    zt=FALSE, print.log=TRUE) 
    { 

    # forward.lmer: a function for stepwise regression using lmer mixed effects models 
    # Author: Rense Nieuwenhuis 

    # Initialysing internal variables 
    log.step <- 0 
    log.LL <- log.p <- log.block <- zt.temp <- log.zt <- NA 
    model.basis <- start.model 

    # Maximum number of iterations cannot exceed number of blocks 
    if (max.iter > length(blocks)) max.iter <- length(blocks) 
     pb <- txtProgressBar(style=3) 
     # Setting up the outer loop 
     for(i in 1:max.iter) 
     { 
     #each iteration, update the progress bar. 
     setTxtProgressBar(pb, i/max.iter) 
     models <- list() 

     # Iteratively updating the model with addition of one block of variable(s) 
     # Also: extracting the loglikelihood of each estimated model 
     for(j in 1:length(blocks)) 
     { 
      models[[j]] <- update(model.basis, as.formula(paste(". ~ . + ", blocks[j]))) 
     } 

     LL <- unlist(lapply(models, logLik)) 

     # Ordering the models based on their loglikelihood. 
     # Additional selection criteria apply 
     for (j in order(LL, decreasing=TRUE)) 
     { 

      ############## 
      ############## Selection based on ANOVA-test 
      ############## 

      if(sig.level != FALSE) 
      { 
      if(anova(model.basis, models[[j]])[2,7] < sig.level) 
      { 

       model.basis <- models[[j]] 

       # Writing the logs 
       log.step <- log.step + 1 
       log.block[log.step] <- blocks[j] 
       log.LL[log.step] <- as.numeric(logLik(model.basis)) 
       log.p[log.step] <- anova(model.basis, models[[j]])[2,7] 

       blocks <- blocks[-j] 

       break 
      } 
      } 

      ############## 
      ############## Selection based significance of added variable-block 
      ############## 

      if(zt != FALSE) 
      { 
      b.model <- summary(models[[j]])@coefs 
      diff.par <- setdiff(rownames(b.model), rownames(summary(model.basis)@coefs)) 
      if (length(diff.par)==0) break 
      sig.par <- FALSE 

      for (k in 1:length(diff.par)) 
      { 
       if(abs(b.model[which(rownames(b.model)==diff.par[k]),3]) > zt) 
       { 
       sig.par <- TRUE 
       zt.temp <- b.model[which(rownames(b.model)==diff.par[k]),3] 
       break 
       } 
      } 

      if(sig.par==TRUE) 
      { 
       model.basis <- models[[j]] 

       # Writing the logs 
       log.step <- log.step + 1 
       log.block[log.step] <- blocks[j] 
       log.LL[log.step] <- as.numeric(logLik(model.basis)) 
       log.zt[log.step] <- zt.temp 
       blocks <- blocks[-j] 

       break 
      } 
      } 
     } 
    } 
    close(pb) 

    ## Create and print log 
    log.df <- data.frame(log.step=1:log.step, log.block, log.LL, log.p, log.zt) 
    if(print.log == TRUE) print(log.df, digits=4) 

    ## Return the 'best' fitting model 
    return(model.basis) 
} 
+0

진행률 표시 줄이 있습니다! 함수가 아무 것도 반환하지 않기 때문에 제대로하지 못했을 수도 있습니다. 'pb <- txtProgressBar (style = 3) { setTxtProgressBar (pb,} 닫기 (pd)'(j/length (blocks)) 모델 [[j]] <- 업데이트 (model.basis, as.formula (붙여 넣기 (". ~. 이것은 당신이 당신의 제안이 사용되는 것을 의미합니까? – Jota

+0

그래, 완벽 해 보인다.트릭은 이제 어떤 루프가 시간의 대부분을 차지하는지를 파악하는 것입니다 (함수의 각 루프마다 하나의 진행 막대 만 가질 수는 있겠지만). 내 추측에 따르면, 거기에있는 마지막 루프가 많은 시간을 소비하는 루프이므로, 그 루프 내에서'setProgressBar' 함수를 호출하면 좀 더 의미있는 진행 업데이트가 보일 것이라고 생각합니다. –

+0

잘 모르겠다면, 다음과 같이해볼 수 있습니다 :'print ("Loop 1"); for (i in length (array)) {setProgressBar ...}'그리고 나서 출력을보고 어떤 함수가 CPU주기의 대부분을 차지하고 있는지 확인하십시오. –