2015-12-14 4 views
2
espfio<- c(0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20) 

sensibilidade <-c( 1.51, 1.49, 1.47, 1.43, 1.35, 1.19, 0.96, 0.85, 0.65, 0.64, 0.58, 0.56, 0.52, 0.52, 0.49, 0.50) 

plot(espfio,sensibilidade) 

B1 = 1 
B2 = 1 
B3 = 1 

fit1 <- nls(sensibilidade ~ B1*(exp(-exp(-B1-B2*espfio))), start=list(B1=B1,B2=B2,B3=B3)) 
summary(fit1) 

Ошибки в nlsModel (формула, СЧ, начало, WTS) (где я неправильно?): Вырожденная матрица градиента при начальном параметре оценкане Fitting нет линейного R

+1

Вы пробовали какие-либо другие исходные значения ... – Dason

+1

это выглядит как опечатка. У вас есть B1, B2, B3 в ваших начальных параметрах, но только B1 и B2 в вашей формуле: вы имели в виду 'B1 * (exp (-exp (-B2-B3 * espfio))) ??? ??? Отсутствие B3 из формулы будет означать, что производная по отношению к B3 всегда равна нулю ... Кроме того, проверьте '? SSgompertz', что, я думаю, эквивалентно вашей модели ... –

ответ

5

Даже с поправкой в комментариях он терпит неудачу с сингулярным градиентом, поэтому, чтобы заставить его сходиться, исправим B3 в 1, давая fit2, подходящий к двум параметрам, а затем используйте результат этой подгонки в качестве входного сигнала для второго соответствия - этот трехпараметрическая модель fit3 (красная линия на участке). Хотя эти модели сходятся, результат не очень похож на сюжет (см. Красную линию). Лучше было бы добавить четвертый параметр, как в модели fit4 (см. Зеленую строку на графике) - обратите внимание, что fit4 использует алгоритм "plinear", который не требует начальных значений для линейных параметров. Линейные параметры называются .lin1 и .lin2 и соответствуют новому параметру и параметру B3 в модели fit3 соответственно. Мы могли бы также рассмотреть модель Вейбулла, реализованную в R's SSweibull, как в модели fitw ниже (см. Синюю линию на графике), хотя визуально fit4 (зеленый) выглядит лучше и имеет превосходную остаточную сумму квадратов.

# fit model in question - red 
B1 <- B2 <- B3 <- 1 
fo <- sensibilidade ~ B3 * exp(-exp(-B1-B2*espfio)) 
fit2 <- nls(fo, start = list(B1 = B1, B2 = B2)) # 2 parameter model 
fit3 <- nls(fo, start = c(coef(fit2), B3 = 1)) # 3 parameter model 

plot(sensibilidade ~ espfio) 
lines(fitted(fit3) ~ espfio, col = "red") # show fit3 in red 

# fit 4 parameter Weibull - show in blue 
fitw <- nls(sensibilidade ~ SSweibull(espfio, Asym, Drop, lrc, pwr)) 
lines(fitted(fitw) ~ espfio, col = "blue") 

# 4 parameter version of fit3 - show in green 
fit4 <- nls(sensibilidade ~ cbind(1, exp(-exp(-B1-B2*espfio))), alg = "plinear", 
    start = coef(fit2)) 
lines(fitted(fit4) ~ espfio, col = "green") 

legend("topright",, c("fit3", "fitw", "fit4"), col = c("red", "blue", "green"), lty = 1) 

# residual sum of squares of each model - smaller is better 
sapply(list(fit2 = fit2, fit3 = fit3, fitw = fitw, fit4 = fit4), deviance) 
     fit2  fit3  fitw  fit4 
1.393555807 0.152539371 0.012960157 0.006555876 

screenshot

+1

Я подозреваю, что проблема с Gompertz fit вот что это 3-параметр (т.е. асимптоты равны 0 и А), а Вейбулл - 4-параметр (левая и правая асимптота могут быть отличными от нуля) –

+0

Да, хорошая точка. Я добавил 4-мерную версию модели в вопросе (fit4/green line). –

+1

Я бы добавил +1, но я уже голосовал ... –

Смежные вопросы