R nls подгонка по гауссу «матрица сингулярного градиента при начальных оценках параметров»

#r #gradient #gaussian #nls #singular

#r #градиент #гауссовская #nls #сингулярная

Вопрос:

Я попытался подогнать свои данные под гауссову кривую, используя nls. Поскольку это не сработало, я попытался привести простой пример, чтобы увидеть, что идет не так:

 >x=seq(-4,4,0.1)
>y=2*dnorm(x-0.4,2) runif( length(x) , min = -0.01, max = 0.01)
>df=data.frame(x,y)
>m <- nls(y ~ k*dnorm(x-mu,sigma), data = df, start = list(k=2,mu=0.4,sigma=2))

Error in nlsModel(formula, mf, start, wts, upper) :   singular gradient 
matrix at initial parameter estimates
> m <- nls(y ~ k*dnorm(x-mu,sigma), data = df, start == list(k=1.5,mu=0.4,sigma=2))

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

Почему это не работает?

Комментарии:

1. Прежде всего, я не уверен, что вы используете dnorm правильно. Это подпись dnorm(x,mu,sigma) . Ваш пример сбивает с толку, потому что у вас есть mu переменная в параметре x и sigma в параметре mean. В этом примере не происходит изменения дисперсии. Это то, что вы имели в виду? Если это так, то это очень запутанный выбор имени переменной.

Ответ №1:

Сначала, пожалуйста, используйте set.seed , чтобы сделать ваш пример воспроизводимым. Во-вторых, я думаю, вы имели в виду, dnorm(x, 0.4, 2) а не dnorm(x-0.4, 2) . Это не одно и то же, поскольку в случае x-0.4 среднее значение x-0.4 равно 2 , а в другом случае стандартное отклонение равно 2 . Если мы внесем это изменение, то оно сработает:

 set.seed(123)
x=seq(-4,4,0.1)
y=2*dnorm(x, 0.4, 2) runif( length(x) , min = -0.01, max = 0.01)
df=data.frame(x,y)
nls(y ~ k*dnorm(x, mu,sigma), data = df, start = list(k=2,mu=0.4,sigma=2))
  

предоставление:

 Nonlinear regression model
  model: y ~ k * dnorm(x, mu, sigma)
   data: df
     k     mu  sigma 
2.0034 0.3914 2.0135 
 residual sum-of-squares: 0.002434

Number of iterations to convergence: 2 
Achieved convergence tolerance: 5.377e-06
  

Комментарии:

1. Верно, ошибка, вероятно, была вызвана отсутствием возможности идентификации. Это правда, что 2*dnorm(x-a,2)==2*dnorm(x,2 a) для всех a , поэтому невозможно определить, что принадлежит mu переменной, а что — sigma в исходной формулировке.

2. sd является третьим параметром, а не вторым. Проблема в исходной формуле заключается в том, что и mu, и sigma указывали среднее значение.

3. Да, я понимаю, что для dnorm функции. Я просто использовал имена переменных так, как их назначил OP. Я просто пытался прояснить, почему NLS не смог решить формулу, как было написано изначально.