【问题标题】:R nls gaussian fit "singular gradient matrix at initial parameter estimates"R nls 高斯拟合“初始参数估计时的奇异梯度矩阵”
【发布时间】:2014-08-27 08:01:49
【问题描述】:

我尝试使用 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

为什么这不起作用?

【问题讨论】:

  • 首先,我不确定您是否正确使用了dnorm。它的签名是dnorm(x,mu,sigma)。您的示例令人困惑,因为您在 x 参数中有 mu 变量,在 mean 参数中有 sigma。在此示例中,方差没有发生变化。那是你的意图吗?如果是这样,那是一个非常混乱的变量名选择。

标签: r gradient gaussian nls singular


【解决方案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

【讨论】:

  • 对,错误可能是由于缺乏识别能力。确实,2*dnorm(x-a,2)==2*dnorm(x,2+a) 代表所有 a,因此在原始公式中无法确定哪些属于mu 变量以及哪些属于sigma
  • sd 是第三个参数,不是第二个。原始公式中的问题是 mu 和 sigma 都指定了平均值。
  • 是的,我意识到 dnorm 功能。我只是使用变量名称作为 OP 分配的名称。我只是想弄清楚为什么 NLS 无法解决最初编写的公式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多