2010-06-03 27 views
5

Tôi đang lắp một số dữ liệu theo hàm mũ bằng cách sử dụng nls.R: bắt lỗi trong `nls`

Mã Tôi đang sử dụng là:

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

expFit được định nghĩa là

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

này hoạt động tốt cho hầu hết các dữ liệu của tôi, mà các thông số bắt đầu được cung cấp (100, -3 và 0) hoạt động tốt. Đôi khi, mặc dù, tôi có dữ liệu không hoạt động tốt với các thông số đó và tôi gặp lỗi từ nls (ví dụ: "số ít" hoặc những thứ tương tự). Làm thế nào để "bắt" các lỗi này?

tôi đã cố gắng để làm một cái gì đó giống như

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

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

Nhưng điều này sẽ không làm việc vì nls dường như dừng lại việc thực hiện và các mã sau nls sẽ không thực hiện ...

Bất kỳ ý tưởng?

Cảm ơn nico

Trả lời

10

Tôi thường sử dụng thủ thuật này:

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

Tuyệt vời! Đó chính xác là những gì tôi cần! Tôi vừa thêm tham số 'im lặng =" TRUE "' để thử, vì vậy tôi không bị lỗi in ra. – nico

+0

@kohske Logic của câu trả lời của bạn có ý nghĩa. Nó rất hữu ích để biết về lệnh 'try' nhưng tôi đã mong đợi một cuộc gọi nls trên dòng bốn của bài viết của bạn và không quen thuộc với hàm nul xuất hiện ở đó. Một tìm kiếm nhanh ở đây đã không giúp tôi tìm ra những gì nul làm. Bạn có bất kỳ gợi ý nào về nơi để tìm hiểu thêm về điều này không? Có lẽ tôi không biết tôi nên yêu cầu gói nào? –

+0

@ JasonWhyte Đó chỉ là lỗi đánh máy. Tôi có nghĩa là 'try (fit <- nls (...))' và fit sẽ là NULL khi 'nls' gây ra lỗi. – kohske

Các vấn đề liên quan