2012-12-19 8 views
1

nls을 사용하여 플롯에 가장 잘 맞는 몇 줄을 추가하는 기본 함수를 작성하려고합니다. 데이터가 정확히 nls에 전달 된 수식으로 정확하게 정의되지 않는 한이 방법을 사용하면 문제가 없습니다. 나는이 문제를 알고 있고 이것이 문서화 된 행동 인 as reported here임을 알고 있습니다.nls 가장 적합한 라인 - 선의 플로팅을 강제하는 방법?

내 질문에 비록 내가 어떻게이 주위를 얻을 수 있고 모델에 의해 설명되는 데이터에 관계없이 플롯 할 수있는 최상의 맞게 줄을 강제로 수 있습니까? 데이터 일치를 정확하게 감지하고 완벽하게 맞는 곡선을 그릴 수있는 방법이 있습니까? 오류와 함께 실패

#test data 
x <- 1:10 
y <- x^2 
plot(x, y, pch=20) 

# polynomial line of best fit 
f <- function(x,a,b,d) {(a*x^2) + (b*x) + d} 
fit <- nls(y ~ f(x,a,b,d), start = c(a=1, b=1, d=1)) 
co <- coef(fit) 
curve(f(x, a=co[1], b=co[2], d=co[3]), add = TRUE, col="red", lwd=2) 

: 나의 현재 사기 솔루션입니다 제가 적용

Error in nls(y ~ f(x, a, b, d), start = c(a = 1, b = 1, d = 1)) : 
    singular gradient 

쉬운 수정이 약간 jitter 데이터에이지만,이 조금 파괴적이고 hackish 보인다.

# the above code works after doing... 
y <- jitter(x^2) 

더 좋은 방법이 있습니까?

+0

현실 세계에서는 모두 이와 같은 상황이 발생하지 않습니다. 항상 측정 오류가 있습니다. R 시험을 치고 완벽한 데이터 세트를 학생들에게 제공하는 선생님이 아니라면 :-). –

+0

@CarlWitthoft n이 작 으면 CSV 형식으로 Excel에서 내 보낸 데이터로 이러한 종류의 문제가 발생했습니다 (따라서 가시 숫자로 반올림 됨). – Roland

+0

@Roland 테스트 데이터를 부적절하게 반올림하면 (예 : 유효한 시그마가 손실되는 경우), 다음과 같이 대가를 치를 것입니다. –

답변

6

Use Levenberg-Marquardt.

x <- 1:10 
y <- x^2 

f <- function(x,a,b,d) {(a*x^2) + (b*x) + d} 
fit <- nls(y ~ f(x,a,b,d), start = c(a=1, b=0, d=0)) 

Error in nls(y ~ f(x, a, b, d), start = c(a = 1, b = 0, d = 0)) : 
    number of iterations exceeded maximum of 50 

library(minpack.lm) 
fit <- nlsLM(y ~ f(x,a,b,d), start = c(a=1, b=0, d=0)) 
summary(fit) 

Formula: y ~ f(x, a, b, d) 

Parameters: 
    Estimate Std. Error t value Pr(>|t|)  
a  1   0  Inf <2e-16 *** 
b  0   0  NA  NA  
d  0   0  NA  NA  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0 on 7 degrees of freedom 

Number of iterations to convergence: 1 
Achieved convergence tolerance: 1.49e-08 

시작 값을 조정해야하므로 결과 값은 시작 값에 민감합니다.

fit <- nlsLM(y ~ f(x,a,b,d), start = c(a=1, b=0.1, d=0.1)) 

Parameters: 
    Estimate Std. Error t value Pr(>|t|)  
a 1.000e+00 2.083e-09 4.800e+08 < 2e-16 *** 
b -7.693e-08 1.491e-08 -5.160e+00 0.00131 ** 
d 1.450e-07 1.412e-08 1.027e+01 1.8e-05 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 6.191e-08 on 7 degrees of freedom 

Number of iterations to convergence: 3 
Achieved convergence tolerance: 1.49e-08