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

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


person user1402050    schedule 06.07.2014    source источник
comment
Прежде всего, я не уверен, что вы правильно используете dnorm. Его подпись dnorm(x,mu,sigma). Ваш пример сбивает с толку, потому что у вас есть переменная mu в параметре x и sigma в среднем параметре. В этом примере изменения дисперсии не происходит. Это то, что вы намеревались? Если это так, это очень запутанный выбор имени переменной.   -  person MrFlick    schedule 07.07.2014


Ответы (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
person G. Grothendieck    schedule 06.07.2014
comment
Верно, ошибка, скорее всего, была из-за отсутствия возможности идентификации. Это правда, что 2*dnorm(x-a,2)==2*dnorm(x,2+a) для всех a, поэтому невозможно определить, что принадлежит переменной mu, а что принадлежит sigma в исходной формулировке. - person MrFlick; 07.07.2014
comment
sd — это третий параметр, а не второй. Проблема в исходной формуле заключается в том, что и мю, и сигма указывали среднее значение. - person G. Grothendieck; 07.07.2014
comment
Да, я понимаю, что для функции dnorm. Я просто использовал имена переменных, назначенные им OP. Я просто пытался прояснить, почему NLS не смог решить формулу в том виде, в каком она была написана изначально. - person MrFlick; 07.07.2014