拟合非线性函数数据:奇异梯度问题

时间:2016-12-11 15:26:16

标签: r

我正在尝试将数据拟合到非线性模型,但我得到的是#34;奇异渐变"构建模型时的消息。

这是数据:

    > astrodata
    temperature intensity
    1      277.15       121
    2      282.15       131
    3      287.15       153
    4      292.15       202
    5      297.15       311

功能:

    y=   a * exp(-b * temperature) + c 

到目前为止我做了什么:

    > temperature <- astrodata$temperature
    temperature
    [1] 277.15 282.15 287.15 292.15 297.15
    >  intensity <- astrodata$intensity
    > c.0 <- min(temperature)*0.5
    > c.0 <- min(intensity)*0.5
    > model.0 <- lm(log(intensity - c.0) ~ temperature, data=astrodata)
    > start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
    > 
    > model <- nls(intensity ~ a * exp(-b * temperature) + c, data = astrodata, start = start)
    Error in nls(intensity ~ a * exp(b * temperature) + c, data = astrodata,  : 
    singular gradient   

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

该模型在ac中呈线性,在b中仅为非线性。这表明我们尝试"plinear"算法。它的优点是只有非线性参数需要起始值。

请注意,该算法的公式规范不同,并且RHS是一个矩阵,每个线性参数有一列。

model <- nls(intensity ~ cbind(exp(-b * temperature), 1), data = astrodata, 
   start = start["b"], algorithm = "plinear")

,并提供:

> model
Nonlinear regression model
  model: intensity ~ cbind(exp(-b * temperature), 1)
   data: astrodata
         b      .lin1      .lin2 
-1.598e-01  4.728e-19  1.129e+02 
 residual sum-of-squares: 0.003853

Number of iterations to convergence: 5 
Achieved convergence tolerance: 2.594e-07

此外:

plot(intensity ~ temperature, astrodata)
lines(fitted(model) ~ temperature, astrodata)

screenshot

注意:根据以下评论,您实际上并不需要nls模型,只需使用geom_line

就足够了
p <- ggplot(astrodata, aes(temperature, intensity)) + geom_point()
p + geom_line()

或splines:

p + geom_line(data = data.frame(spline(temperature, intensity)), aes(x, y))

答案 1 :(得分:0)

您的数据不够多。

nls使用least squares工作。这是模型和数据点之间距离的度量。如果没有距离,nls就不起作用了。您的模型完全符合数据,这称为&#34; zero-residual&#34;数据。因此

  

初始参数估计时的奇异梯度矩阵。

这是一个过于复杂的错误消息,仅仅意味着&#34;没有错误要衡量。&#34;

您只有5个(x,y)个组合,因此使用非线性分析几乎可以保证这个错误。使用不同的数据或更多数据。

答案 2 :(得分:0)

一种可能性是将每个数据点加倍,为加倍数据添加非常微小的变化,如下所示:

temperature intensity
1      277.15       121
2      282.15       131
3      287.15       153
4      292.15       202
5      297.15       311
11      277.15000001       121.000001
12      282.15000001       131.000001
13      287.15000001       153.000001
14      292.15000001       202.000001
15      297.15000001       311.000001

在原始数据集中,每个点实际上具有相同的权重1.0,并且在“加倍”数据集中,每个点实际上具有相同的权重2.0,因此您获得相同的拟合参数值但没有错误。 / p>