2014-07-06 137 views
0

我试图用nls使用高斯曲线拟合我的数据。 因为没有工作,我试图做一个简单的例子,看看有什么不顺心:R 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 

为什么不这项工作?

+0

首先,我不知道你是否正确使用'dnorm'。它的签名是'dnorm(x,mu,sigma)'。你的例子令人困惑,因为你在x参数中有'mu'变量,在平均参数中有'sigma'。这个例子中没有变化发生变化。这是你的意图吗?如果是这样,这是一个非常令人困惑的变量名称选择。 – MrFlick

回答

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 
+0

没错,错误可能是由于缺乏识别能力。对所有'a'确实是'2 * dnorm(xa,2)== 2 * dnorm(x,2 + a)',所以不可能确定属于'mu'变量的属性和属于'sigma'的属性在原来的公式中。 – MrFlick

+0

sd是第三个参数,而不是第二个参数。原始公式中的问题是mu和sigma都指定了平均值。 –

+0

是的,我意识到对于'dnorm'函数。我正在使用变量名称作为OP分配它们。我只是想明确说明为什么NLS不能像最初所写的那样解决公式。 – MrFlick