R에서 nls 모델에 대한 올바른 시작 값 얻기


13

간단한 전력 법칙 모델을 다음과 같은 데이터 세트에 맞추려고합니다.

mydf:

rev     weeks
17906.4 1
5303.72 2
2700.58 3
1696.77 4
947.53  5
362.03  6

목표는 전력선을 통과시켜 rev향후 몇 주 동안 vlaues 를 예측하는 데 사용하는 것입니다. 많은 연구 결과에 nls따라 다음과 같이 구현되었습니다.

newMod <- nls(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))
predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))

이것은 lm모델에서 작동하지만 singular gradient오류가 발생합니다. 이는 시작 값 a과 관련 이 있음을 이해합니다 b. 나는 Excel에서 이것을 플롯하고 고독을 전달하고 방정식을 얻은 다음 방정식의 값을 사용하기까지 다른 값을 시도했지만 여전히 오류가 발생합니다. 나는 답변과 같은 많은 답변을보고 두 번째 답변을 시도했지만 (첫 번째는 이해할 수 없었습니다) 결과는 없었습니다.

올바른 시작 값을 찾는 방법에 대한 도움말을 사용할 수 있습니다. 또는 대안으로 nls 대신 사용할 수있는 다른 기능은 무엇입니까?

mydf쉽게 다시 만들고 싶을 경우 :

mydf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6)) 

1
R (실제로 일부 언어로 표시해야 함)로 표시되어 있지만 비선형 모형 적합에 적합한 시작 값을 찾는 방법은 여기서 IMO에 대한 주제에 맞도록 충분히 통계적입니다. 그것은 실제로 프로그래밍 Q가 아닙니다.
gung-모니 티 복원

답변:


14

이것은 비선형 최소 제곱 모델에서 일반적인 문제입니다. 시작 값이 최적 값과 매우 거리가 멀면 알고리즘이 최적 값 근처에서 올바르게 작동하더라도 알고리즘이 수렴하지 않을 수 있습니다.

양쪽의 로그를 가져와 선형 모형에 적합하면 및 추정값을 기울기와 절편으로 구합니다 (9.947 및 -2.011) (편집 : 자연 로그입니다)blog(a)b

이 값을 사용 와 의 시작 값을 안내하면 모든 것이 정상적으로 작동하는 것 같습니다.bab

 newMod <- nls(rev ~ a*weeks^b, data=mydf, start = list(a=exp(9.947),b=-2.011))
 predict(newMod, newdata = data.frame(weeks=c(1,2,3,4,5,6,7,8,9,10)))
 [1] 17919.2138  5280.7001  2584.0109  1556.1951  1050.1230   761.4947   580.3091   458.6027
 [9]   372.6231   309.4658

매우 도움이됩니다. 정말 감사합니다! 그래도 여기서 "a"값을 얻는 방법에 대한 질문이 있습니다. lm (log10 (rev) ~ log10 (weeks))을 실행 한 다음 "요약"기능을 사용하려고 시도했지만 동일한 "b"값을 얻는 동안 "a"값이 4.3201로 나타납니다. a = 9.947에 도착하기 위해 다르게 무엇을 했습니까?
NeonBlueHair

exp로깅되지 않은 값으로 다시 가져 왔는데 , 이는 일반 log기능을 사용했음을 나타내는 단서 입니다. 사용하는 로그 및 안티 로그와 일치하는 한 시작 값에 대해 동일한 대답을 얻을 수 있습니다. 그래서 당신은 10을 할 수 있고 나는 할 수 있고 모든 것이 동일합니다. e
Glen_b-복지 주 모니카

아, 당신 말이 맞아요 내 부분에 아마추어 실수. "로그"가 로그베이스 10을 의미하고 자연 로그에 대해 "ln"을 기대하는 수학적 표기법에 대한 생각. 설명 주셔서 감사합니다.
NeonBlueHair

1
많은 수학자 (및 많은 통계 학자)에게 죄없는 기능에 대한 비 인수적인 논쟁이 라디안으로 표시되는 것처럼, 꾸미지 않은 "로그"는 자연적인 로그입니다. [불행하게도 충돌 규칙이 혼동 될 수 있지만, 예를 들어 R을 사용하기 시작했을 때 R 이후 로그 함수 사용에 대해 두 번 생각하지 않았으며 같은 규칙을 공유했습니다.]
Glen_b -Reinstate Monica

4

시험

 newMod <- nls(rev ~ a*weeks^b, data=mydf, startlist(a=17919.2127344,b=-1.76270557120))

이 답변을 조금 확장하라는 요청을 받았습니다. 이 문제는 너무 간단해서 nls가 실패하는 것에 놀랐습니다. 그러나 실제 문제는 전체 R 접근법과 비선형 모델 피팅의 철학에 있습니다. 실제 세계에서 x는 -1과 1 사이에 있고 y와 y는 0과 1 사이에 놓입니다 (y = ax ^ b). 아마도 nls를 수렴시키기에 충분할 것입니다. 물론 Glen이 지적했듯이 해당 로그 선형 모델에 맞출 수 있습니다. 그것은 모델을 선형화하는 간단한 변환이 존재한다는 사실에 의존합니다. 종종 그렇지 않습니다. nls와 같은 R 루틴의 문제점은 모델의 매개 변수화를 지원하지 않는다는 것입니다. 이 경우 재 파라미터 화는 간단합니다. x와 y를 재조정 / 최근 조정하면됩니다. 그러나 모델에 적합하면 사용자는 원래 매개 변수와 다른 매개 변수 a와 b를 갖게됩니다. 이것들로부터 원래 것들을 계산하는 것은 간단하지만, 다른 어려움은 이러한 파라미터 추정치에 대한 추정 표준 편차를 얻는 것이 일반적으로 그렇게 간단하지 않다는 것이다. 이것은 로그 우도의 Hessian과 일부 파생물을 포함하는 델타 방법으로 수행됩니다. 비선형 모수 추정 소프트웨어는 이러한 계산을 자동으로 제공하여 모델의 매개 변수화를 쉽게 지원해야합니다. 소프트웨어가 지원해야하는 또 다른 것은 단계 개념입니다. Glen의 버전을 사용하여 모델을 1 단계로 먼저 피팅하는 것을 생각할 수 있습니다. "실제"모델은 2 단계에 적합합니다. 다른 어려움은 일반적으로 이러한 모수 추정치의 추정 표준 편차를 얻는 것이 그렇게 간단하지 않다는 것입니다. 이것은 로그 우도의 Hessian과 일부 파생물을 포함하는 델타 방법으로 수행됩니다. 비선형 모수 추정 소프트웨어는 이러한 계산을 자동으로 제공하여 모델의 매개 변수화를 쉽게 지원해야합니다. 소프트웨어가 지원해야하는 또 다른 것은 단계 개념입니다. Glen의 버전을 사용하여 모델을 1 단계로 먼저 피팅하는 것을 생각할 수 있습니다. "실제"모델은 2 단계에 적합합니다. 다른 어려움은 일반적으로 이러한 모수 추정치의 추정 표준 편차를 얻는 것이 그렇게 간단하지 않다는 것입니다. 이것은 로그 우도의 Hessian과 일부 파생물을 포함하는 델타 방법으로 수행됩니다. 비선형 모수 추정 소프트웨어는 이러한 계산을 자동으로 제공하여 모델의 매개 변수화를 쉽게 지원해야합니다. 소프트웨어가 지원해야하는 또 다른 것은 단계 개념입니다. Glen의 버전을 사용하여 모델을 1 단계로 먼저 피팅하는 것을 생각할 수 있습니다. "실제"모델은 2 단계에 적합합니다. 비선형 모수 추정 소프트웨어는 이러한 계산을 자동으로 제공하여 모델의 매개 변수화를 쉽게 지원해야합니다. 소프트웨어가 지원해야하는 또 다른 것은 단계 개념입니다. Glen의 버전을 사용하여 모델을 1 단계로 먼저 피팅하는 것을 생각할 수 있습니다. "실제"모델은 2 단계에 적합합니다. 비선형 모수 추정 소프트웨어는 이러한 계산을 자동으로 제공하여 모델의 매개 변수화를 쉽게 지원해야합니다. 소프트웨어가 지원해야하는 또 다른 것은 단계 개념입니다. Glen의 버전을 사용하여 모델을 1 단계로 먼저 피팅하는 것을 생각할 수 있습니다. "실제"모델은 2 단계에 적합합니다.

자연스럽게 단계를 지원하는 AD Model Builder를 사용하여 모델을 맞 춥니 다. 첫 번째 단계에서는 a 만 추정되었습니다. 이것은 당신의 모델을 야구장으로 가져옵니다. 두 번째 단계에서 a와 b는 해를 얻는 것으로 추정됩니다. AD Model Builder는 델타 방법을 통해 모델 매개 변수의 모든 기능에 대한 표준 편차를 자동으로 계산하여 모델의 안정적인 재 파라미터 화를 촉진합니다.


2

Levenberg-Marquardt 알고리즘이 도움이 될 수 있습니다.

modeldf <- data.frame(rev=c(17906.4, 5303.72, 2700.58 ,1696.77 ,947.53 ,362.03), weeks=c(1,2,3,4,5,6))

require(minpack.lm)
fit <- nlsLM(rev ~ a*weeks^b, data=modeldf, start = list(a=1,b=1))

require(broom)
fit_data <- augment(fit)

plot(.fitted~rev, data=fit_data)

1

내 경험상 NLR 모델의 매개 변수에 대한 시작 값을 찾는 좋은 방법은 진화 알고리즘을 사용하는 것입니다. 검색 공간에있는 무작위 추정치 (부모)의 초기 모집단 (100)에서 최고 20 (자손)을 선택하고이를 사용하여 후속 모집단에 검색을 정의하십시오. 수렴 될 때까지 반복하십시오. 그라디언트 나 헤센이 필요하지 않으며 SSE 평가 만 가능합니다. 너무 욕심이 없다면 이것은 종종 효과가 있습니다. 사람들이 자주 겪는 문제는 지역 검색 (Newton-Raphson)을 사용하여 글로벌 검색 작업을 수행한다는 것입니다. 항상 그렇듯이 현재 작업에 올바른 도구를 사용해야합니다. EA 글로벌 검색을 사용하여 Newton 로컬 검색의 시작 값을 찾은 다음이를 최소 수준으로 낮추는 것이 더 합리적입니다. 그러나 모든 것과 마찬가지로 악마는 자세하게 설명되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.