2010-06-03 4 views
5

nls을 사용하여 일부 기하 급수적 인 데이터에 적합합니다.R :`nls`에서 오류 잡기

내가 사용하는 코드는 다음과 같습니다

fit <- nls(y ~ expFit(times, A, tau, C), start = c(A=100, tau=-3, C=0)) 

expFit

expFit <- function(t, A, tau, C) 
    { 
    expFit <- A*(exp(-t/tau))+C 
    } 

이 시작 매개 변수를 제공하는 내 데이터의 대부분 잘 작동 ((100)으로 정의된다, -3 및 0) 잘 작동합니다. 그러나 때때로 이러한 매개 변수를 사용하지 못하는 데이터가 있는데 nls (예 : '단수 그라디언트'또는 이와 유사한 것)에서 오류가 발생합니다. 이러한 오류를 "catch"하는 방법은 무엇입니까? ...

어떤 아이디어를

나는

fit <- NULL 
fit <- nls(...) 

if (is.null(fit)) 
    { 
    // Try nls with other starting parameters 
    } 

그런 짓을하려고하지만 nls가 실행 및 실행되지 않습니다 nls 후 코드를 중지하는 것 때문에이 작동하지 않습니다?

덕분에 나는 보통이 트릭을 사용

답변

10

니코 :

params<-... # setup default params. 

while(TRUE){ 

fit<-NULL 
try(fit<-nls(...)); # does not stop in the case of error 

if(!is.null(fit))break; # if nls works, then quit from the loop 

params<-... # change the params for nls 

} 
+0

좋아! 그게 바로 내가 필요로하는 것입니다! 'silent = "TRUE"매개 변수를 추가하기 때문에 오류가 출력되지 않습니다. – nico

+0

@ kohske 답변 논리가 합리적입니다. 'try' 명령에 대해 아는 것이 유용하지만, 네 번째 줄에 nls 전화가 올 것이라고 예상하고 거기에 나타나는 nul 함수에 익숙하지 않습니다. 빠른 검색은 NUL이 무엇을하는지 찾지 못했습니다. 이 점에 대해 더 자세히 알 수있는 힌트가 있습니까? 어쩌면 어떤 패키지가 필요한지 모르겠습니다. –

+0

@JasonWhyte 그건 그냥 오타입니다. 나는''try (fit <- nls (...)) '를 의미하고'nls'가 오류를 유발할 때 fit은 NULL이 될 것이다. – kohske