Проблема при добавлении третьего подходящего параметра в nls

У меня возникли проблемы с добавлением в формулу еще одного подходящего параметра. Я использую nlsLM для подгонки функций и plyr подгонки пакетов в группах. Вы можете увидеть код ниже.

Кроме того, я понял из других вопросов, что есть много предложений о том, когда вы получаете сингулярную матрицу градиента при оценке начальных параметров, вы можете варьировать начальные значения или пытаться упростить свою модель, ища избыточные параметры, которые обычно вызывают проблемы.

Итак, я понимаю, что начальный параметр важен для того, чтобы не получить ошибку singular gradient matrix at initial parameter estimates. почему-is-nls- предоставление-мне-сингулярной-градиентной-матрицы-при-начальных-оценках-параметров, sing-r-to-fit-a-curve-to-a-dataset-using-a-specific-equation

Затем я начал подгонять свои данные, начав с двухчленного;

set.seed(12345)
set =rep(rep(c("1","2","3","4"),each=21),times=1)
time=rep(c(10,seq(100,900,100),seq(1000,10000,1000),20000),times=1)
value <- replicate(1,c(replicate(4,sort(10^runif(21,-6,-3),decreasing=FALSE))))

data_prep <- data.frame(time, value,set) ## this is example data set

> head(data_prep)
#    time        value set
#1     10 1.007882e-06   1
#2    100 1.269423e-06   1
#3    200 2.864973e-06   1
#4    300 3.155843e-06   1
#5    400 3.442633e-06   1
#6    500 9.446831e-06   1


sigma=17
d_step <- 1
Ps <- 0.5
f <- 1e9

formula = value~Ps*(1-exp(-2*f*time*exp(-d)))*1/(sqrt(2*pi*sigma))*exp(-(d-d_ave)^2/(2*sigma))*d_step

введите описание изображения здесь это функция распределения вероятностей функция распределения вероятностей. пс. Я принял sigma^2 за sigma. Так что нет проблем.

library(minpack.lm)# load this packed
library(plyr)    # load this package for fitting

get.coefs <- function(data_prep) {
  fit <- nlsLM(formula ,
               data=data_prep,start=c(d_ave=43,d=42),trace=T,control = nls.lm.control(maxiter=100))
}

fit <- dlply(data_prep, c("set"), .fun = get.coefs)   # Fit data grouped by "set"

#    > fit
#    $`1`
#    Nonlinear regression model
#      model: value ~ Ps * (1 - exp(-2 * f * time * exp(-d))) * (1/(sqrt(2 #*   pi * sigma) * exp(-(d - d_ave)^2/(2 * sigma))) * d_step)
#       data: data_prep
#    d_ave     d 
#    55.71 41.34 
#     residual sum-of-squares: 1.249e-07

это результат с подгонкой линии

введите здесь описание изображения

Хорошо, когда я делаю этот процесс с d_ave и d, я могу сделать примерку. Однако, когда я хотел добавить параметр sigma в качестве подходящего параметра;

 get.coefs <- function(data_prep) {
      fit <- nlsLM(formula ,
                   data=data_prep,start=c(d_ave=43,d=42,sigma=17),trace=T,control = nls.lm.control(maxiter=100))
    }

fit <- dlply(data_prep, c("set"), .fun = get.coefs)   # Fit data grouped by "set"

Я получаю две ошибки, и первая,

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

и второй,

In addition: Warning messages:
1: In sqrt(2 * pi * sigma) : NaNs produced
2: In sqrt(2 * pi * sigma) : NaNs produced
3: In sqrt(2 * pi * sigma) : NaNs produced
4: In sqrt(2 * pi * sigma) : NaNs produced

Я хочу добавить еще значение Ps для параметра подгонки позже, чтобы увидеть, как оно сходится через подгонку. Но даже для трехчленной подгонки не сходится и дает ошибки.

Любой совет или ответ будут оценены. Может ли кто-нибудь указать, что я делаю неправильно? Спасибо за вашу помощь


person Alexander    schedule 28.04.2016    source источник
comment
Это довольно сложная модель, и у вас есть довольно ограниченные данные. Я был бы удивлен, если бы вы успешно подошли. Модель кажется пиком, наложенным на кривую насыщения, и эти функции должны быть суперочевидны в ваших данных, чтобы упростить подгонку.   -  person Roland    schedule 28.04.2016
comment
@Roland Не могли бы вы немного подробнее остановиться на этом вопросе? Я не мог уловить вашу мысль :)   -  person Alexander    schedule 28.04.2016
comment
Дело в том, что сложные модели трудно подобрать. Чем больше, тем меньше данных поддерживает модель, пока это не станет невозможным. Вы могли бы соответствовать этому, если бы у вас были очень хорошие начальные значения.   -  person Roland    schedule 28.04.2016
comment
@ Роланд, твое предложение сделать модель менее сложной? Это то, что ты имеешь в виду. На самом деле модель probability distribution function. Я добавил изображение модели к моему вопросу.   -  person Alexander    schedule 28.04.2016
comment
Да, я узнал нормальное распределение. Но я не понимаю, я ищу эту раздачу на каждом ....   -  person Roland    schedule 28.04.2016
comment
Попробуйте использовать nlxb из пакета nlmrt вместо nlsLM.   -  person G. Grothendieck    schedule 28.04.2016
comment
@Roland Дорогой Роланд, я наконец-то исправил свою модель, чтобы она соответствовала @G. Гротендик Я использовал nlxb из nlmrt. Я перенес свой вопрос на следующий этап. Пожалуйста, проверьте это здесь ссылка   -  person Alexander    schedule 09.05.2016
comment
@ G.Grothendieck, не могли бы вы проверить мой новый вопрос, связанный с этим постом [ссылка] stackoverflow.com/questions/37110555/   -  person Alexander    schedule 09.05.2016