2014-12-18 1 views
2

gnls 기능을 사용하여 일부 데이터에 물류 증가 곡선을 맞추려고합니다.NLS 단계에서 최소 단계 이하로 감소 된 단계 절반 인자 오류 메시지 해결 : nlsTols 작동하지 않음

데이터 :

structure(list(Nest = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 16L, 10L, 4L, 5L, 7L, 12L, 4L, 6L, 20L, 8L, 14L, 16L, 3L, 9L, 15L, 19L, 6L, 7L, 17L, 18L, 12L, 13L, 10L, 20L, 5L, 8L, 11L, 16L, 6L, 12L, 1L, 2L, 4L, 6L, 9L, 18L, 21L, 16L, 3L, 20L), 
.Label = c("WTSN01", "WTSN02", "WTSN04", "WTSN05", "WTSN06", "WTSN07", "WTSN08", "WTSN09", "WTSN10", "WTSN12", "WTSN13", "WTSN14", "WTSN16", "WTSN18", "WTSN20", "WTSN21", "WTSN23", "WTSN24", "WTSN25", "WTSN26", "WTSN28", "WTSN29"), class = "factor"), 
Hatch = structure(c(16177, 16177, 16177, 16165, 16185, 16189, 16188, 16193, 16181, 16181, 16177, 16181, 16180, 16195, 16200, 16177, 16182, 16176, 16173, 16189, 16181, 16178, 16177, 16181, 16165, 16185, 16188, 16181, 16165, 16189, 16189, 16193, 16195, 16177, 16177, 16181, 16200, 16173, 16189, 16188, 16182, 16176, 16181, 16180, 16181, 16189, 16185, 16193, 16177, 16177, 16189, 16181, 16177, 16177, 16165, 16189, 16181, 16176, 16181, 16177, 16177, 16189), 
class = "Date"), 
Age = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 6, 7.5, 8, 8, 8, 8, 8.5, 8.5, 8.5, 9, 9, 9, 
9.5, 9.5, 9.5, 9.5, 10, 10, 10, 10, 10.5, 10.5, 11, 11, 11.5, 
11.5, 11.5, 11.5, 12, 12, 12.5, 12.5, 12.5, 12.5, 12.5, 12.5, 
12.5, 13, 13.5, 13.5), Weight = c(1.022, 1.022, 1.022, 1.022, 
1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 
1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 1.022, 
8.1, 8.5, 8.8, 8.8, 9.6, 8.6, 9.7, 11, 9.9, 11.1, 9.9, 12, 
10.5, 10.5, 7, 11.2, 11.9, 11.4, 11, 11.9, 11.2, 11.7, 9.1, 
12.3, 12.3, 13, 11.6, 13.4, 12.2, 11.1, 12.7, 11.3, 12.2, 
12.4, 11.8, 12.9, 11.2, 13.2, 11, 14.1)), 
.Names = c("Nest", "Hatch", "Age", "Weight"), 
row.names = c(NA, 62L), class = "data.frame") 

코드 : 내가 수정해야 nlsTols 0.1로 증가 몇 군데에서 읽고

Error in gnls(Weight ~ Asym/(1 + exp(b + K * Age)), data = WTS_w, start = StartLogistic): 
step halving factor reduced below minimum in NLS step 

:

StartLogistic = c(Asym = 14.2, b = 0.07, K = 0.5) 
Logistic_gnls = gnls(Weight ~ Asym/(1 + exp(b + K*Age)), data = WTS_gw, 
        start = StartLogistic) 

이 오류 메시지를주고있다 문제지만, 나는 그것을 최대 100 배까지 증가 시키려고 노력했다. 같은 오류가 발생합니다.

Logistic_gnls = gnls(Weight ~ Asym/(1 + exp(b + K*Age)), data = WTS_w, 
        start = StartLogistic, control=list(nlsTols=100)) 

나는 또한 tolerance을 시도했지만 아무 소용이 없습니다.

Logistic_gnls = gnls(Weight ~ Asym/(1 + exp(b + K*Age)), data = WTS_w, 
        start = StartLogistic, control=list(tolerance=100)) 

누구든지 해결책을 찾을 수 있습니까?

+0

일반적으로 데이터가 모델을 잘 지원하지 않는 것이 문제입니다. 다른 시작 값을 시도해 볼 수 있습니다. 데이터에 액세스하지 않고도 더 많은 조언을 제공 할 수 없습니다. – Roland

+0

Btw. 왜 상관이나 분산 구조를 전달하지 않으면'nls' 대신에'gnls'를 사용합니까? 'nls'를 사용하면'SSlogis'를 사용할 수 있습니다. – Roland

+0

여기에 data.frame을 첨부 할 수 있습니까? 나는 당신이 전체보다는 오히려 부분 집합을 필요로한다고 가정합니까? – Andrew

답변

5

데이터 범위가 매우 좁습니다. 즉 물류 기능의 위쪽으로 휘어진 부분에는 데이터가없고 영향력있는 데이터 포인트가 하나 있습니다. 다음에서는 물류 기능의 다른 매개 변수화를 사용합니다.

plot(Weight ~ Age, data=DF) 

fit <- nls(Weight ~ SSlogis(Age, Asym, xmid, scal), data=DF) 
summary(fit) 

curve(predict(fit, newdata = data.frame(Age=x)), add=TRUE) 

resulting plot

이제 계수를 사용할 수 있으며 gnls에게 전달한다 : 첫째의이 selfstarting 기능을 가진 nls 적합 할 수 있도록

library(nlme) 
Logistic_gnls <- gnls(Weight ~ Asym/(1+exp((xmid-Age)/scal)), data = DF, 
        start = coef(fit)) 
coef(Logistic_gnls) 
#  Asym  xmid  scal 
#12.908170 5.702021 2.365212 

을 따라서를, 당신은 성공적인 적합을 얻을 수 있습니다 더 나은 시작 값.

+0

고마워요 @ 롤랜드, 훌륭합니다. 데이터의 차이가있는 이유는 병아리를 조기에 처리하는 것이 안전하지 않기 때문입니다. 그러나 이것은 내가 필요한 목적을 충족시킵니다. – Andrew