У меня возникли проблемы с добавлением в формулу еще одного подходящего параметра. Я использую 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
для параметра подгонки позже, чтобы увидеть, как оно сходится через подгонку. Но даже для трехчленной подгонки не сходится и дает ошибки.
Любой совет или ответ будут оценены. Может ли кто-нибудь указать, что я делаю неправильно? Спасибо за вашу помощь
probability distribution function
. Я добавил изображение модели к моему вопросу. - person Alexander   schedule 28.04.2016nlxb
изnlmrt
. Я перенес свой вопрос на следующий этап. Пожалуйста, проверьте это здесь ссылка - person Alexander   schedule 09.05.2016